/ Hex Artifact Content
Login

Artifact 74655dc71c61130c7328e3cdee3c86b86ce8ce0f:


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 39 39 20 32 30 30 39 2f 30  c,v 1.699 2009/0
0190: 37 2f 32 32 20 31 34 3a 30 38 3a 31 34 20 64 61  7/22 14:08:14 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 31  ite3BtreeTrace=1
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 0a 23 69  ;.}.#endif....#i
07c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
07d0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
07e0: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63  /*.  ** The func
07f0: 74 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65  tions queryShare
0800: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0810: 29 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ), setSharedCach
0820: 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20  eTableLock(),.  
0830: 2a 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53  ** and clearAllS
0840: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0850: 6f 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69  ocks().  ** mani
0860: 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69  pulate entries i
0870: 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  n the BtShared.p
0880: 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74  Lock linked list
0890: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20   used to store. 
08a0: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
08b0: 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63   table level loc
08c0: 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61  ks. If the libra
08d0: 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  ry is compiled w
08e0: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61  ith the.  ** sha
08f0: 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72  red-cache featur
0900: 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  e disabled, then
0910: 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65   there is only e
0920: 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a  ver one user.  *
0930: 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72  * of each BtShar
0940: 65 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ed structure and
0950: 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67   so this locking
0960: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
0970: 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69  y. .  ** So defi
0980: 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61  ne the lock rela
0990: 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73  ted functions as
09a0: 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20   no-ops..  */.  
09b0: 23 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61  #define querySha
09c0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
09d0: 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f  k(a,b,c) SQLITE_
09e0: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74  OK.  #define set
09f0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
0a00: 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49  Lock(a,b,c) SQLI
0a10: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
0a20: 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
0a30: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29  cheTableLocks(a)
0a40: 0a 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67  .  #define downg
0a50: 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
0a60: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0a70: 20 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61    #define hasSha
0a80: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0a90: 6b 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23  k(a,b,c,d) 1.  #
0aa0: 64 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f  define hasReadCo
0ab0: 6e 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a  nflicts(a, b) 0.
0ac0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
0ad0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0ae0: 45 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66  ED_CACHE..#ifdef
0af0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
0b00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
0b10: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0b20: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0b30: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0b40: 20 49 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68   It checks.** th
0b50: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  at connection p 
0b60: 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75 69 72  holds the requir
0b70: 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65 61 64  ed locks to read
0b80: 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74 68 65   or write to the
0b90: 20 0a 2a 2a 20 62 2d 74 72 65 65 20 77 69 74 68   .** b-tree with
0ba0: 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74   root page iRoot
0bb0: 2e 20 49 66 20 73 6f 2c 20 74 72 75 65 20 69 73  . If so, true is
0bc0: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
0bd0: 77 69 73 65 2c 20 66 61 6c 73 65 2e 20 0a 2a 2a  wise, false. .**
0be0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   For example, wh
0bf0: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20  en writing to a 
0c00: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 77 69 74  table b-tree wit
0c10: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f  h root-page iRoo
0c20: 74 20 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20  t via .** Btree 
0c30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65  connection pBtre
0c40: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65  e:.**.**    asse
0c50: 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
0c60: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72  heTableLock(pBtr
0c70: 65 65 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52  ee, iRoot, 0, WR
0c80: 49 54 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a  ITE_LOCK) );.**.
0c90: 2a 2a 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20  ** When writing 
0ca0: 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  to an index b-tr
0cb0: 65 65 20 74 68 61 74 20 72 65 73 69 64 65 73 20  ee that resides 
0cc0: 69 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61  in a sharable da
0cd0: 74 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20  tabase, the .** 
0ce0: 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61  caller should ha
0cf0: 76 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65  ve first obtaine
0d00: 64 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79  d a lock specify
0d10: 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ing the root pag
0d20: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72  e of.** the corr
0d30: 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20  esponding table 
0d40: 62 2d 74 72 65 65 2e 20 54 68 69 73 20 6d 61 6b  b-tree. This mak
0d50: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
0d60: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
0d70: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
0d80: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
0d90: 62 2d 74 72 65 65 20 61 73 20 61 20 73 65 70 61  b-tree as a sepa
0da0: 72 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20  rate structure. 
0db0: 54 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  To determine.** 
0dc0: 74 68 65 20 74 61 62 6c 65 20 62 2d 74 72 65 65  the table b-tree
0dd0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
0de0: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72  o the index b-tr
0df0: 65 65 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ee being written
0e00: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
0e10: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
0e20: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
0e30: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
0e40: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
0e50: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 62 2d 74   lock on the b-t
0e60: 72 65 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ree rooted at pa
0e70: 67 65 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61  ge iRoot, the ca
0e80: 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64  ller may.** hold
0e90: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
0ea0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
0eb0: 65 20 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e  e (root page 1).
0ec0: 20 54 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a   This is also.**
0ed0: 20 61 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a   acceptable..*/.
0ee0: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 53 68  static int hasSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  ck(.  Btree *pBt
0f10: 72 65 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ree,         /* 
0f20: 48 61 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74  Handle that must
0f30: 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   hold lock */.  
0f40: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20  Pgno iRoot,     
0f50: 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
0f60: 61 67 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f  age of b-tree */
0f70: 0a 20 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20  .  int isIndex, 
0f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
0f90: 65 20 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68  e if iRoot is th
0fa0: 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64  e root of an ind
0fb0: 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69  ex b-tree */.  i
0fc0: 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20  nt eLockType    
0fd0: 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65        /* Require
0fe0: 64 20 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41  d lock type (REA
0ff0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
1000: 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63  LOCK) */.){.  Sc
1010: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
1020: 28 53 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65  (Schema *)pBtree
1030: 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a  ->pBt->pSchema;.
1040: 20 20 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b    Pgno iTab = 0;
1050: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
1060: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1070: 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 20  b-tree database 
1080: 69 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65  is not shareable
1090: 2c 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65  , or if the clie
10a0: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20  nt is reading.  
10b0: 2a 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72  ** and has the r
10c0: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
10d0: 66 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e  flag set, then n
10e0: 6f 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72  o lock is requir
10f0: 65 64 2e 20 0a 20 20 2a 2a 20 49 6e 20 74 68 65  ed. .  ** In the
1100: 73 65 20 63 61 73 65 73 20 72 65 74 75 72 6e 20  se cases return 
1110: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1120: 2e 20 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74  .  If the client
1130: 20 69 73 20 72 65 61 64 69 6e 67 20 0a 20 20 2a   is reading .  *
1140: 2a 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20  * or writing an 
1150: 69 6e 64 65 78 20 62 2d 74 72 65 65 2c 20 62 75  index b-tree, bu
1160: 74 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  t the schema is 
1170: 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65 6e  not loaded, then
1180: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75   return.  ** tru
1190: 65 20 61 6c 73 6f 2e 20 49 6e 20 74 68 69 73 20  e also. In this 
11a0: 63 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 69 73  case the lock is
11b0: 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20 69   required, but i
11c0: 74 20 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75  t is too difficu
11d0: 6c 74 0a 20 20 2a 2a 20 74 6f 20 63 68 65 63 6b  lt.  ** to check
11e0: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 61   if the client a
11f0: 63 74 75 61 6c 6c 79 20 68 6f 6c 64 73 20 69 74  ctually holds it
1200: 2e 20 54 68 69 73 20 64 6f 65 73 6e 27 74 20 68  . This doesn't h
1210: 61 70 70 65 6e 20 76 65 72 79 0a 20 20 2a 2a 20  appen very.  ** 
1220: 6f 66 74 65 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  often.  */.  if(
1230: 20 28 70 42 74 72 65 65 2d 3e 73 68 61 72 61 62   (pBtree->sharab
1240: 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 65 4c  le==0).   || (eL
1250: 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44 5f 4c 4f  ockType==READ_LO
1260: 43 4b 20 26 26 20 28 70 42 74 72 65 65 2d 3e 64  CK && (pBtree->d
1270: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1280: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
1290: 64 29 29 0a 20 20 20 7c 7c 20 28 69 73 49 6e 64  d)).   || (isInd
12a0: 65 78 20 26 26 20 28 21 70 53 63 68 65 6d 61 20  ex && (!pSchema 
12b0: 7c 7c 20 28 70 53 63 68 65 6d 61 2d 3e 66 6c 61  || (pSchema->fla
12c0: 67 73 26 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  gs&DB_SchemaLoad
12d0: 65 64 29 3d 3d 30 20 29 29 0a 20 20 29 7b 0a 20  ed)==0 )).  ){. 
12e0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
12f0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1300: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
1310: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
1320: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
1330: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
1340: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
1350: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1360: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1370: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1380: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1390: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
13a0: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
13b0: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
13c0: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
13d0: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
13e0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
13f0: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
1400: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
1410: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
1420: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
1430: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
1440: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
1450: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1460: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1470: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1480: 74 6e 75 6d 3d 3d 69 52 6f 6f 74 20 29 7b 0a 09  tnum==iRoot ){..
1490: 69 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61  iTab = pIdx->pTa
14a0: 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  ble->tnum;.     
14b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
14c0: 7b 0a 20 20 20 20 69 54 61 62 20 3d 20 69 52 6f  {.    iTab = iRo
14d0: 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ot;.  }..  /* Se
14e0: 61 72 63 68 20 66 6f 72 20 74 68 65 20 72 65 71  arch for the req
14f0: 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68  uired lock. Eith
1500: 65 72 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  er a write-lock 
1510: 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  on root-page iTa
1520: 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72 69 74 65  b, a .  ** write
1530: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68  -lock on the sch
1540: 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72 20 28 69  ema table, or (i
1550: 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20  f the client is 
1560: 72 65 61 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20  reading) a.  ** 
1570: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61  read-lock on iTa
1580: 62 20 77 69 6c 6c 20 73 75 66 66 69 63 65 2e 20  b will suffice. 
1590: 52 65 74 75 72 6e 20 31 20 69 66 20 61 6e 79 20  Return 1 if any 
15a0: 6f 66 20 74 68 65 73 65 20 61 72 65 20 66 6f 75  of these are fou
15b0: 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c  nd.  */.  for(pL
15c0: 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  ock=pBtree->pBt-
15d0: 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70  >pLock; pLock; p
15e0: 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78  Lock=pLock->pNex
15f0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63  t){.    if( pLoc
1600: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74 72 65  k->pBtree==pBtre
1610: 65 20 0a 20 20 20 20 20 26 26 20 28 70 4c 6f 63  e .     && (pLoc
1620: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20  k->iTable==iTab 
1630: 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  || (pLock->eLock
1640: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20  ==WRITE_LOCK && 
1650: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31  pLock->iTable==1
1660: 29 29 0a 20 20 20 20 20 26 26 20 70 4c 6f 63 6b  )).     && pLock
1670: 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79  ->eLock>=eLockTy
1680: 70 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  pe .    ){.     
1690: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
16a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65  .  }..  /* Faile
16b0: 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 72 65  d to find the re
16c0: 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  quired lock. */.
16d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
16e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
16f0: 6f 6e 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20  on is also used 
1700: 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
1710: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  t() statements o
1720: 6e 6c 79 2e 20 49 74 20 0a 2a 2a 20 72 65 74 75  nly. It .** retu
1730: 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 72  rns true if ther
1740: 65 20 65 78 69 73 74 20 6f 6e 65 20 6f 72 20 6d  e exist one or m
1750: 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  ore cursors open
1760: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a 2a   on the table .*
1770: 2a 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67 65  * with root page
1780: 20 69 52 6f 6f 74 20 74 68 61 74 20 64 6f 20 6e   iRoot that do n
1790: 6f 74 20 62 65 6c 6f 6e 67 20 74 6f 20 65 69 74  ot belong to eit
17a0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  her connection p
17b0: 42 74 72 65 65 20 0a 2a 2a 20 6f 72 20 73 6f 6d  Btree .** or som
17c0: 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
17d0: 6f 6e 20 74 68 61 74 20 68 61 73 20 74 68 65 20  on that has the 
17e0: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
17f0: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a   flag set..**.**
1800: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1810: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1820: 70 61 67 65 20 69 52 6f 6f 74 3a 0a 2a 2a 0a 2a  page iRoot:.**.*
1830: 2a 20 20 20 20 61 73 73 65 72 74 28 20 21 68 61  *    assert( !ha
1840: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
1850: 42 74 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b  Btree, iRoot) );
1860: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
1870: 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
1880: 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50  Btree *pBtree, P
1890: 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74  gno iRoot){.  Bt
18a0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72  Cursor *p;.  for
18b0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
18c0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
18d0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
18e0: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
18f0: 6f 6f 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e  oot .     && p->
1900: 70 42 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20  pBtree!=pBtree. 
1910: 20 20 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42      && 0==(p->pB
1920: 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  tree->db->flags 
1930: 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  & SQLITE_ReadUnc
1940: 6f 6d 6d 69 74 74 65 64 29 0a 20 20 20 20 29 7b  ommitted).    ){
1950: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1960: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1970: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1980: 20 20 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c     /* #ifdef SQL
1990: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  ITE_DEBUG */../*
19a0: 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65  .** Query to see
19b0: 20 69 66 20 62 74 72 65 65 20 68 61 6e 64 6c 65   if btree handle
19c0: 20 70 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20   p may obtain a 
19d0: 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f  lock of type eLo
19e0: 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43  ck .** (READ_LOC
19f0: 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29  K or WRITE_LOCK)
1a00: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69   on the table wi
1a10: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
1a20: 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  b. Return.** SQL
1a30: 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f  ITE_OK if the lo
1a40: 63 6b 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e  ck may be obtain
1a50: 65 64 20 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a  ed (by calling.*
1a60: 2a 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  * setSharedCache
1a70: 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72  TableLock()), or
1a80: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
1a90: 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
1aa0: 20 69 6e 74 20 71 75 65 72 79 53 68 61 72 65 64   int queryShared
1ab0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
1ac0: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
1ad0: 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20  ab, u8 eLock){. 
1ae0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1af0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
1b00: 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73  k *pIter;..  ass
1b10: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1b20: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1b30: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
1b40: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
1b50: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1b60: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
1b70: 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ->db!=0 );.  ass
1b80: 65 72 74 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c  ert( !(p->db->fl
1b90: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
1ba0: 6e 63 6f 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f  ncommitted)||eLo
1bb0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c  ck==WRITE_LOCK||
1bc0: 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20  iTab==1 );.  .  
1bd0: 2f 2a 20 49 66 20 72 65 71 75 65 73 74 69 6e 67  /* If requesting
1be0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74   a write-lock, t
1bf0: 68 65 6e 20 74 68 65 20 42 74 72 65 65 20 6d 75  hen the Btree mu
1c00: 73 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  st have an open 
1c10: 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73  write.  ** trans
1c20: 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66  action on this f
1c30: 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75  ile. And, obviou
1c40: 73 6c 79 2c 20 66 6f 72 20 74 68 69 73 20 74 6f  sly, for this to
1c50: 20 62 65 20 73 6f 20 74 68 65 72 65 20 0a 20 20   be so there .  
1c60: 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  ** must be an op
1c70: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
1c80: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65  tion on the file
1c90: 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20   itself..  */.  
1ca0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
1cb0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d  EAD_LOCK || (p==
1cc0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 26 26 20  pBt->pWriter && 
1cd0: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1ce0: 53 5f 57 52 49 54 45 29 20 29 3b 0a 20 20 61 73  S_WRITE) );.  as
1cf0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
1d00: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69  D_LOCK || pBt->i
1d10: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1d20: 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a  ANS_WRITE );.  .
1d30: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
1d40: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
1d50: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
1d60: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
1d70: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
1d80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d90: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
1da0: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
1db0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
1dc0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
1dd0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
1de0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
1df0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
1e00: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
1e10: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
1e20: 26 26 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73  && pBt->isExclus
1e30: 69 76 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ive ){.    sqlit
1e40: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
1e50: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e  ked(p->db, pBt->
1e60: 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20  pWriter->db);.  
1e70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e80: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
1e90: 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70  HE;.  }..  for(p
1ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
1eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
1ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
1ed0: 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f   /* The conditio
1ee0: 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21  n (pIter->eLock!
1ef0: 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66  =eLock) in the f
1f00: 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29  ollowing if(...)
1f10: 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65   .    ** stateme
1f20: 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69  nt is a simplifi
1f30: 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a  cation of:.    *
1f40: 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63  *.    **   (eLoc
1f50: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c  k==WRITE_LOCK ||
1f60: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57   pIter->eLock==W
1f70: 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a  RITE_LOCK).    *
1f80: 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77  *.    ** since w
1f90: 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65  e know that if e
1fa0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
1fb0: 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20  , then no other 
1fc0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a  connection.    *
1fd0: 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49  * may hold a WRI
1fe0: 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74  TE_LOCK on any t
1ff0: 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c  able in this fil
2000: 65 20 28 73 69 6e 63 65 20 74 68 65 72 65 20 63  e (since there c
2010: 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62  an.    ** only b
2020: 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65  e a single write
2030: 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  r)..    */.    a
2040: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c  ssert( pIter->eL
2050: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2060: 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  | pIter->eLock==
2070: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  WRITE_LOCK );.  
2080: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2090: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  =READ_LOCK || pI
20a0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c  ter->pBtree==p |
20b0: 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  | pIter->eLock==
20c0: 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  READ_LOCK);.    
20d0: 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
20e0: 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69  e!=p && pIter->i
20f0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70  Table==iTab && p
2100: 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f  Iter->eLock!=eLo
2110: 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ck ){.      sqli
2120: 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
2130: 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65  cked(p->db, pIte
2140: 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a  r->pBtree->db);.
2150: 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d        if( eLock=
2160: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20  =WRITE_LOCK ){. 
2170: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2180: 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  ==pBt->pWriter )
2190: 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  ;.        pBt->i
21a0: 73 50 65 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20  sPending = 1;.  
21b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
21c0: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
21d0: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
21e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
21f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2250: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
2260: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
2270: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
2280: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
2290: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
22a0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
22b0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
22c0: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
22d0: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
22e0: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
22f0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2300: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2310: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2320: 20 73 70 65 63 69 66 69 65 64 20 62 2d 74 72 65   specified b-tre
2330: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
2340: 64 6c 65 20 69 73 20 63 6f 6e 6e 65 63 74 65 64  dle is connected
2350: 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a   to a sharable.*
2360: 2a 20 20 20 20 20 20 20 62 2d 74 72 65 65 20 64  *       b-tree d
2370: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
2380: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
2390: 68 61 72 61 62 6c 65 29 20 66 6c 61 67 20 73 65  harable) flag se
23a0: 74 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  t, and.**.**   (
23b0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 62 2d 74 72  b) No other b-tr
23c0: 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  ee connection ha
23d0: 6e 64 6c 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63  ndle holds a loc
23e0: 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  k that conflicts
23f0: 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74  .**       with t
2400: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
2410: 6b 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61  k (i.e. querySha
2420: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2430: 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20  k() has.**      
2440: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2450: 6c 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65  lled and returne
2460: 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a  d SQLITE_OK)..**
2470: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2480: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2490: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
24a0: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
24b0: 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73  ITE_NOMEM .** is
24c0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
24d0: 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61  alloc attempt fa
24e0: 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
24f0: 6e 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68  nt setSharedCach
2500: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
2510: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
2520: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
2530: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2540: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
2550: 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  *pLock = 0;.  Bt
2560: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
2570: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2580: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2590: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
25a0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
25b0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
25c0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
25d0: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20  ( p->db!=0 );.. 
25e0: 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e   /* A connection
25f0: 20 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75   with the read-u
2600: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
2610: 73 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74  set will never t
2620: 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69  ry to.  ** obtai
2630: 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73  n a read-lock us
2640: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
2650: 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64  n. The only read
2660: 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20  -lock obtained. 
2670: 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74   ** by a connect
2680: 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f  ion in read-unco
2690: 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20  mmitted mode is 
26a0: 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  on the sqlite_ma
26b0: 73 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65  ster .  ** table
26c0: 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20  , and that lock 
26d0: 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42  is obtained in B
26e0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29  treeBeginTrans()
26f0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2700: 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  0==(p->db->flags
2710: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
2720: 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65 4c 6f 63  mmitted) || eLoc
2730: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2740: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2750: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
2760: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   be called on a 
2770: 73 68 61 72 61 62 6c 65 20 62 2d 74 72 65 65 20  sharable b-tree 
2780: 61 66 74 65 72 20 69 74 20 0a 20 20 2a 2a 20 68  after it .  ** h
2790: 61 73 20 62 65 65 6e 20 64 65 74 65 72 6d 69 6e  as been determin
27a0: 65 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ed that no other
27b0: 20 62 2d 74 72 65 65 20 68 6f 6c 64 73 20 61 20   b-tree holds a 
27c0: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b  conflicting lock
27d0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
27e0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 3b 0a 20  p->sharable );. 
27f0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
2800: 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72 65 64 43  OK==querySharedC
2810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
2820: 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20   iTable, eLock) 
2830: 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73  );..  /* First s
2840: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
2850: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
2860: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
2870: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
2880: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
2890: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
28a0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
28b0: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
28c0: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
28d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
28e0: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
28f0: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
2900: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2910: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
2920: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
2930: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
2940: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
2950: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
2960: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
2970: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
2980: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
2990: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
29a0: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
29b0: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
29c0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
29d0: 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  ro(sizeof(BtLock
29e0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
29f0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
2a00: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2a10: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
2a20: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
2a30: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
2a40: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
2a50: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
2a60: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
2a70: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
2a80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2a90: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
2aa0: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
2ab0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
2ac0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
2ad0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
2ae0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
2af0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
2b00: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
2b10: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
2b20: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
2b30: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
2b40: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
2b50: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
2b60: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
2b70: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
2b80: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
2b90: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
2ba0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
2bb0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
2bc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2bd0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2be0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2bf0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2c00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c10: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2c20: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
2c30: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
2c40: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
2c50: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
2c60: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
2c70: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
2c80: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
2c90: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
2ca0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2cb0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2cc0: 61 74 20 68 61 6e 64 6c 65 20 70 20 68 61 73 20  at handle p has 
2cd0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
2ce0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
2cf0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
2d00: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
2d10: 42 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69  BtShared.isPendi
2d20: 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  ng variable.** m
2d30: 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c  ay be incorrectl
2d40: 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  y cleared..*/.st
2d50: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41  atic void clearA
2d60: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
2d70: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
2d80: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2d90: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
2da0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
2db0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
2dc0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2dd0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2de0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2df0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
2e00: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61  ==*ppIter );.  a
2e10: 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
2e20: 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  s>0 );..  while(
2e30: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
2e40: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
2e50: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
2e60: 65 72 74 28 20 70 42 74 2d 3e 69 73 45 78 63 6c  ert( pBt->isExcl
2e70: 75 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d  usive==0 || pBt-
2e80: 3e 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d  >pWriter==pLock-
2e90: 3e 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61  >pBtree );.    a
2ea0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42  ssert( pLock->pB
2eb0: 74 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70  tree->inTrans>=p
2ec0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20  Lock->eLock );. 
2ed0: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
2ee0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
2ef0: 20 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b   *ppIter = pLock
2f00: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61  ->pNext;.      a
2f10: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54  ssert( pLock->iT
2f20: 61 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b  able!=1 || pLock
2f30: 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20  ==&p->lock );.  
2f40: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69      if( pLock->i
2f50: 54 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20  Table!=1 ){.    
2f60: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2f70: 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d  (pLock);.      }
2f80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f90: 20 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63    ppIter = &pLoc
2fa0: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  k->pNext;.    }.
2fb0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
2fc0: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30  Bt->isPending==0
2fd0: 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72   || pBt->pWriter
2fe0: 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   );.  if( pBt->p
2ff0: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3000: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3010: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78  0;.    pBt->isEx
3020: 63 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20  clusive = 0;.   
3030: 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20   pBt->isPending 
3040: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
3050: 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
3060: 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20  on==2 ){.    /* 
3070: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3080: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 63 6f 6e   called when con
3090: 6e 65 63 74 69 6f 6e 20 70 20 69 73 20 63 6f 6e  nection p is con
30a0: 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20  cluding its .   
30b0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e   ** transaction.
30c0: 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e   If there curren
30d0: 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69  tly exists a wri
30e0: 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f  ter, and p is no
30f0: 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72  t.    ** that wr
3100: 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e  iter, then the n
3110: 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68  umber of locks h
3120: 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
3130: 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  ns other.    ** 
3140: 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20  than the writer 
3150: 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f  must be about to
3160: 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49   drop to zero. I
3170: 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20  n this case.    
3180: 2a 2a 20 73 65 74 20 74 68 65 20 69 73 50 65 6e  ** set the isPen
3190: 64 69 6e 67 20 66 6c 61 67 20 74 6f 20 30 2e 0a  ding flag to 0..
31a0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
31b0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63 75   there is not cu
31c0: 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65 72  rrently a writer
31d0: 2c 20 74 68 65 6e 20 42 74 53 68 61 72 65 64 2e  , then BtShared.
31e0: 69 73 50 65 6e 64 69 6e 67 20 6d 75 73 74 0a 20  isPending must. 
31f0: 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c     ** be zero al
3200: 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20 6e  ready. So this n
3210: 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72 6d  ext line is harm
3220: 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61 73  less in that cas
3230: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42  e..    */.    pB
3240: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30  t->isPending = 0
3250: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3260: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61  his function cha
3270: 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c  nges all write-l
3280: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3290: 6e 65 63 74 69 6f 6e 20 70 20 74 6f 20 72 65 61  nection p to rea
32a0: 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74  d-locks..*/.stat
32b0: 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61 64  ic void downgrad
32c0: 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
32d0: 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20  ableLocks(Btree 
32e0: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
32f0: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
3300: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
3310: 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f  r==p ){.    BtLo
3320: 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70  ck *pLock;.    p
3330: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3340: 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c  .    pBt->isExcl
3350: 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70  usive = 0;.    p
3360: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
3370: 30 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b  0;.    for(pLock
3380: 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f  =pBt->pLock; pLo
3390: 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d  ck; pLock=pLock-
33a0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
33b0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c  ssert( pLock->eL
33c0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
33d0: 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  | pLock->pBtree=
33e0: 3d 70 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63  =p );.      pLoc
33f0: 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  k->eLock = READ_
3400: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
3410: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
3420: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3430: 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63  CACHE */..static
3440: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
3450: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
3460: 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72  );  /* Forward r
3470: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a  eference */../*.
3480: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3490: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
34a0: 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
34b0: 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 6e 64  tShared.*/.#ifnd
34c0: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
34d0: 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73   int cursorHolds
34e0: 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a  Mutex(BtCursor *
34f0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
3500: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3510: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  p->pBt->mutex);.
3520: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
3530: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
3540: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e  NCRBLOB./*.** In
3550: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3560: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
3570: 63 61 63 68 65 20 66 6f 72 20 63 75 72 73 6f 72  cache for cursor
3580: 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a   pCur, if any..*
3590: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
35a0: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
35b0: 43 61 63 68 65 28 42 74 43 75 72 73 6f 72 20 2a  Cache(BtCursor *
35c0: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
35d0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
35e0: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
35f0: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
3600: 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43  aOverflow);.  pC
3610: 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
3620: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  0;.}../*.** Inva
3630: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
3640: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
3650: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
3660: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
3670: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
3680: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
3690: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36a0: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
36b0: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
36c0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
36d0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
36e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
36f0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
3700: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
3710: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
3720: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
3730: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3740: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
3750: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3760: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
3770: 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
3780: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
3790: 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 62 2d 74  f a table.** b-t
37a0: 72 65 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74  ree to invalidat
37b0: 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63  e any incrblob c
37c0: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
37d0: 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  open on the.** r
37e0: 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  ow or one of the
37f0: 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69   rows being modi
3800: 66 69 65 64 2e 20 41 72 67 75 6d 65 6e 74 20 70  fied. Argument p
3810: 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 0a  gnoRoot is the .
3820: 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20  ** root-page of 
3830: 74 68 65 20 74 61 62 6c 65 20 62 2d 74 72 65 65  the table b-tree
3840: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  . .**.** If argu
3850: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3860: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
3870: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
3880: 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61  nts of the.** ta
3890: 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ble is about to 
38a0: 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  be deleted. In t
38b0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
38c0: 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62  ate all incrblob
38d0: 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  .** cursors open
38e0: 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68   on any row with
38f0: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  in the table wit
3900: 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f  h root-page pgno
3910: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  Root..**.** Othe
3920: 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65  rwise, if argume
3930: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3940: 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74  is false, then t
3950: 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72  he row with.** r
3960: 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69  owid iRow is bei
3970: 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64  ng replaced or d
3980: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
3990: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a  case invalidate.
39a0: 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e  ** only those in
39b0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  crblob cursors o
39c0: 70 65 6e 20 6f 6e 20 74 68 69 73 20 73 70 65 63  pen on this spec
39d0: 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  ific row..*/.sta
39e0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
39f0: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
3a00: 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  rs(.  Btree *pBt
3a10: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ree,          /*
3a20: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
3a30: 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
3a40: 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20   Pgno pgnoRoot, 
3a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b           /* Look
3a60: 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72   for read cursor
3a70: 73 20 6f 6e 20 74 68 69 73 20 62 74 72 65 65 20  s on this btree 
3a80: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3aa0: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
3ab0: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
3ac0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
3ad0: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
3ae0: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
3af0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
3b00: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
3b10: 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
3b20: 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
3b30: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
3b40: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
3b50: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
3b60: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
3b70: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
3b80: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
3b90: 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
3ba0: 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65 61  andle && (isClea
3bb0: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
3bc0: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b  o.nKey==iRow) ){
3bd0: 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
3be0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
3bf0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  D;.    }.  }.}..
3c00: 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
3c10: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3c20: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
3c30: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
3c40: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
3c50: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
3c60: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
3c70: 75 72 73 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a  ursors(w,x,y,z).
3c80: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
3c90: 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68  t bit pgno of th
3ca0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
3cb0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54  ontent bitvec. T
3cc0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a  his is called .*
3cd0: 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68  * when a page th
3ce0: 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  at previously co
3cf0: 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65 63  ntained data bec
3d00: 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74  omes a free-list
3d10: 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a   leaf .** page..
3d20: 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72  **.** The BtShar
3d30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
3d40: 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f 20  itvec exists to 
3d50: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f  work around an o
3d60: 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61  bscure.** bug ca
3d70: 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74 65  used by the inte
3d80: 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75  raction of two u
3d90: 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a  seful IO optimiz
3da0: 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69  ations surroundi
3db0: 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  ng.** free-list 
3dc0: 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a  leaf pages:.**.*
3dd0: 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20  *   1) When all 
3de0: 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64 20  data is deleted 
3df0: 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20  from a page and 
3e00: 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73  the page becomes
3e10: 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d  .**      a free-
3e20: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
3e30: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
3e40: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
3e50: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
3e60: 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  (as free-list le
3e70: 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e  af pages contain
3e80: 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64   no meaningful d
3e90: 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a  ata). Sometimes.
3ea0: 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20 70  **      such a p
3eb0: 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20  age is not even 
3ec0: 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69  journalled (as i
3ed0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f  t will not be mo
3ee0: 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20  dified,.**      
3ef0: 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e  why bother journ
3f00: 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a  alling it?)..**.
3f10: 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20 66  **   2) When a f
3f20: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
3f30: 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69 74  ge is reused, it
3f40: 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
3f50: 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
3f60: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
3f70: 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  or written to th
3f80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
3f90: 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a  why should it.**
3fa0: 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74 20        be, if it 
3fb0: 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65  is not at all me
3fc0: 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a  aningful?)..**.*
3fd0: 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c  * By themselves,
3fe0: 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74   these optimizat
3ff0: 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61  ions work fine a
4000: 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e  nd provide a han
4010: 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  dy.** performanc
4020: 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20  e boost to bulk 
4030: 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74  delete or insert
4040: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77   operations. How
4050: 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61  ever, if.** a pa
4060: 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  ge is moved to t
4070: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4080: 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69 74   then reused wit
4090: 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  hin the same.** 
40a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70  transaction, a p
40b0: 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e  roblem comes up.
40c0: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
40d0: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
40e0: 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76  hen.** it is mov
40f0: 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
4100: 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c  ist and it is al
4110: 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  so not journalle
4120: 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20  d when it.** is 
4130: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
4140: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4150: 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68   reused, then th
4160: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a  e original data.
4170: 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20  ** may be lost. 
4180: 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  In the event of 
4190: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d  a rollback, it m
41a0: 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ay not be possib
41b0: 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  le.** to restore
41c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
41d0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f   its original co
41e0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  nfiguration..**.
41f0: 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
4200: 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  is the BtShared.
4210: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4220: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70  ec. Whenever a p
4230: 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64  age is .** moved
4240: 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65   to become a fre
4250: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
4260: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
4270: 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65  ing bit is.** se
4280: 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e  t in the bitvec.
4290: 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66   Whenever a leaf
42a0: 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63 74   page is extract
42b0: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
42c0: 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69  -list,.** optimi
42d0: 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69  zation 2 above i
42e0: 73 20 6f 6d 6d 69 74 74 65 64 20 69 66 20 74 68  s ommitted if th
42f0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4300: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
4310: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
4320: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
4330: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4340: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
4350: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
4360: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
4370: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
4380: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
4390: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
43a0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
43b0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
43c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
43d0: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
43e0: 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ent ){.    int n
43f0: 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 20 20  Page = 100;.    
4400: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
4410: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
4420: 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
4430: 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 50 61 67  /* If sqlite3Pag
4440: 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20 66 61  erPagecount() fa
4450: 69 6c 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ils there is no 
4460: 68 61 72 6d 20 62 65 63 61 75 73 65 20 74 68 65  harm because the
4470: 0a 20 20 20 20 2a 2a 20 6e 50 61 67 65 20 76 61  .    ** nPage va
4480: 72 69 61 62 6c 65 20 69 73 20 75 6e 63 68 61 6e  riable is unchan
4490: 67 65 64 20 66 72 6f 6d 20 69 74 73 20 64 65 66  ged from its def
44a0: 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 31 30  ault value of 10
44b0: 30 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 48  0 */.    pBt->pH
44c0: 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69  asContent = sqli
44d0: 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
44e0: 28 75 33 32 29 6e 50 61 67 65 29 3b 0a 20 20 20  (u32)nPage);.   
44f0: 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43   if( !pBt->pHasC
4500: 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
4510: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
4520: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  M;.    }.  }.  i
4530: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4540: 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65   && pgno<=sqlite
4550: 33 42 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d  3BitvecSize(pBt-
4560: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b  >pHasContent) ){
4570: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
4580: 33 42 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e  3BitvecSet(pBt->
4590: 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e  pHasContent, pgn
45a0: 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
45b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75   rc;.}../*.** Qu
45c0: 65 72 79 20 74 68 65 20 42 74 53 68 61 72 65 64  ery the BtShared
45d0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63  .pHasContent vec
45e0: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tor..**.** This 
45f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
4600: 65 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c  ed when a free-l
4610: 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ist leaf page is
4620: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
4630: 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66  e.** free-list f
4640: 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72 65 74  or reuse. It ret
4650: 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74  urns false if it
4660: 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 74 72   is safe to retr
4670: 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  ieve the.** page
4680: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
4690: 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
46a0: 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
46b0: 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72   set. True other
46c0: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
46d0: 69 6e 74 20 62 74 72 65 65 47 65 74 48 61 73 43  int btreeGetHasC
46e0: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
46f0: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
4700: 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20  {.  Bitvec *p = 
4710: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4720: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26  ;.  return (p &&
4730: 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69   (pgno>sqlite3Bi
4740: 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73  tvecSize(p) || s
4750: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
4760: 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a  (p, pgno)));.}..
4770: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73  /*.** Clear (des
4780: 74 72 6f 79 29 20 74 68 65 20 42 74 53 68 61 72  troy) the BtShar
4790: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
47a0: 69 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75  itvec. This shou
47b0: 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64  ld be.** invoked
47c0: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
47d0: 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74 65  on of each write
47e0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f  -transaction..*/
47f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
4800: 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
4810: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
4820: 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  {.  sqlite3Bitve
4830: 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48  cDestroy(pBt->pH
4840: 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42  asContent);.  pB
4850: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d  t->pHasContent =
4860: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76   0;.}../*.** Sav
4870: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
4880: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
4890: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
48a0: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
48b0: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
48c0: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
48d0: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
48e0: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
48f0: 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  EEK..**.** The c
4900: 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
4910: 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
4920: 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20  r is valid (has 
4930: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
4940: 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74  ALID).** prior t
4950: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
4960: 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61  outine.  .*/.sta
4970: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
4980: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
4990: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
49a0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
49b0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
49c0: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
49d0: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
49e0: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
49f0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4a00: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
4a10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4a20: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
4a30: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20  &pCur->nKey);.  
4a40: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
4a50: 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79  TE_OK );  /* Key
4a60: 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61  Size() cannot fa
4a70: 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  il */..  /* If t
4a80: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
4a90: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
4aa0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
4ab0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
4ac0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
4ad0: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
4ae0: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
4af0: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
4b00: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
4b10: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
4b20: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
4b30: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
4b40: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
4b50: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
4b60: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
4b70: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
4b80: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
4b90: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
4ba0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75   */.  if( 0==pCu
4bb0: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
4bc0: 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f 69 64  tKey ){.    void
4bd0: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
4be0: 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70 43 75  Malloc( (int)pCu
4bf0: 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69  r->nKey );.    i
4c00: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( pKey ){.     
4c10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4c20: 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 28  eeKey(pCur, 0, (
4c30: 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20  int)pCur->nKey, 
4c40: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28  pKey);.      if(
4c50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4c60: 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
4c70: 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pKey = pKey;.   
4c80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4c90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
4ca0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Key);.      }.  
4cb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
4cc0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
4cd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
4ce0: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70 50  sert( !pCur->apP
4cf0: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
4d00: 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  | !pCur->pKey );
4d10: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
4d20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
4d30: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
4d40: 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
4d50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
4d60: 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
4d70: 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
4d80: 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d   pCur->apPage[i]
4d90: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
4da0: 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31  pCur->iPage = -1
4db0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
4dc0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
4dd0: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
4de0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4df0: 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
4e00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4e10: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f  *.** Save the po
4e20: 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63  sitions of all c
4e30: 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 70 45  ursors except pE
4e40: 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68  xcept open on th
4e50: 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68  e table .** with
4e60: 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74   root-page iRoot
4e70: 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20  . Usually, this 
4e80: 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62  is called just b
4e90: 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20  efore cursor.** 
4ea0: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
4eb0: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61  to modify the ta
4ec0: 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65  ble (BtreeDelete
4ed0: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
4ee0: 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  t())..*/.static 
4ef0: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
4f00: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
4f10: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
4f20: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
4f30: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
4f40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4f50: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
4f60: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
4f70: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
4f80: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
4f90: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
4fa0: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
4fb0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
4fc0: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
4fd0: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
4fe0: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
4ff0: 69 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20  iRoot) && .     
5000: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55     p->eState==CU
5010: 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
5020: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76      int rc = sav
5030: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5040: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  p);.      if( SQ
5050: 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
5060: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
5070: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5080: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
5090: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
50a0: 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65   Clear the curre
50b0: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
50c0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
50d0: 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
50e0: 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
50f0: 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
5100: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5110: 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74  pCur) );.  sqlit
5120: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
5130: 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65  ey);.  pCur->pKe
5140: 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65  y = 0;.  pCur->e
5150: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
5160: 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NVALID;.}../*.**
5170: 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e   In this version
5180: 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c   of BtreeMoveto,
5190: 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65   pKey is a packe
51a0: 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a  d index record.*
51b0: 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e  * such as is gen
51c0: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  erated by the OP
51d0: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
51e0: 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a  de.  Unpack the.
51f0: 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68  ** record and th
5200: 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76  en call BtreeMov
5210: 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f  etoUnpacked() to
5220: 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f   do the work..*/
5230: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
5240: 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72  eMoveto(.  BtCur
5250: 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f  sor *pCur,     /
5260: 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e  * Cursor open on
5270: 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65   the btree to be
5280: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63   searched */.  c
5290: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
52a0: 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79     /* Packed key
52b0: 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73   if the btree is
52c0: 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   an index */.  i
52d0: 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  64 nKey,        
52e0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65     /* Integer ke
52f0: 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53  y for tables.  S
5300: 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20  ize of pKey for 
5310: 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
5320: 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20   bias,          
5330: 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20   /* Bias search 
5340: 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
5350: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
5360: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
5370: 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
5380: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
5390: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
53a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
53b0: 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70  us code */.  Unp
53c0: 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
53d0: 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63  xKey;   /* Unpac
53e0: 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
53f0: 0a 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 31  .  char aSpace[1
5400: 35 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  50];          /*
5410: 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20   Temp space for 
5420: 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f  pIdxKey - to avo
5430: 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a  id a malloc */..
5440: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
5450: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d    assert( nKey==
5460: 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29  (i64)(int)nKey )
5470: 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  ;.    pIdxKey = 
5480: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
5490: 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b  dUnpack(pCur->pK
54a0: 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65  eyInfo, (int)nKe
54b0: 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20  y, pKey,.       
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
54e0: 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53  Space, sizeof(aS
54f0: 70 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20  pace));.    if( 
5500: 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74  pIdxKey==0 ) ret
5510: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
5520: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
5530: 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
5540: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5550: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5560: 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
5570: 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
5580: 73 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 20 29  s);.  if( pKey )
5590: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
55a0: 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
55b0: 65 63 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a  ecord(pIdxKey);.
55c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
55d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
55e0: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
55f0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
5600: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
5610: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
5620: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
5630: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
5640: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
5650: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
5660: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
5670: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
5680: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
5690: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
56a0: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
56b0: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
56c0: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
56d0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
56e0: 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72  ion() call after
56f0: 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75   each .** saveCu
5700: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a  rsorPosition()..
5710: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5720: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5730: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
5740: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
5750: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  rc;.  assert( cu
5760: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
5770: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
5780: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
5790: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
57a0: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
57b0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
57c0: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
57d0: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
57e0: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
57f0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5800: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
5810: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
5820: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
5830: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70  Cur->nKey, 0, &p
5840: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a  Cur->skipNext);.
5850: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5860: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
5870: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
5880: 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ey);.    pCur->p
5890: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  Key = 0;.    ass
58a0: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
58b0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
58c0: 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
58d0: 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
58e0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
58f0: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
5900: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
5910: 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e  tion(p) \.  (p->
5920: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
5930: 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20  EQUIRESEEK ? \. 
5940: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73          btreeRes
5950: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5960: 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20  on(p) : \.      
5970: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f     SQLITE_OK)../
5980: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77  *.** Determine w
5990: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
59a0: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
59b0: 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69   from the positi
59c0: 6f 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  on it.** was las
59d0: 74 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75  t placed at.  Cu
59e0: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
59f0: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
5a00: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   are pointing.**
5a10: 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f   at is deleted o
5a20: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
5a30: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  em..**.** This r
5a40: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
5a50: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
5a60: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
5a70: 72 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  rong.  The.** in
5a80: 74 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64  teger *pHasMoved
5a90: 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69   is set to one i
5aa0: 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  f the cursor has
5ab0: 20 6d 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20   moved and 0 if 
5ac0: 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  not..*/.int sqli
5ad0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
5ae0: 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20  sMoved(BtCursor 
5af0: 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73  *pCur, int *pHas
5b00: 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
5b10: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  ;..  rc = restor
5b20: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5b30: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
5b40: 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  ){.    *pHasMove
5b50: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
5b60: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
5b70: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
5b80: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
5b90: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20  ur->skipNext!=0 
5ba0: 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  ){.    *pHasMove
5bb0: 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
5bc0: 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d      *pHasMoved =
5bd0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5be0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
5bf0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5c00: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
5c10: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65  .** Given a page
5c20: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
5c30: 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61  ular database pa
5c40: 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70  ge, return the p
5c50: 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  age.** number fo
5c60: 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  r the pointer-ma
5c70: 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  p page that cont
5c80: 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66  ains the entry f
5c90: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20  or the.** input 
5ca0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  page number..*/.
5cb0: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
5cc0: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
5cd0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
5ce0: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
5cf0: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67  PerMapPage;.  Pg
5d00: 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  no iPtrMap, ret;
5d10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5d20: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
5d30: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e  t->mutex) );.  n
5d40: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
5d50: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
5d60: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
5d70: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
5d80: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
5d90: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
5da0: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
5db0: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
5dc0: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
5dd0: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
5de0: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
5df0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
5e00: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
5e10: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
5e20: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
5e30: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
5e40: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
5e50: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
5e60: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
5e70: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
5e80: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
5e90: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
5ea0: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
5eb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
5ec0: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
5ed0: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
5ee0: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
5ef0: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
5f00: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
5f10: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
5f20: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
5f30: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
5f40: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
5f50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
5f60: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
5f70: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
5f80: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
5f90: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
5fa0: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
5fb0: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
5fc0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
5fd0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
5fe0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
5ff0: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
6000: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
6010: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
6020: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
6030: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
6040: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
6050: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
6060: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
6070: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6080: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
6090: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
60a0: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
60b0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
60c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
60d0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
60e0: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
60f0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
6100: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
6110: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
6120: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
6130: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
6140: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
6150: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
6160: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
6170: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
6180: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
6190: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
61a0: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
61b0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
61c0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
61d0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
61e0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
61f0: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
6200: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
6210: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
6220: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
6230: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6240: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
6250: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
6260: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
6270: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
6280: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
6290: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
62a0: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
62b0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
62c0: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
62d0: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 50 74  _exit;.  }.  pPt
62e0: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
62f0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
6300: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66  (pDbPage);..  if
6310: 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70  ( eType!=pPtrmap
6320: 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34  [offset] || get4
6330: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
6340: 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74  fset+1])!=parent
6350: 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22   ){.    TRACE(("
6360: 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25  PTRMAP_UPDATE: %
6370: 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b  d->(%d,%d)\n", k
6380: 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e  ey, eType, paren
6390: 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72  t));.    *pRC= r
63a0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
63b0: 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
63c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
63d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
63e0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d  Ptrmap[offset] =
63f0: 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75   eType;.      pu
6400: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
6410: 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e  offset+1], paren
6420: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70  t);.    }.  }..p
6430: 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71  trmap_exit:.  sq
6440: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
6450: 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pDbPage);.}../*.
6460: 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79  ** Read an entry
6470: 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65   from the pointe
6480: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
6490: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65  s routine retrie
64a0: 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ves the pointer 
64b0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
64c0: 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e  ge 'key', writin
64d0: 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e  g.** the type an
64e0: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
64f0: 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20  mber to *pEType 
6500: 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65  and *pPgno respe
6510: 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65  ctively..** An e
6520: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
6530: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
6540: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
6550: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
6560: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
6570: 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68  t ptrmapGet(BtSh
6580: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
6590: 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c  key, u8 *pEType,
65a0: 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20   Pgno *pPgno){. 
65b0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
65c0: 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  ;   /* The point
65d0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
65e0: 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20   int iPtrmap;   
65f0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
6600: 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f  ap page index */
6610: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
6620: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
6630: 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a   map page data *
6640: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
6650: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
6660: 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69   of entry in poi
6670: 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e  nter map */.  in
6680: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
6690: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
66a0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
66b0: 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20  );..  iPtrmap = 
66c0: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
66d0: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
66e0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
66f0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
6700: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
6710: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
6720: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
6730: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
6740: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
6750: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
6760: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
6770: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
6780: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
6790: 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21   assert( pEType!
67a0: 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20  =0 );.  *pEType 
67b0: 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  = pPtrmap[offset
67c0: 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29  ];.  if( pPgno )
67d0: 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79   *pPgno = get4by
67e0: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
67f0: 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74  et+1]);..  sqlit
6800: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
6810: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45  Page);.  if( *pE
6820: 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70  Type<1 || *pETyp
6830: 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c  e>5 ) return SQL
6840: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6850: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6860: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  E_OK;.}..#else /
6870: 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c  * if defined SQL
6880: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
6890: 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  UUM */.  #define
68a0: 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79   ptrmapPut(w,x,y
68b0: 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65  ,z,rc).  #define
68c0: 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79   ptrmapGet(w,x,y
68d0: 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,z) SQLITE_OK.  
68e0: 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75  #define ptrmapPu
68f0: 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72  tOvflPtr(x, y, r
6900: 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
6910: 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70   Given a btree p
6920: 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69  age and a cell i
6930: 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68  ndex (0 means th
6940: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a  e first cell on.
6950: 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d  ** the page, 1 m
6960: 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20  eans the second 
6970: 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72  cell, and so for
6980: 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69  th) return a poi
6990: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63  nter.** to the c
69a0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ell content..**.
69b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
69c0: 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70  works only for p
69d0: 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ages that do not
69e0: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
69f0: 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66  w cells..*/.#def
6a00: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49  ine findCell(P,I
6a10: 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74  ) \.  ((P)->aDat
6a20: 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61  a + ((P)->maskPa
6a30: 67 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28  ge & get2byte(&(
6a40: 50 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63  P)->aData[(P)->c
6a50: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d  ellOffset+2*(I)]
6a60: 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  )))../*.** This 
6a70: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76  a more complex v
6a80: 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65  ersion of findCe
6a90: 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20  ll() that works 
6aa0: 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61  for.** pages tha
6ab0: 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65  t do contain ove
6ac0: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
6ad0: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f  static u8 *findO
6ae0: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50  verflowCell(MemP
6af0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
6b00: 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  iCell){.  int i;
6b10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6b20: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
6b30: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
6b40: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67   );.  for(i=pPag
6b50: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20  e->nOverflow-1; 
6b60: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
6b70: 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63  int k;.    struc
6b80: 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76  t _OvflCell *pOv
6b90: 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20  fl;.    pOvfl = 
6ba0: 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d  &pPage->aOvfl[i]
6bb0: 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d  ;.    k = pOvfl-
6bc0: 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c  >idx;.    if( k<
6bd0: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
6be0: 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a  if( k==iCell ){.
6bf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
6c00: 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20  Ovfl->pCell;.   
6c10: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c     }.      iCell
6c20: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
6c30: 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28  return findCell(
6c40: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d  pPage, iCell);.}
6c50: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
6c60: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
6c70: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
6c80: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
6c90: 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a  cture.  There.**
6ca0: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
6cb0: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
6cc0: 6f 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65 43  on.  btreeParseC
6cd0: 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a  ell() takes a .*
6ce0: 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20  * cell index as 
6cf0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
6d00: 65 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61 72  ent and btreePar
6d10: 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20  seCellPtr() .** 
6d20: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
6d30: 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  to the body of t
6d40: 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73  he cell as its s
6d50: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
6d60: 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69  **.** Within thi
6d70: 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73  s file, the pars
6d80: 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61  eCell() macro ca
6d90: 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  n be called inst
6da0: 65 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50  ead of.** btreeP
6db0: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55  arseCellPtr(). U
6dc0: 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c  sing some compil
6dd0: 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ers, this will b
6de0: 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61  e faster..*/.sta
6df0: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
6e00: 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65  rseCellPtr(.  Me
6e10: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
6e20: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
6e30: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
6e40: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
6e50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
6e60: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
6e70: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
6e80: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
6e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
6ea0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
6eb0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e  re */.){.  u16 n
6ec0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6ed0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74     /* Number byt
6ee0: 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65  es in cell conte
6ef0: 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  nt header */.  u
6f00: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
6f10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6f20: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
6f30: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
6f40: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6f50: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
6f60: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
6f70: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c  ..  pInfo->pCell
6f80: 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65   = pCell;.  asse
6f90: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
6fa0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
6fb0: 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50  f==1 );.  n = pP
6fc0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
6fd0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  e;.  assert( n==
6fe0: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  4-4*pPage->leaf 
6ff0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
7000: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66  intKey ){.    if
7010: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
7020: 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67   ){.      n += g
7030: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
7040: 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  l[n], nPayload);
7050: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7060: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a    nPayload = 0;.
7070: 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67      }.    n += g
7080: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
7090: 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  n], (u64*)&pInfo
70a0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e  ->nKey);.    pIn
70b0: 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79  fo->nData = nPay
70c0: 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  load;.  }else{. 
70d0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20     pInfo->nData 
70e0: 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  = 0;.    n += ge
70f0: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
7100: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
7110: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20      pInfo->nKey 
7120: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a  = nPayload;.  }.
7130: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
7140: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
7150: 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d  pInfo->nHeader =
7160: 20 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   n;.  testcase( 
7170: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
7180: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
7190: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
71a0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
71b0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c 69  al+1 );.  if( li
71c0: 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70  kely(nPayload<=p
71d0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20  Page->maxLocal) 
71e0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
71f0: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
7200: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
7210: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
7220: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
7230: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
7240: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
7250: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
7260: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b  /.    int nSize;
7270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
7280: 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20  al size of cell 
7290: 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73  content in bytes
72a0: 20 2a 2f 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   */.    nSize = 
72b0: 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20  nPayload + n;.  
72c0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
72d0: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
72e0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
72f0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 69  rflow = 0;.    i
7300: 66 28 20 28 6e 53 69 7a 65 20 26 20 7e 33 29 3d  f( (nSize & ~3)=
7310: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  =0 ){.      nSiz
7320: 65 20 3d 20 34 3b 20 20 20 20 20 20 20 20 2f 2a  e = 4;        /*
7330: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
7340: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d  ze is 4 */.    }
7350: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
7360: 65 20 3d 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a  e = (u16)nSize;.
7370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
7380: 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77  If the payload w
7390: 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70  ill not fit comp
73a0: 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f  letely on the lo
73b0: 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76  cal page, we hav
73c0: 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69  e.    ** to deci
73d0: 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  de how much to s
73e0: 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64  tore locally and
73f0: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69   how much to spi
7400: 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f  ll onto.    ** o
7410: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20  verflow pages.  
7420: 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20  The strategy is 
7430: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
7440: 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64  amount of unused
7450: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e  .    ** space on
7460: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
7470: 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68  while keeping th
7480: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61  e amount of loca
7490: 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a  l storage.    **
74a0: 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c   in between minL
74b0: 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61  ocal and maxLoca
74c0: 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
74d0: 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67   Warning:  chang
74e0: 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72  ing the way over
74f0: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20  flow payload is 
7500: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61  distributed in a
7510: 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69  ny.    ** way wi
7520: 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
7530: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c  incompatible fil
7540: 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f  e format..    */
7550: 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61  .    int minLoca
7560: 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61  l;  /* Minimum a
7570: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
7580: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
7590: 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61  .    int maxLoca
75a0: 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61  l;  /* Maximum a
75b0: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
75c0: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
75d0: 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73  .    int surplus
75e0: 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  ;   /* Overflow 
75f0: 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c  payload availabl
7600: 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72  e for local stor
7610: 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c  age */..    minL
7620: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
7630: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c  nLocal;.    maxL
7640: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61  ocal = pPage->ma
7650: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70  xLocal;.    surp
7660: 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  lus = minLocal +
7670: 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e   (nPayload - min
7680: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
7690: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
76a0: 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   4);.    testcas
76b0: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
76c0: 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  ocal );.    test
76d0: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
76e0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20  axLocal+1 );.   
76f0: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
7700: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
7710: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
7720: 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a  = (u16)surplus;.
7730: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7740: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
7750: 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a   (u16)minLocal;.
7760: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d      }.    pInfo-
7770: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31  >iOverflow = (u1
7780: 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c  6)(pInfo->nLocal
7790: 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f   + n);.    pInfo
77a0: 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d  ->nSize = pInfo-
77b0: 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a  >iOverflow + 4;.
77c0: 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61    }.}.#define pa
77d0: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  rseCell(pPage, i
77e0: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20  Cell, pInfo) \. 
77f0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7800: 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e 64  tr((pPage), find
7810: 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28 69  Cell((pPage), (i
7820: 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29  Cell)), (pInfo))
7830: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
7840: 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  eeParseCell(.  M
7850: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
7860: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
7870: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
7880: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
7890: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
78a0: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
78b0: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
78c0: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
78d0: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
78e0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
78f0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
7900: 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  .  parseCell(pPa
7910: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
7920: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  );.}../*.** Comp
7930: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ute the total nu
7940: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68  mber of bytes th
7950: 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20  at a Cell needs 
7960: 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  in the cell.** d
7970: 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20  ata area of the 
7980: 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65  btree-page.  The
7990: 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69   return number i
79a0: 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c  ncludes the cell
79b0: 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20  .** data header 
79c0: 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61  and the local pa
79d0: 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61  yload, but not a
79e0: 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
79f0: 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65   or.** the space
7a00: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c   used by the cel
7a10: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
7a20: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
7a30: 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  ePtr(MemPage *pP
7a40: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
7a50: 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 26  .  u8 *pIter = &
7a60: 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69  pCell[pPage->chi
7a70: 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33  ldPtrSize];.  u3
7a80: 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66  2 nSize;..#ifdef
7a90: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
7aa0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  /* The value ret
7ab0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
7ac0: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  nction should al
7ad0: 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65  ways be the same
7ae0: 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65   as.  ** the (Ce
7af0: 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61  llInfo.nSize) va
7b00: 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69  lue found by doi
7b10: 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20  ng a full parse 
7b20: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  of the.  ** cell
7b30: 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55  . If SQLITE_DEBU
7b40: 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  G is defined, an
7b50: 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65   assert() at the
7b60: 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20   bottom of.  ** 
7b70: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65  this function ve
7b80: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73  rifies that this
7b90: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f   invariant is no
7ba0: 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20  t violated. */. 
7bb0: 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69   CellInfo debugi
7bc0: 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73  nfo;.  btreePars
7bd0: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
7be0: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
7bf0: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  o);.#endif..  if
7c00: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
7c10: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b  ){.    u8 *pEnd;
7c20: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
7c30: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
7c40: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
7c50: 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69  int32(pIter, nSi
7c60: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
7c70: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b        nSize = 0;
7c80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70  .    }..    /* p
7c90: 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20  Iter now points 
7ca0: 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e  at the 64-bit in
7cb0: 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c  teger key value,
7cc0: 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
7cd0: 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  th .    ** integ
7ce0: 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  er. The followin
7cf0: 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49  g block moves pI
7d00: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
7d10: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20  the first byte. 
7d20: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
7d30: 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61  nd of the key va
7d40: 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64  lue. */.    pEnd
7d50: 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20   = &pIter[9];.  
7d60: 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72    while( (*pIter
7d70: 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65  ++)&0x80 && pIte
7d80: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73  r<pEnd );.  }els
7d90: 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20  e{.    pIter += 
7da0: 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  getVarint32(pIte
7db0: 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  r, nSize);.  }..
7dc0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
7dd0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
7de0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
7df0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
7e00: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
7e10: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
7e20: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
7e30: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20   int minLocal = 
7e40: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
7e50: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e  .    nSize = min
7e60: 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d  Local + (nSize -
7e70: 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50   minLocal) % (pP
7e80: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
7e90: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
7ea0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
7eb0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
7ec0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7ed0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
7ee0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20  axLocal+1 );.   
7ef0: 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65   if( nSize>pPage
7f00: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
7f10: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
7f20: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
7f30: 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a  nSize += 4;.  }.
7f40: 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29    nSize += (u32)
7f50: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
7f60: 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d  ..  /* The minim
7f70: 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 63  um size of any c
7f80: 65 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e 20  ell is 4 bytes. 
7f90: 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 34  */.  if( nSize<4
7fa0: 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   ){.    nSize = 
7fb0: 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  4;.  }..  assert
7fc0: 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e  ( nSize==debugin
7fd0: 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65  fo.nSize );.  re
7fe0: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
7ff0: 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  .}.#ifndef NDEBU
8000: 47 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  G.static u16 cel
8010: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
8020: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
8030: 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c 6c 53  {.  return cellS
8040: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 66 69  izePtr(pPage, fi
8050: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
8060: 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ell));.}.#endif.
8070: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8080: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
8090: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
80a0: 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66  l pCell, part of
80b0: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
80c0: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
80d0: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
80e0: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
80f0: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
8100: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
8110: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
8120: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
8130: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76  void ptrmapPutOv
8140: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
8150: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c  Page, u8 *pCell,
8160: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65   int *pRC){.  Ce
8170: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69  llInfo info;.  i
8180: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
8190: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
81a0: 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72 65 65 50  l!=0 );.  btreeP
81b0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
81c0: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
81d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 66  ;.  assert( (inf
81e0: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
81f0: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
8200: 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
8210: 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69 6e 66  oad );.  if( inf
8220: 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
8230: 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67     Pgno ovfl = g
8240: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
8250: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
8260: 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
8270: 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c  Page->pBt, ovfl,
8280: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
8290: 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  1, pPage->pgno, 
82a0: 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  pRC);.  }.}.#end
82b0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61  if.../*.** Defra
82c0: 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67  gment the page g
82d0: 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73  iven.  All Cells
82e0: 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
82f0: 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
8300: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65  page and all fre
8310: 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65  e space is colle
8320: 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a  cted into one.**
8330: 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61   big FreeBlk tha
8340: 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  t occurs in betw
8350: 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61  een the header a
8360: 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  nd cell.** point
8370: 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  er array and the
8380: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
8390: 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ea..*/.static in
83a0: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
83b0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
83c0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83e0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
83f0: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8410: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 69  * Address of a i
8420: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
8430: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
8440: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
8450: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
8460: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
8470: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8480: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
8490: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
84a0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
84b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
84c0: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
84d0: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
84e0: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8500: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
8510: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
8520: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
8550: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
8560: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
8570: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8580: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8590: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
85a0: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
85b0: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
85c0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
85d0: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
85e0: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
85f0: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
8600: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
8610: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46   */.  int iCellF
8620: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
8630: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
8640: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
8650: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
8660: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
8670: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
8680: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a  cell index */...
8690: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
86a0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
86b0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
86c0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
86d0: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
86e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
86f0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
8700: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
8710: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
8720: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
8730: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
8740: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8750: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
8760: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
8770: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
8780: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
8790: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
87a0: 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  r);.  data = pPa
87b0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
87c0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
87d0: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
87e0: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
87f0: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
8800: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
8810: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
8820: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
8830: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
8840: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
8850: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
8860: 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79  .  cbrk = get2by
8870: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
8880: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70  ;.  memcpy(&temp
8890: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62  [cbrk], &data[cb
88a0: 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  rk], usableSize 
88b0: 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b 20  - cbrk);.  cbrk 
88c0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
88d0: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
88e0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c  lOffset + 2*nCel
88f0: 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  l;.  iCellLast =
8900: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
8910: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
8920: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
8930: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
8940: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
8950: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
8960: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
8970: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
8980: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
8990: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73  (pAddr);.    tes
89a0: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
89b0: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
89c0: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
89d0: 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64 65 66  Last );.#if !def
89e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
89f0: 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
8a00: 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20 54  _CHECK).    /* T
8a10: 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  hese conditions 
8a20: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
8a30: 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74  n verified in bt
8a40: 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20  reeInitPage().  
8a50: 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 45    ** if SQLITE_E
8a60: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
8a70: 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64 65 66  ELL_CHECK is def
8a80: 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ined .    */.   
8a90: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
8aa0: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
8ab0: 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
8ac0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8ad0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65  T_BKPT;.    }.#e
8ae0: 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
8af0: 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc>=iCellFirst 
8b00: 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74  && pc<=iCellLast
8b10: 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63   );.    size = c
8b20: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
8b30: 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20  , &temp[pc]);.  
8b40: 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a    cbrk -= size;.
8b50: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
8b60: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
8b70: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
8b80: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
8b90: 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20  lFirst ){.      
8ba0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8bb0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
8bc0: 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  }.#else.    if( 
8bd0: 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20  cbrk<iCellFirst 
8be0: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
8bf0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
8c00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8c10: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
8c20: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
8c30: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
8c40: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
8c50: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
8c60: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
8c70: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
8c80: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
8c90: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
8ca0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
8cb0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62   memcpy(&data[cb
8cc0: 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20  rk], &temp[pc], 
8cd0: 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62  size);.    put2b
8ce0: 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29  yte(pAddr, cbrk)
8cf0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
8d00: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
8d10: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
8d20: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72  data[hdr+5], cbr
8d30: 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31  k);.  data[hdr+1
8d40: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
8d50: 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+2] = 0;.  data
8d60: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d  [hdr+7] = 0;.  m
8d70: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c  emset(&data[iCel
8d80: 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b  lFirst], 0, cbrk
8d90: 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20  -iCellFirst);.  
8da0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
8db0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
8dc0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
8dd0: 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 43  );.  if( cbrk-iC
8de0: 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d  ellFirst!=pPage-
8df0: 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65  >nFree ){.    re
8e00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8e10: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
8e20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8e30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
8e40: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
8e50: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
8e60: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
8e70: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
8e80: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
8e90: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
8ea0: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
8eb0: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
8ec0: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
8ed0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
8ee0: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
8ef0: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
8f00: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
8f10: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
8f20: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
8f30: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
8f40: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
8f50: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
8f60: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
8f70: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
8f80: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
8f90: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
8fa0: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
8fb0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
8fc0: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
8fd0: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
8fe0: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
8ff0: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
9000: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
9010: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
9020: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
9030: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
9040: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
9050: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
9060: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
9070: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
9080: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
9090: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
90a0: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
90b0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
90c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
90d0: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
90e0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
90f0: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
9100: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
9110: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
9120: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
9130: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
9140: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
9150: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
9160: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
9170: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
9180: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
9190: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Data */.  int nF
91a0: 72 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  rag;            
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
91c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 61 67  * Number of frag
91d0: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e 20  mented bytes on 
91e0: 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74  pPage */.  int t
91f0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9210: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
9220: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
9230: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b  ea */.  int gap;
9240: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
9250: 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74   byte of gap bet
9260: 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65  ween cell pointe
9270: 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74  rs and cell cont
9280: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ent */.  int rc;
9290: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
92a0: 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ger return code 
92b0: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
92c0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
92d0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
92e0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
92f0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
9300: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
9310: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9320: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
9330: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
9340: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
9350: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
9360: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
9370: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
9380: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
9390: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
93a0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
93b0: 73 65 72 74 28 20 6e 42 79 74 65 3c 70 50 61 67  sert( nByte<pPag
93c0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
93d0: 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67  ze-8 );..  nFrag
93e0: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a   = data[hdr+7];.
93f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9400: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68  >cellOffset == h
9410: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
9420: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70  e->leaf );.  gap
9430: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
9440: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
9450: 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67  nCell;.  top = g
9460: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
9470: 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70  r+5]);.  if( gap
9480: 3e 74 6f 70 20 29 20 72 65 74 75 72 6e 20 53 51  >top ) return SQ
9490: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
94a0: 54 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  T;.  testcase( g
94b0: 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+2==top );.  t
94c0: 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d  estcase( gap+1==
94d0: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
94e0: 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a  e( gap==top );..
94f0: 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20    if( nFrag>=60 
9500: 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  ){.    /* Always
9510: 20 64 65 66 72 61 67 6d 65 6e 74 20 68 69 67 68   defragment high
9520: 6c 79 20 66 72 61 67 6d 65 6e 74 65 64 20 70 61  ly fragmented pa
9530: 67 65 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ges */.    rc = 
9540: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
9550: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
9560: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
9570: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
9580: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
9590: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 61 70  .  }else if( gap
95a0: 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f  +2<=top ){.    /
95b0: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65  * Search the fre
95c0: 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f  elist looking fo
95d0: 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69  r a free slot bi
95e0: 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69  g enough to sati
95f0: 73 66 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  sfy .    ** the 
9600: 72 65 71 75 65 73 74 2e 20 54 68 65 20 61 6c 6c  request. The all
9610: 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 20  ocation is made 
9620: 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 66  from the first f
9630: 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20  ree slot in .   
9640: 20 2a 2a 20 74 68 65 20 6c 69 73 74 20 74 68 61   ** the list tha
9650: 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  t is large enoug
9660: 68 20 74 6f 20 61 63 63 6f 6d 61 64 61 74 65 20  h to accomadate 
9670: 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
9680: 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20  nt pc, addr;.   
9690: 20 66 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b   for(addr=hdr+1;
96a0: 20 28 70 63 20 3d 20 67 65 74 32 62 79 74 65 28   (pc = get2byte(
96b0: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b  &data[addr]))>0;
96c0: 20 61 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20   addr=pc){.     
96d0: 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32   int size = get2
96e0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
96f0: 29 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  );     /* Size o
9700: 66 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20  f free slot */. 
9710: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e       if( size>=n
9720: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
9730: 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e  int x = size - n
9740: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 74 65  Byte;.        te
9750: 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a  stcase( x==4 );.
9760: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
9770: 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ( x==3 );.      
9780: 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20    if( x<4 ){.   
9790: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
97a0: 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74   the slot from t
97b0: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70  he free-list. Up
97c0: 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  date the number 
97d0: 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  of.          ** 
97e0: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
97f0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
9800: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  . */.          m
9810: 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72  emcpy(&data[addr
9820: 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29  ], &data[pc], 2)
9830: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61  ;.          data
9840: 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e  [hdr+7] = (u8)(n
9850: 46 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20  Frag + x);.     
9860: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9870: 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20      /* The slot 
9880: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
9890: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
98a0: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
98b0: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  ount.          *
98c0: 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  * for the portio
98d0: 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65  n used by the ne
98e0: 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f  w allocation. */
98f0: 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62  .          put2b
9900: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c  yte(&data[pc+2],
9910: 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   x);.        }. 
9920: 20 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70         *pIdx = p
9930: 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72  c + x;.        r
9940: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9950: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9960: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
9970: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72  o make sure ther
9980: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
9990: 65 20 69 6e 20 74 68 65 20 67 61 70 20 74 6f 20  e in the gap to 
99a0: 73 61 74 69 73 66 79 0a 20 20 2a 2a 20 74 68 65  satisfy.  ** the
99b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66   allocation.  If
99c0: 20 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e 74   not, defragment
99d0: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
99e0: 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d  e( gap+2+nByte==
99f0: 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70  top );.  if( gap
9a00: 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a  +2+nByte>top ){.
9a10: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
9a20: 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  entPage(pPage);.
9a30: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
9a40: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
9a50: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9a60: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73  [hdr+5]);.    as
9a70: 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c  sert( gap+nByte<
9a80: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
9a90: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
9aa0: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
9ab0: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
9ac0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
9ad0: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
9ae0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
9af0: 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74  .  The btreeInit
9b00: 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20  Page() call has 
9b10: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c  already.  ** val
9b20: 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c  idated the freel
9b30: 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74  ist.  Given that
9b40: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
9b50: 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20   valid, there.  
9b60: 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  ** is no way tha
9b70: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
9b80: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20   can extend off 
9b90: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
9ba0: 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73  age..  ** The as
9bb0: 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72  sert() below ver
9bc0: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
9bd0: 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a  us sentence..  *
9be0: 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  /.  top -= nByte
9bf0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
9c00: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
9c10: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e  .  assert( top+n
9c20: 42 79 74 65 20 3c 3d 20 70 50 61 67 65 2d 3e 70  Byte <= pPage->p
9c30: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
9c40: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b  ;.  *pIdx = top;
9c50: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9c60: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
9c70: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
9c80: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
9c90: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
9ca0: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
9cb0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
9cc0: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
9cd0: 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72  Page->aDisk[star
9ce0: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
9cf0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
9d00: 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e  is "size" bytes.
9d10: 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74  .**.** Most of t
9d20: 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69  he effort here i
9d30: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f  s involved in co
9d40: 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74  alesing adjacent
9d50: 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  .** free blocks 
9d60: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69  into a single bi
9d70: 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f  g free block..*/
9d80: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
9d90: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
9da0: 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c  Page, int start,
9db0: 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e   int size){.  in
9dc0: 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20  t addr, pbegin, 
9dd0: 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74  hdr;.  int iLast
9de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67           /* Larg
9e00: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65  est possible fre
9e10: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
9e20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9e30: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
9e40: 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74  aData;..  assert
9e50: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
9e60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
9e70: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
9e80: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
9e90: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
9ea0: 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e  ( start>=pPage->
9eb0: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
9ec0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
9ed0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74  );.  assert( (st
9ee0: 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61  art + size)<=pPa
9ef0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
9f00: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
9f10: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9f20: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9f30: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9f40: 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20  rt( size>=0 );  
9f50: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
9f60: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23   size is 4 */..#
9f70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  ifdef SQLITE_SEC
9f80: 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20  URE_DELETE.  /* 
9f90: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
9fa0: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
9fb0: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
9fc0: 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  e SECURE_DELETE 
9fd0: 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20  .  ** option is 
9fe0: 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
9ff0: 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d  le-time */.  mem
a000: 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d  set(&data[start]
a010: 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64  , 0, size);.#end
a020: 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
a030: 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f   space back into
a040: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
a050: 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   of freeblocks. 
a060: 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20   Note that.  ** 
a070: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20  even though the 
a080: 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77  freeblock list w
a090: 61 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74  as checked by bt
a0a0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 20  reeInitPage(),. 
a0b0: 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67   ** btreeInitPag
a0c0: 65 28 29 20 64 69 64 20 6e 6f 74 20 64 65 74 65  e() did not dete
a0d0: 63 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 63  ct overlapping c
a0e0: 65 6c 6c 73 20 6f 72 0a 20 20 2a 2a 20 66 72 65  ells or.  ** fre
a0f0: 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 6f 76 65  eblocks that ove
a100: 72 6c 61 70 70 65 64 20 63 65 6c 6c 73 2e 20 20  rlapped cells.  
a110: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 64 65 74   Nor does it det
a120: 65 63 74 20 77 68 65 6e 20 74 68 65 0a 20 20 2a  ect when the.  *
a130: 2a 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  * cell content a
a140: 72 65 61 20 65 78 63 65 65 64 73 20 74 68 65 20  rea exceeds the 
a150: 76 61 6c 75 65 20 69 6e 20 74 68 65 20 70 61 67  value in the pag
a160: 65 20 68 65 61 64 65 72 2e 20 20 49 66 20 74 68  e header.  If th
a170: 65 73 65 0a 20 20 2a 2a 20 73 69 74 75 61 74 69  ese.  ** situati
a180: 6f 6e 73 20 61 72 69 73 65 2c 20 74 68 65 6e 20  ons arise, then 
a190: 73 75 62 73 65 71 75 65 6e 74 20 69 6e 73 65 72  subsequent inser
a1a0: 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 6d 69 67  t operations mig
a1b0: 68 74 20 63 6f 72 72 75 70 74 0a 20 20 2a 2a 20  ht corrupt.  ** 
a1c0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 53  the freelist.  S
a1d0: 6f 20 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 20  o we do need to 
a1e0: 63 68 65 63 6b 20 66 6f 72 20 63 6f 72 72 75 70  check for corrup
a1f0: 74 69 6f 6e 20 77 68 69 6c 65 20 73 63 61 6e 6e  tion while scann
a200: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 72 65  ing.  ** the fre
a210: 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 68 64  elist..  */.  hd
a220: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
a230: 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68  fset;.  addr = h
a240: 64 72 20 2b 20 31 3b 0a 20 20 69 4c 61 73 74 20  dr + 1;.  iLast 
a250: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
a260: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
a270: 61 73 73 65 72 74 28 20 73 74 61 72 74 3c 3d 69  assert( start<=i
a280: 4c 61 73 74 20 29 3b 0a 20 20 77 68 69 6c 65 28  Last );.  while(
a290: 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62   (pbegin = get2b
a2a0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
a2b0: 29 3c 73 74 61 72 74 20 26 26 20 70 62 65 67 69  )<start && pbegi
a2c0: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  n>0 ){.    if( p
a2d0: 62 65 67 69 6e 3c 61 64 64 72 2b 34 20 29 7b 0a  begin<addr+4 ){.
a2e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a2f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a300: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
a310: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20   = pbegin;.  }. 
a320: 20 69 66 28 20 70 62 65 67 69 6e 3e 69 4c 61 73   if( pbegin>iLas
a330: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
a340: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
a350: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
a360: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c  t( pbegin>addr |
a370: 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20  | pbegin==0 );. 
a380: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
a390: 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20  addr], start);. 
a3a0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
a3b0: 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b  start], pbegin);
a3c0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
a3d0: 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65  a[start+2], size
a3e0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
a3f0: 65 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  e = pPage->nFree
a400: 20 2b 20 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20   + (u16)size;.. 
a410: 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a   /* Coalesce adj
a420: 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b  acent free block
a430: 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 68 64  s */.  addr = hd
a440: 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  r + 1;.  while( 
a450: 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79  (pbegin = get2by
a460: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
a470: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e  >0 ){.    int pn
a480: 65 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20  ext, psize, x;. 
a490: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
a4a0: 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73  n>addr );.    as
a4b0: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
a4c0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a4d0: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e  Size-4 );.    pn
a4e0: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
a4f0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20  data[pbegin]);. 
a500: 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62     psize = get2b
a510: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
a520: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62  +2]);.    if( pb
a530: 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33  egin + psize + 3
a540: 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65   >= pnext && pne
a550: 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  xt>0 ){.      in
a560: 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d  t frag = pnext -
a570: 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b   (pbegin+psize);
a580: 0a 20 20 20 20 20 20 69 66 28 20 28 66 72 61 67  .      if( (frag
a590: 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e  <0) || (frag>(in
a5a0: 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 29 20 29  t)data[hdr+7]) )
a5b0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
a5c0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
a5d0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
a5e0: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
a5f0: 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20 20  -= (u8)frag;.   
a600: 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28     x = get2byte(
a610: 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a 20  &data[pnext]);. 
a620: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
a630: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29 3b  ata[pbegin], x);
a640: 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78 74  .      x = pnext
a650: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
a660: 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70 62  a[pnext+2]) - pb
a670: 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74 32  egin;.      put2
a680: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
a690: 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d 65  n+2], x);.    }e
a6a0: 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20  lse{.      addr 
a6b0: 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a  = pbegin;.    }.
a6c0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
a6d0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
a6e0: 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  ea begins with a
a6f0: 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f   freeblock, remo
a700: 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ve it. */.  if( 
a710: 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74  data[hdr+1]==dat
a720: 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61  a[hdr+5] && data
a730: 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+2]==data[hd
a740: 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  r+6] ){.    int 
a750: 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20  top;.    pbegin 
a760: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a770: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65  [hdr+1]);.    me
a780: 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31  mcpy(&data[hdr+1
a790: 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  ], &data[pbegin]
a7a0: 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20  , 2);.    top = 
a7b0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
a7c0: 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79 74  dr+5]) + get2byt
a7d0: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
a7e0: 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ]);.    put2byte
a7f0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
a800: 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  op);.  }.  asser
a810: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
a820: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
a830: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
a840: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
a860: 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
a870: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
a880: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
a890: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
a8a0: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
a8b0: 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
a8c0: 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
a8d0: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ordingly..**.** 
a8e0: 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Only the followi
a8f0: 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
a900: 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20  are supported.  
a910: 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65  Anything differe
a920: 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20  nt.** indicates 
a930: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
a940: 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  se files:.**.** 
a950: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
a960: 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  DATA.**         
a970: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50  PTF_ZERODATA | P
a980: 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20  TF_LEAF.**      
a990: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
a9a0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20  | PTF_INTKEY.** 
a9b0: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
a9c0: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
a9d0: 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a  Y | PTF_LEAF.*/.
a9e0: 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64  static int decod
a9f0: 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
aa00: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
aa10: 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
aa20: 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
aa30: 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
aa40: 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
aa50: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
aa60: 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
aa70: 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
aa80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
aa90: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
aaa0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
aab0: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61   );.  pPage->lea
aac0: 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74  f = (u8)(flagByt
aad0: 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20  e>>3);  assert( 
aae0: 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33  PTF_LEAF == 1<<3
aaf0: 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26   );.  flagByte &
ab00: 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70  = ~PTF_LEAF;.  p
ab10: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
ab20: 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e  ze = 4-4*pPage->
ab30: 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50  leaf;.  pBt = pP
ab40: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
ab50: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
ab60: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
ab70: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61  TKEY) ){.    pPa
ab80: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a  ge->intKey = 1;.
ab90: 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61      pPage->hasDa
aba0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  ta = pPage->leaf
abb0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
abc0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
abd0: 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  Leaf;.    pPage-
abe0: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
abf0: 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73  >minLeaf;.  }els
ac00: 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d  e if( flagByte==
ac10: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a  PTF_ZERODATA ){.
ac20: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
ac30: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
ac40: 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20  ->hasData = 0;. 
ac50: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
ac60: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
ac70: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
ac80: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
ac90: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
aca0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
acb0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
acc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
acd0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ace0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
acf0: 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
ad00: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
ad10: 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
ad20: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
ad30: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
ad40: 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
ad50: 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
ad60: 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
ad70: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
ad80: 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
ad90: 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
ada0: 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
adb0: 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
adc0: 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
add0: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
ade0: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
adf0: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
ae00: 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
ae10: 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
ae20: 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
ae30: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
ae40: 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61   int btreeInitPa
ae50: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
ae60: 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  e){..  assert( p
ae70: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
ae80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ae90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
aea0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
aeb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
aec0: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
aed0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
aee0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
aef0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
af00: 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
af10: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
af20: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
af30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
af40: 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
af50: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
af60: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
af70: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
af80: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36  sInit ){.    u16
af90: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
afa0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
afb0: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
afc0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
afd0: 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20  */.    u8 hdr;  
afe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
aff0: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
b000: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
b010: 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b  */.    u8 *data;
b020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
b030: 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
b040: 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72  ta */.    BtShar
b050: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
b060: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
b070: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
b080: 20 20 20 75 31 36 20 75 73 61 62 6c 65 53 69 7a     u16 usableSiz
b090: 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
b0a0: 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
b0b0: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
b0c0: 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73      u16 cellOffs
b0d0: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
b0e0: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
b0f0: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
b100: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
b110: 20 75 31 36 20 6e 46 72 65 65 3b 20 20 20 20 20   u16 nFree;     
b120: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b130: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
b140: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
b150: 20 75 31 36 20 74 6f 70 3b 20 20 20 20 20 20 20   u16 top;       
b160: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
b170: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
b180: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
b190: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
b1a0: 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
b1b0: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
b1c0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
b1d0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
b1e0: 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61  lLast;     /* La
b1f0: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
b200: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
b210: 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74  fset */..    pBt
b220: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a   = pPage->pBt;..
b230: 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
b240: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
b250: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
b260: 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63  ata;.    if( dec
b270: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
b280: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
b290: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
b2a0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
b2b0: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
b2c0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
b2d0: 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20  pageSize<=32768 
b2e0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
b2f0: 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61  skPage = pBt->pa
b300: 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20  geSize - 1;.    
b310: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
b320: 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65   = 0;.    usable
b330: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
b340: 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  leSize;.    pPag
b350: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
b360: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72  cellOffset = hdr
b370: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
b380: 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20 3d  >leaf;.    top =
b390: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b3a0: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61  hdr+5]);.    pPa
b3b0: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
b3c0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
b3d0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ]);.    if( pPag
b3e0: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
b3f0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
b400: 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
b410: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
b420: 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
b430: 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
b440: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b450: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b460: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
b470: 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
b480: 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ll==MX_CELL(pBt)
b490: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61   );..    /* A ma
b4a0: 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  lformed database
b4b0: 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73   page might caus
b4c0: 65 20 75 73 65 20 74 6f 20 72 65 61 64 20 70 61  e use to read pa
b4d0: 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a  st the end.    *
b4e0: 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
b4f0: 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
b500: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
b510: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
b520: 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b  ck of code check
b530: 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69  s early to see i
b540: 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73  f a cell extends
b550: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
b560: 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
b570: 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
b580: 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
b590: 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  T to be .    ** 
b5a0: 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
b5b0: 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oes..    */.    
b5c0: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
b5d0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
b5e0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43  e->nCell;.    iC
b5f0: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
b600: 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65  Size - 4;.#if de
b610: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
b620: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
b630: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20  L_CHECK).    {. 
b640: 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
b650: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
b660: 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  into the cell po
b670: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
b680: 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20       int sz;    
b690: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b6a0: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20  f a cell */..   
b6b0: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
b6c0: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d  eaf ) iCellLast-
b6d0: 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  -;.      for(i=0
b6e0: 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
b6f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
b700: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
b710: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
b720: 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *2]);.        te
b730: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
b740: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  lFirst );.      
b750: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
b760: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
b770: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
b780: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
b790: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
b7a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b7b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b7c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b7d0: 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
b7e0: 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  tr(pPage, &data[
b7f0: 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  pc]);.        te
b800: 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75  stcase( pc+sz==u
b810: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
b820: 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75       if( pc+sz>u
b830: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
b840: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
b850: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b860: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
b870: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
b880: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
b890: 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d  ellLast++;.    }
b8a0: 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f    .#endif..    /
b8b0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
b8c0: 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
b8d0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
b8e0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
b8f0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
b900: 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b     nFree = data[
b910: 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20  hdr+7] + top;.  
b920: 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b    while( pc>0 ){
b930: 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c  .      u16 next,
b940: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28   size;.      if(
b950: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
b960: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
b970: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
b980: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
b990: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
b9a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b9b0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
b9c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
b9d0: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
b9e0: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
b9f0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
ba00: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
ba10: 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26      if( next>0 &
ba20: 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  & next<=pc+size+
ba30: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  3 ){.        /* 
ba40: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
ba50: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
ba60: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
ba70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ba80: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
ba90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
baa0: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
bab0: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
bac0: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
bad0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
bae0: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
baf0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
bb00: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
bb10: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
bb20: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
bb30: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
bb40: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
bb50: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
bb60: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
bb70: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
bb80: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
bb90: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
bba0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
bbb0: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
bbc0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
bbd0: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
bbe0: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
bbf0: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
bc00: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
bc10: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
bc20: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
bc30: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
bc40: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
bc50: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
bc60: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
bc70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
bc80: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
bc90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
bca0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
bcb0: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
bcc0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65  ge->nFree = nFre
bcd0: 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 3b 0a  e - iCellFirst;.
bce0: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
bcf0: 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 1;.  }.  ret
bd00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
bd10: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
bd20: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
bd30: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
bd40: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
bd50: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
bd60: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
bd70: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
bd80: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
bd90: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
bda0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
bdb0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
bdc0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
bdd0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
bde0: 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d   u8 hdr = pPage-
bdf0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31  >hdrOffset;.  u1
be00: 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65  6 first;..  asse
be10: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
be20: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
be30: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
be40: 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  e->pgno );.  ass
be50: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
be60: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
be70: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
be80: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
be90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bea0: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
beb0: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61  ->pDbPage) == da
bec0: 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
bed0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
bee0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
bef0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
bf00: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
bf10: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
bf20: 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65  ex) );.  /*memse
bf30: 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c  t(&data[hdr], 0,
bf40: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
bf50: 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64 61 74   - hdr);*/.  dat
bf60: 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66  a[hdr] = (char)f
bf70: 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20  lags;.  first = 
bf80: 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c  hdr + 8 + 4*((fl
bf90: 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
bfa0: 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65 74   ?1:0);.  memset
bfb0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
bfc0: 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  , 4);.  data[hdr
bfd0: 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62  +7] = 0;.  put2b
bfe0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
bff0: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
c000: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
c010: 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ee = pBt->usable
c020: 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20  Size - first;.  
c030: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
c040: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
c050: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
c060: 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  hdr;.  pPage->ce
c070: 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74  llOffset = first
c080: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
c090: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65  flow = 0;.  asse
c0a0: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
c0b0: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
c0c0: 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29  ageSize<=32768 )
c0d0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ;.  pPage->maskP
c0e0: 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  age = pBt->pageS
c0f0: 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61 67 65  ize - 1;.  pPage
c100: 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
c110: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
c120: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
c130: 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
c140: 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
c150: 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
c160: 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
c170: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
c180: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
c190: 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
c1a0: 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
c1b0: 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
c1c0: 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
c1d0: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
c1e0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
c1f0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
c200: 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
c210: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20   pPage->aData = 
c220: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
c230: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
c240: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d  pPage->pDbPage =
c250: 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67   pDbPage;.  pPag
c260: 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
c270: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
c280: 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  no;.  pPage->hdr
c290: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
c2a0: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
c2b0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  0;.  return pPag
c2c0: 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e; .}../*.** Get
c2d0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
c2e0: 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c   pager.  Initial
c2f0: 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
c300: 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
c310: 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
c320: 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  s if needed..**.
c330: 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74  ** If the noCont
c340: 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ent flag is set,
c350: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
c360: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
c370: 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  out.** the conte
c380: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nt of the page a
c390: 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f  t this time.  So
c3a0: 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68   do not go to th
c3b0: 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74  e disk.** to fet
c3c0: 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20  ch the content. 
c3d0: 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68   Just fill in th
c3e0: 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a  e content with z
c3f0: 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a  eros for now..**
c400: 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72   If in the futur
c410: 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65  e we call sqlite
c420: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
c430: 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74   this page, that
c440: 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76  .** means we hav
c450: 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20  e started to be 
c460: 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20  concerned about 
c470: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20  content and the 
c480: 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f  disk.** read sho
c490: 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
c4a0: 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  t point..*/.stat
c4b0: 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50  ic int btreeGetP
c4c0: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
c4d0: 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
c4e0: 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
c4f0: 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
c500: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c510: 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
c520: 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
c530: 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
c540: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
c550: 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
c560: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
c570: 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  ent        /* Do
c580: 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63   not load page c
c590: 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a  ontent if true *
c5a0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
c5b0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
c5c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
c5d0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c5e0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c5f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
c600: 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
c610: 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
c620: 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
c630: 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69   noContent);.  i
c640: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
c650: 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62  c;.  *ppPage = b
c660: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
c670: 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
c680: 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  , pBt);.  return
c690: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
c6a0: 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20  *.** Retrieve a 
c6b0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
c6c0: 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
c6d0: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
c6e0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61   is not.** alrea
c6f0: 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  dy in the pager 
c700: 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c  cache return NUL
c710: 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  L. Initialize th
c720: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
c730: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
c740: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
c750: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
c760: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
c770: 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72  ageLookup(BtShar
c780: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
c790: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
c7a0: 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
c7b0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
c7c0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
c7d0: 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
c7e0: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
c7f0: 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
c800: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
c810: 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
c820: 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d  rn btreePageFrom
c830: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
c840: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a  pgno, pBt);.  }.
c850: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c860: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c870: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
c880: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
c890: 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  es. If there is 
c8a0: 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65  any kind of.** e
c8b0: 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75  rror, return ((u
c8c0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e  nsigned int)-1).
c8d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
c8e0: 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 42  pagerPagecount(B
c8f0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
c900: 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 2d 31 3b   int nPage = -1;
c910: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
c920: 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
c930: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
c940: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
c950: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
c960: 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Page);.  assert(
c970: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
c980: 7c 20 6e 50 61 67 65 3d 3d 2d 31 20 29 3b 0a 20  | nPage==-1 );. 
c990: 20 72 65 74 75 72 6e 20 28 50 67 6e 6f 29 6e 50   return (Pgno)nP
c9a0: 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  age;.}../*.** Ge
c9b0: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
c9c0: 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
c9d0: 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73  ialize it.  This
c9e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74   routine is just
c9f0: 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63   a.** convenienc
ca00: 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  e wrapper around
ca10: 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20   separate calls 
ca20: 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 28  to btreeGetPage(
ca30: 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65 65 49  ) and .** btreeI
ca40: 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a  nitPage()..**.**
ca50: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
ca60: 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 76 61  urs, then the va
ca70: 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73 20 73  lue *ppPage is s
ca80: 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66 69 6e  et to is undefin
ca90: 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65  ed. It.** may re
caa0: 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20  main unchanged, 
cab0: 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74  or it may be set
cac0: 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76   to an invalid v
cad0: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
cae0: 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61  int getAndInitPa
caf0: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
cb00: 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pBt,          /*
cb10: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
cb20: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
cb30: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
cb40: 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
cb50: 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d  ge to get */.  M
cb60: 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 20  emPage **ppPage 
cb70: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
cb80: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
cb90: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
cba0: 63 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 50  c;.  TESTONLY( P
cbb0: 67 6e 6f 20 69 4c 61 73 74 50 67 20 3d 20 70 61  gno iLastPg = pa
cbc0: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
cbd0: 29 3b 20 29 0a 20 20 61 73 73 65 72 74 28 20 73  ); ).  assert( s
cbe0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
cbf0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
cc00: 0a 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65  ..  rc = btreeGe
cc10: 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
cc20: 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69   ppPage, 0);.  i
cc30: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
cc40: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
cc50: 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61  eeInitPage(*ppPa
cc60: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
cc70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
cc80: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
cc90: 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  *ppPage);.    }.
cca0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
ccb0: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
ccc0: 6e 75 6d 62 65 72 20 77 61 73 20 65 69 74 68 65  number was eithe
ccd0: 72 20 30 20 6f 72 20 67 72 65 61 74 65 72 20 74  r 0 or greater t
cce0: 68 61 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a  han the page.  *
ccf0: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * number of the 
cd00: 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  last page in the
cd10: 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20   database, this 
cd20: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
cd30: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
cd40: 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 73 6f  TE_CORRUPT or so
cd50: 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 28  me other error (
cd60: 69 2e 65 2e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  i.e. SQLITE_FULL
cd70: 29 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ). Check that th
cd80: 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 63  is.  ** is the c
cd90: 61 73 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ase.  */.  asser
cda0: 74 28 20 28 70 67 6e 6f 3e 30 20 26 26 20 70 67  t( (pgno>0 && pg
cdb0: 6e 6f 3c 3d 69 4c 61 73 74 50 67 29 20 7c 7c 20  no<=iLastPg) || 
cdc0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
cdd0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
cde0: 6f 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  o==0 );.  testca
cdf0: 73 65 28 20 70 67 6e 6f 3d 3d 69 4c 61 73 74 50  se( pgno==iLastP
ce00: 67 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  g );..  return r
ce10: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  c;.}../*.** Rele
ce20: 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20  ase a MemPage.  
ce30: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63  This should be c
ce40: 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
ce50: 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c  ach prior.** cal
ce60: 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67  l to btreeGetPag
ce70: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
ce80: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
ce90: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
cea0: 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
ceb0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
cec0: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
ced0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
cee0: 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 2d  eRefcount(pPage-
cef0: 3e 70 44 62 50 61 67 65 29 3e 31 20 29 3b 0a 20  >pDbPage)>1 );. 
cf00: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
cf10: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
cf20: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
cf30: 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
cf40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
cf50: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
cf60: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
cf70: 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73  pPage );.    ass
cf80: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
cf90: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
cfa0: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
cfb0: 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
cfc0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
cfd0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
cfe0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
cff0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
d000: 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  nref(pPage->pDbP
d010: 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
d020: 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
d030: 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
d040: 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
d050: 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
d060: 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
d070: 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
d080: 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
d090: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
d0a0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
d0b0: 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
d0c0: 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
d0d0: 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
d0e0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
d0f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
d100: 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
d110: 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
d120: 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
d130: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
d140: 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
d150: 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
d160: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
d170: 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
d180: 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a  DbPage *pData){.
d190: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
d1a0: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
d1b0: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
d1c0: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
d1d0: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  a);.  assert( sq
d1e0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
d1f0: 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20  fcount(pData)>0 
d200: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
d210: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73  isInit ){.    as
d220: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d230: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
d240: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d250: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
d260: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
d270: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
d280: 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20  fcount(pData)>1 
d290: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ){.      /* pPag
d2a0: 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  e might not be a
d2b0: 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74   btree page;  it
d2c0: 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65   might be an ove
d2d0: 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20  rflow page.     
d2e0: 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61   ** or ptrmap pa
d2f0: 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67  ge or a free pag
d300: 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73  e.  In those cas
d310: 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  es, the followin
d320: 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20  g.      ** call 
d330: 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  to btreeInitPage
d340: 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  () will likely r
d350: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
d360: 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42  RUPT..      ** B
d370: 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f  ut no harm is do
d380: 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64  ne by this.  And
d390: 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f   it is very impo
d3a0: 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20  rtant that.     
d3b0: 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67   ** btreeInitPag
d3c0: 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  e() be called on
d3d0: 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67   every btree pag
d3e0: 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20  e so we make.   
d3f0: 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66     ** the call f
d400: 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68  or every page th
d410: 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20  at comes in for 
d420: 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20  re-initing. */. 
d430: 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61       btreeInitPa
d440: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
d450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
d460: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
d470: 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65  ndler for a btre
d480: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
d490: 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
d4a0: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41  Handler(void *pA
d4b0: 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  rg){.  BtShared 
d4c0: 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64  *pBt = (BtShared
d4d0: 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74  *)pArg;.  assert
d4e0: 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61  ( pBt->db );.  a
d4f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d500: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64  utex_held(pBt->d
d510: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
d520: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76  eturn sqlite3Inv
d530: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26  okeBusyHandler(&
d540: 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e  pBt->db->busyHan
d550: 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dler);.}../*.** 
d560: 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
d570: 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
d580: 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
d590: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
d5a0: 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
d5b0: 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
d5c0: 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  * a new database
d5d0: 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e   with a random n
d5e0: 61 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ame is created. 
d5f0: 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e   This randomly n
d600: 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65  amed.** database
d610: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
d620: 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74  leted when sqlit
d630: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69  e3BtreeClose() i
d640: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20  s called..** If 
d650: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
d660: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
d670: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
d680: 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
d690: 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
d6a0: 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
d6b0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
d6c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
d6d0: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
d6e0: 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74  eady opened in t
d6f0: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
d700: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
d710: 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61  nd we are in sha
d720: 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20  red cache mode, 
d730: 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69  then the open wi
d740: 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a  ll fail with an.
d750: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  ** SQLITE_CONSTR
d760: 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20  AINT error.  We 
d770: 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f  cannot allow two
d780: 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65   or more BtShare
d790: 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20  d.** objects in 
d7a0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
d7b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e  e connection sin
d7c0: 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c  ce doing so will
d7d0: 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62   lead.** to prob
d7e0: 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e  lems with lockin
d7f0: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
d800: 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f  3BtreeOpen(.  co
d810: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
d820: 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
d830: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
d840: 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
d850: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
d860: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
d870: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
d880: 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
d890: 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
d8a0: 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
d8b0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
d8c0: 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
d8d0: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
d8e0: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
d8f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
d900: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ons */.  int vfs
d910: 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
d920: 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
d930: 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
d940: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
d950: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
d960: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
d970: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
d980: 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
d990: 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53  s btree */.  BtS
d9a0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d9c0: 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
d9d0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
d9e0: 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
da10: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
da20: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
da30: 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
da40: 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
da50: 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
da60: 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
da70: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
da80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
da90: 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
daa0: 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
dab0: 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dad0: 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
dae0: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
daf0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
db00: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
db10: 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
db20: 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
db30: 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74 20  nt */..  /* Set 
db40: 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
db50: 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
db60: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
db70: 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
db80: 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
db90: 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
dba0: 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69 73  . This symbol is
dbb0: 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69   only required i
dbc0: 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 66  f.  ** either of
dbd0: 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74 61   the shared-data
dbe0: 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20 66   or autovacuum f
dbf0: 65 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d 70  eatures are comp
dc00: 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20  iled .  ** into 
dc10: 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a  the library..  *
dc20: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
dc30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
dc40: 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65 66  D_CACHE) || !def
dc50: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
dc60: 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20 23  _AUTOVACUUM).  #
dc70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
dc80: 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 63  T_MEMORYDB.    c
dc90: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
dca0: 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20   = 0;.  #else.  
dcb0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
dcc0: 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20  mdb = zFilename 
dcd0: 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69 6c 65  && !strcmp(zFile
dce0: 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
dcf0: 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e 64  );.  #endif.#end
dd00: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
dd10: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
dd20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
dd30: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
dd40: 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64 62 2d 3e  ;..  pVfs = db->
dd50: 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71 6c 69  pVfs;.  p = sqli
dd60: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
dd70: 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
dd80: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
dd90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
dda0: 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  M;.  }.  p->inTr
ddb0: 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
ddc0: 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
ddd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
dde0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
ddf0: 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  .  p->lock.pBtre
de00: 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b  e = p;.  p->lock
de10: 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e  .iTable = 1;.#en
de20: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
de30: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
de40: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
de50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
de60: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
de70: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74  .  ** If this Bt
de80: 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61  ree is a candida
de90: 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61  te for shared ca
dea0: 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64  che, try to find
deb0: 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e   an.  ** existin
dec0: 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  g BtShared objec
ded0: 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68  t that we can sh
dee0: 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20  are with.  */.  
def0: 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20 26  if( isMemdb==0 &
df00: 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  & zFilename && z
df10: 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
df20: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
df30: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65  obalConfig.share
df40: 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b  dCacheEnabled ){
df50: 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c  .      int nFull
df60: 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
df70: 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
df80: 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c       char *zFull
df90: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
dfa0: 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61  e3Malloc(nFullPa
dfb0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  thname);.      s
dfc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
dfd0: 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20  texShared;.     
dfe0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
dff0: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  ;.      db->flag
e000: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72  s |= SQLITE_Shar
e010: 65 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69  edCache;.      i
e020: 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  f( !zFullPathnam
e030: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
e040: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
e050: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e060: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
e070: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
e080: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
e090: 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
e0a0: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
e0b0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
e0c0: 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d       mutexOpen =
e0d0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
e0e0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
e0f0: 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20  STATIC_OPEN);.  
e100: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
e110: 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65  x_enter(mutexOpe
e120: 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53  n);.      mutexS
e130: 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
e140: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
e150: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
e160: 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c  STER);.      sql
e170: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
e180: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
e190: 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
e1a0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
e1b0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
e1c0: 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
e1d0: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
e1e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
e1f0: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
e200: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
e210: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
e220: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
e230: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
e240: 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r)).            
e250: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
e260: 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
e270: 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
e280: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
e290: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
e2a0: 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44  Db=db->nDb-1; iD
e2b0: 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20  b>=0; iDb--){.  
e2c0: 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20            Btree 
e2d0: 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d  *pExisting = db-
e2e0: 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
e2f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
e300: 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69  Existing && pExi
e310: 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20  sting->pBt==pBt 
e320: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
e330: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
e340: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
e350: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
e360: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
e370: 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
e380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
e390: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
e3a0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
e3b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e3c0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
e3d0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
e3e0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
e3f0: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  T;.            }
e400: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
e410: 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
e420: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pBt;.          p
e430: 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
e440: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e450: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e460: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
e470: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
e480: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ared);.      sql
e490: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
e4a0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
e4b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
e4c0: 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
e4d0: 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20      /* In debug 
e4e0: 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c  mode, we mark al
e4f0: 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74  l persistent dat
e500: 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62  abases as sharab
e510: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  le.      ** even
e520: 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e   when they are n
e530: 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69  ot.  This exerci
e540: 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
e550: 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  code and.      *
e560: 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70  * gives more opp
e570: 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73  ortunity for ass
e580: 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74  erts(sqlite3_mut
e590: 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20  ex_held()).     
e5a0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74   ** statements t
e5b0: 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70  o find locking p
e5c0: 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a  roblems..      *
e5d0: 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  /.      p->shara
e5e0: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ble = 1;.    }.#
e5f0: 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
e600: 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
e610: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
e620: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
e630: 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
e640: 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
e650: 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
e660: 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
e670: 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
e680: 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
e690: 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
e6a0: 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
e6b0: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69     ** when compi
e6c0: 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
e6d0: 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
e6e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
e6f0: 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
e700: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36  ==8 || sizeof(i6
e710: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
e720: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
e730: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36  ==8 || sizeof(u6
e740: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
e750: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29  ert( sizeof(u32)
e760: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
e770: 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d  t( sizeof(u16)==
e780: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
e790: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34   sizeof(Pgno)==4
e7a0: 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d   );.  .    pBt =
e7b0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
e7c0: 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29  ro( sizeof(*pBt)
e7d0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d   );.    if( pBt=
e7e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
e7f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e800: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
e810: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
e820: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e830: 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20  PagerOpen(pVfs, 
e840: 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46  &pBt->pPager, zF
e850: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e870: 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66     EXTRA_SIZE, f
e880: 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b  lags, vfsFlags);
e890: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
e8a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e8b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
e8c0: 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
e8d0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
e8e0: 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
e8f0: 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
e900: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e910: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
e920: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
e930: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
e940: 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
e950: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
e960: 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
e970: 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
e980: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
e990: 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
e9a0: 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73   = pBt;.  .    s
e9b0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65  qlite3PagerSetRe
e9c0: 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67  initer(pBt->pPag
e9d0: 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  er, pageReinit);
e9e0: 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
e9f0: 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
ea00: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
ea10: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
ea20: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
ea30: 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
ea40: 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  er);.    pBt->pa
ea50: 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74  geSize = get2byt
ea60: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  e(&zDbHeader[16]
ea70: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
ea80: 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
ea90: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
eaa0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
eab0: 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ZE.         || (
eac0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31  (pBt->pageSize-1
ead0: 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )&pBt->pageSize)
eae0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
eaf0: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a  ->pageSize = 0;.
eb00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
eb10: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
eb20: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d       /* If the m
eb30: 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f  agic name ":memo
eb40: 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65  ry:" will create
eb50: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
eb60: 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20  tabase, then.   
eb70: 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20     ** leave the 
eb80: 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20  autoVacuum mode 
eb90: 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74  at 0 (do not aut
eba0: 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20  o-vacuum), even 
ebb0: 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
ebc0: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
ebd0: 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f  ACUUM is true. O
ebe0: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
ebf0: 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  , if.      ** SQ
ec00: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
ec10: 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69  DB has been defi
ec20: 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f  ned, then ":memo
ec30: 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20  ry:" is just a. 
ec40: 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20       ** regular 
ec50: 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68  file-name. In th
ec60: 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f  is case the auto
ec70: 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20  -vacuum applies 
ec80: 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20  as per normal.. 
ec90: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
eca0: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  ( zFilename && !
ecb0: 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20  isMemdb ){.     
ecc0: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
ecd0: 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
ece0: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
ecf0: 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
ed00: 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
ed10: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
ed20: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d  ULT_AUTOVACUUM==
ed30: 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  2 ? 1 : 0);.    
ed40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
ed50: 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20   nReserve = 0;. 
ed60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ed70: 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65  nReserve = zDbHe
ed80: 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20  ader[20];.      
ed90: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
eda0: 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  ed = 1;.#ifndef 
edb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
edc0: 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74  VACUUM.      pBt
edd0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
ede0: 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
edf0: 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  der[36 + 4*4])?1
ee00: 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  :0);.      pBt->
ee10: 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
ee20: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
ee30: 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  r[36 + 7*4])?1:0
ee40: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
ee50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ee60: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
ee70: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
ee80: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
ee90: 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28  eserve);.    if(
eea0: 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65   rc ) goto btree
eeb0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70  _open_out;.    p
eec0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
eed0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
eee0: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61   nReserve;.    a
eef0: 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67  ssert( (pBt->pag
ef00: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
ef10: 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67    /* 8-byte alig
ef20: 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a  nment of pageSiz
ef30: 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65  e */.   .#if !de
ef40: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
ef50: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
ef60: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
ef70: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
ef80: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
ef90: 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
efa0: 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
efb0: 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
efc0: 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
efd0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
efe0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71  able ){.      sq
eff0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
f000: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
f010: 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
f020: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
f030: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
f040: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
f050: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
f060: 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
f070: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
f080: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
f090: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
f0a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
f0b0: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
f0c0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
f0d0: 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
f0e0: 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
f0f0: 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
f100: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f110: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
f120: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
f130: 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
f140: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
f150: 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  n_out;.        }
f160: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
f170: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f180: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
f190: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  .      pBt->pNex
f1a0: 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
f1b0: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
f1c0: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
f1d0: 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
f1e0: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
f1f0: 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
f200: 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Bt;.      sqlite
f210: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
f220: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
f230: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
f240: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
f250: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
f260: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
f270: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
f280: 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65  KIO).  /* If the
f290: 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20   new Btree uses 
f2a0: 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68  a sharable pBtSh
f2b0: 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20  ared, then link 
f2c0: 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72  the new.  ** Btr
f2d0: 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  ee into the list
f2e0: 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65   of all sharable
f2f0: 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20   Btrees for the 
f300: 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
f310: 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69  .  ** The list i
f320: 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64  s kept in ascend
f330: 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74  ing order by pBt
f340: 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20   address..  */. 
f350: 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
f360: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
f370: 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a     Btree *pSib;.
f380: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
f390: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
f3a0: 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20      if( (pSib = 
f3b0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21  db->aDb[i].pBt)!
f3c0: 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72  =0 && pSib->shar
f3d0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
f3e0: 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72  while( pSib->pPr
f3f0: 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69  ev ){ pSib = pSi
f400: 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20  b->pPrev; }.    
f410: 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70      if( p->pBt<p
f420: 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  Sib->pBt ){.    
f430: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
f440: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
f450: 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
f460: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
f470: 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
f480: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f490: 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
f4a0: 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70  pNext && pSib->p
f4b0: 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74  Next->pBt<p->pBt
f4c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f4d0: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65  pSib = pSib->pNe
f4e0: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
f4f0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
f500: 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  xt = pSib->pNext
f510: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
f520: 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20  Prev = pSib;.   
f530: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e         if( p->pN
f540: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ext ){.         
f550: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
f560: 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
f570: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53    }.          pS
f580: 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ib->pNext = p;. 
f590: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f5a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
f5b0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
f5c0: 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b  .  *ppBtree = p;
f5d0: 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  ..btree_open_out
f5e0: 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
f5f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
f600: 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
f610: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
f620: 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
f630: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
f640: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
f650: 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
f660: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
f670: 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
f680: 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
f690: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
f6a0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
f6b0: 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
f6c0: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
f6d0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
f6e0: 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72  exOpen);.  }.  r
f6f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f700: 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
f710: 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
f720: 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74  ounter.  When it
f730: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a   reaches zero,.*
f740: 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53  * remove the BtS
f750: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
f760: 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67  from the sharing
f770: 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a   list.  Return.*
f780: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74  * true if the Bt
f790: 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
f7a0: 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ter reaches zero
f7b0: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66   and return.** f
f7c0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74  alse if it is st
f7d0: 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f  ill positive..*/
f7e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f  .static int remo
f7f0: 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
f800: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
f810: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
f820: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
f830: 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  HE.  sqlite3_mut
f840: 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42  ex *pMaster;.  B
f850: 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a  tShared *pList;.
f860: 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20    int removed = 
f870: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
f880: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
f890: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
f8a0: 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73  );.  pMaster = s
f8b0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
f8c0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
f8d0: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
f8e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
f8f0: 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
f900: 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
f910: 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
f920: 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
f930: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
f940: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
f950: 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
f960: 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
f970: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
f980: 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
f990: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
f9a0: 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
f9b0: 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
f9c0: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
f9d0: 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
f9e0: 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
f9f0: 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
fa00: 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
fa10: 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
fa20: 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
fa30: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
fa40: 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
fa50: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
fa60: 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
fa70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fa80: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
fa90: 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
faa0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
fab0: 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
fac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
fad0: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
fae0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
faf0: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
fb00: 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
fb10: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
fb20: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
fb30: 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
fb40: 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
fb50: 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
fb60: 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
fb70: 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
fb80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
fb90: 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
fba0: 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
fbb0: 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  ){.  if( !pBt->p
fbc0: 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
fbd0: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
fbe0: 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
fbf0: 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
fc00: 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e );.  }.}../*.*
fc10: 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
fc20: 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
fc30: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
fc40: 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
fc50: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
fc60: 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  {.  sqlite3PageF
fc70: 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70  ree( pBt->pTmpSp
fc80: 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d  ace);.  pBt->pTm
fc90: 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  pSpace = 0;.}../
fca0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
fcb0: 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
fcc0: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
fcd0: 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
fce0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
fcf0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
fd00: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
fd10: 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
fd20: 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
fd30: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
fd40: 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
fd50: 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
fd60: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
fd70: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
fd80: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
fd90: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
fda0: 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
fdb0: 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
fdc0: 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
fdd0: 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
fde0: 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
fdf0: 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
fe00: 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
fe10: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
fe20: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
fe30: 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
fe40: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
fe50: 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
fe60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
fe70: 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
fe80: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
fe90: 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
fea0: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
feb0: 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
fec0: 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
fed0: 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
fee0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
fef0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
ff00: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
ff10: 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
ff20: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
ff30: 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
ff40: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
ff50: 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
ff60: 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
ff70: 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
ff80: 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
ff90: 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
ffa0: 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
ffb0: 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
ffc0: 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
ffd0: 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
ffe0: 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
fff0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
10000 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
10010 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
10020 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
10030 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
10040 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
10050 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
10060 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
10070 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
10080 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
10090 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
100a0 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
100b0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
100c0 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
100d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
100e0 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
100f0 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
10100 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
10110 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
10120 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
10130 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
10140 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
10150 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
10160 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
10170 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10180 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  e(pBt->pSchema);
10190 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
101a0 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
101b0 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
101c0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
101d0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
101e0 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
101f0 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
10200 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
10210 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
10220 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
10230 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
10240 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
10250 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
10260 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
10270 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
10280 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10290 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
102a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
102b0 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
102c0 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
102d0 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20  f pages allowed 
102e0 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
102f0 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
10300 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  number of cache 
10310 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20  pages is set to 
10320 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20  the absolute.** 
10330 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e  value of mxPage.
10340 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e    If mxPage is n
10350 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67  egative, the pag
10360 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61  er will.** opera
10370 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  te asynchronousl
10380 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  y - it will not 
10390 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63  stop to do fsync
103a0 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65  ()s.** to insure
103b0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
103c0 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72   to the disk sur
103d0 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63  face before.** c
103e0 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e  ontinuing.  Tran
103f0 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77  sactions still w
10400 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  ork if synchrono
10410 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e  us is off,.** an
10420 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
10430 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  annot be corrupt
10440 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72  ed if this progr
10450 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20  am.** crashes.  
10460 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  But if the opera
10470 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
10480 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a  hes or there is.
10490 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  ** an abrupt pow
104a0 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20  er failure when 
104b0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
104c0 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ff, the database
104d0 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66  .** could be lef
104e0 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
104f0 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76  tent and unrecov
10500 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a  erable state..**
10510 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   Synchronous is 
10520 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f  on by default so
10530 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
10540 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e  tion is not.** n
10550 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e  ormally a worry.
10560 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
10570 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
10580 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
10590 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
105a0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
105b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
105c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
105d0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
105e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
105f0 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
10600 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
10610 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
10620 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
10630 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
10640 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10650 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
10660 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74  ange the way dat
10670 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64  a is synced to d
10680 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  isk in order to 
10690 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72  increase or decr
106a0 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c  ease.** how well
106b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
106c0 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65  sists damage due
106d0 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61   to OS crashes a
106e0 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c  nd power.** fail
106f0 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69  ures.  Level 1 i
10700 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73  s the same as as
10710 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73  ynchronous (no s
10720 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64  yncs() occur and
10730 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68  .** there is a h
10740 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  igh probability 
10750 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65  of damage)  Leve
10760 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75  l 2 is the defau
10770 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73  lt.  There.** is
10780 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20   a very low but 
10790 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69  non-zero probabi
107a0 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20  lity of damage. 
107b0 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73   Level 3 reduces
107c0 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c   the.** probabil
107d0 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f  ity of damage to
107e0 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77   near zero but w
107f0 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66  ith a write perf
10800 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
10810 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  n..*/.#ifndef SQ
10820 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
10830 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69  PRAGMAS.int sqli
10840 74 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74  te3BtreeSetSafet
10850 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c  yLevel(Btree *p,
10860 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
10870 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53  fullSync){.  BtS
10880 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
10890 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
108a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
108b0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
108c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
108d0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
108e0 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
108f0 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61  tyLevel(pBt->pPa
10900 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c  ger, level, full
10910 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  Sync);.  sqlite3
10920 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
10930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10940 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
10950 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
10960 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
10970 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
10980 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
10990 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
109a0 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
109b0 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
109c0 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
109d0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
109e0 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
109f0 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
10a00 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
10a10 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
10a20 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
10a30 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
10a40 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
10a50 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
10a60 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
10a70 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
10a80 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
10a90 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
10aa0 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
10ab0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
10ac0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
10ad0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64  rn rc;.}..#if !d
10ae0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
10af0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
10b00 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
10b10 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
10b20 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  )./*.** Change t
10b30 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73  he default pages
10b40 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75   size and the nu
10b50 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
10b60 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e   bytes per page.
10b70 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70  .** Or, if the p
10b80 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72  age size has alr
10b90 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c  eady been fixed,
10ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
10bb0 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68  EADONLY .** with
10bc0 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79  out changing any
10bd0 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  thing..**.** The
10be0 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
10bf0 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
10c00 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
10c10 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
10c20 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
10c30 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
10c40 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
10c50 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
10c60 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
10c70 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
10c80 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
10c90 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
10ca0 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
10cb0 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
10cc0 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
10cd0 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
10ce0 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
10cf0 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
10d00 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
10d10 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
10d20 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
10d30 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
10d40 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
10d50 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
10d60 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
10d70 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
10d80 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
10d90 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
10da0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
10db0 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
10dc0 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
10dd0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
10de0 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74  If the iFix!=0 t
10df0 68 65 6e 20 74 68 65 20 70 61 67 65 53 69 7a 65  hen the pageSize
10e00 46 69 78 65 64 20 66 6c 61 67 20 69 73 20 73 65  Fixed flag is se
10e10 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  t so that the pa
10e20 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61  ge size.** and a
10e30 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63  utovacuum mode c
10e40 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  an no longer be 
10e50 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
10e60 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
10e70 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
10e80 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20  , int pageSize, 
10e90 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e  int nReserve, in
10ea0 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72  t iFix){.  int r
10eb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10ec0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
10ed0 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
10ee0 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20  t( nReserve>=-1 
10ef0 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
10f00 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
10f10 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
10f20 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ( pBt->pageSizeF
10f30 69 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  ixed ){.    sqli
10f40 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
10f50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
10f60 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
10f70 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  }.  if( nReserve
10f80 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72  <0 ){.    nReser
10f90 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ve = pBt->pageSi
10fa0 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
10fb0 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Size;.  }.  asse
10fc0 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
10fd0 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
10fe0 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69   );.  if( pageSi
10ff0 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
11000 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
11010 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20  PAGE_SIZE &&.   
11020 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d       ((pageSize-
11030 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20  1)&pageSize)==0 
11040 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
11050 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
11060 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11070 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20  !pBt->pPage1 && 
11080 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
11090 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
110a0 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69  ze = (u16)pageSi
110b0 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  ze;.    freeTemp
110c0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a  Space(pBt);.  }.
110d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
110e0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
110f0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
11100 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
11110 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73  erve);.  pBt->us
11120 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
11130 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29  pageSize - (u16)
11140 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20  nReserve;.  if( 
11150 69 46 69 78 20 29 20 70 42 74 2d 3e 70 61 67 65  iFix ) pBt->page
11160 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 20  SizeFixed = 1;. 
11170 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11180 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11190 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
111a0 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  urn the currentl
111b0 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73  y defined page s
111c0 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
111d0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
111e0 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ze(Btree *p){.  
111f0 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
11200 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ageSize;.}../*.*
11210 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
11220 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
11230 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
11240 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
11250 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
11260 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
11270 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
11280 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
11290 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
112a0 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
112b0 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  xtensions..*/.in
112c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
112d0 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  tReserve(Btree *
112e0 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
112f0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11300 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  (p);.  n = p->pB
11310 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
11320 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
11330 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11340 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11350 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
11360 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
11370 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
11380 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
11390 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
113a0 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
113b0 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
113c0 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
113d0 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
113e0 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
113f0 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
11400 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
11410 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
11420 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
11430 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
11440 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
11450 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
11460 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
11470 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
11480 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
11490 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
114a0 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
114b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
114c0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65    return n;.}.#e
114d0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
114e0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
114f0 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
11500 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11510 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a  MIT_VACUUM) */..
11520 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
11530 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
11540 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
11550 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
11560 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
11570 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
11580 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
11590 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
115a0 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
115b0 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
115c0 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
115d0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
115e0 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
115f0 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
11600 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
11610 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
11620 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
11630 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11640 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
11650 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
11660 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
11670 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11680 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
11690 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
116a0 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
116b0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
116c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
116d0 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
116e0 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
116f0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
11700 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
11710 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
11720 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29  xed && (av ?1:0)
11730 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
11740 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
11750 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
11760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
11770 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
11780 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
11790 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
117a0 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
117b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
117c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
117d0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
117e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
117f0 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
11800 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
11810 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
11820 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
11830 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
11840 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
11850 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
11860 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
11870 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
11880 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
11890 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
118a0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
118b0 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
118c0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
118d0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
118e0 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
118f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
11900 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
11910 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
11920 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
11930 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
11940 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
11950 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
11960 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
11970 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
11980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
11990 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
119a0 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
119b0 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
119c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
119d0 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
119e0 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
119f0 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
11a00 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
11a10 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
11a20 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
11a30 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
11a40 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
11a50 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
11a60 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
11a70 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
11a80 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
11a90 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
11aa0 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
11ab0 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
11ac0 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
11ad0 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
11ae0 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
11af0 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
11b00 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
11b10 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
11b20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
11b30 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20  .  int nPage;.. 
11b40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11b50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
11b60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
11b70 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
11b80 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
11b90 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
11ba0 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  Lock(pBt->pPager
11bb0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
11bc0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
11bd0 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  rc;.  rc = btree
11be0 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
11bf0 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
11c00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11c10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
11c20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
11c30 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
11c40 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
11c50 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
11c60 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
11c70 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
11c80 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
11c90 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
11ca0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
11cb0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
11cc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11cd0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
11ce0 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65  _failed;.  }else
11cf0 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
11d00 20 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65      int pageSize
11d10 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65  ;.    int usable
11d20 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
11d30 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
11d40 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
11d50 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
11d60 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
11d70 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
11d80 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
11d90 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
11da0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
11db0 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
11dc0 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >1 ){.      pBt-
11dd0 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
11de0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
11df0 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
11e00 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
11e10 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
11e20 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
11e30 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61  mum embedded fra
11e40 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78  ction must be ex
11e50 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20  actly 25%.  And 
11e60 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20  the minimum.    
11e70 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61 63  ** embedded frac
11e80 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e  tion must be 12.
11e90 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66  5% for both leaf
11ea0 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65  -data and non-le
11eb0 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20  af-data..    ** 
11ec0 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
11ed0 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73  ign allowed thes
11ee0 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72  e amounts to var
11ef0 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20  y, but as of.   
11f00 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e   ** version 3.6.
11f10 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68  0, we require th
11f20 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a  em to be fixed..
11f30 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d      */.    if( m
11f40 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d  emcmp(&page1[21]
11f50 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22  , "\100\040\040"
11f60 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,3)!=0 ){.      
11f70 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
11f80 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
11f90 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74    pageSize = get
11fa0 32 62 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d  2byte(&page1[16]
11fb0 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  );.    if( ((pag
11fc0 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
11fd0 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a  e)!=0 || pageSiz
11fe0 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20 20 20  e<512 ||.       
11ff0 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47   (SQLITE_MAX_PAG
12000 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26 26 20  E_SIZE<32768 && 
12010 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
12020 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20  MAX_PAGE_SIZE). 
12030 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
12040 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
12050 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ed;.    }.    as
12060 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
12070 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75  & 7)==0 );.    u
12080 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65  sableSize = page
12090 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d  Size - page1[20]
120a0 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53 69  ;.    if( pageSi
120b0 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze!=pBt->pageSiz
120c0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66  e ){.      /* Af
120d0 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  ter reading the 
120e0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
120f0 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d  e database assum
12100 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a  ing a page size.
12110 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68        ** of BtSh
12120 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77  ared.pageSize, w
12130 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65  e have discovere
12140 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
12150 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  size is.      **
12160 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69   actually pageSi
12170 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  ze. Unlock the d
12180 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70  atabase, leave p
12190 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20  Bt->pPage1 at.  
121a0 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20      ** zero and 
121b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
121c0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
121d0 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  l call this func
121e0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67  tion.      ** ag
121f0 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72  ain with the cor
12200 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a  rect page-size..
12210 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
12220 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
12230 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75  1);.      pBt->u
12240 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36  sableSize = (u16
12250 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20  )usableSize;.   
12260 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
12270 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65   = (u16)pageSize
12280 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
12290 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
122a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
122b0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
122c0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
122d0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12300 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
12310 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
12320 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
12330 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34  if( usableSize<4
12340 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  80 ){.      goto
12350 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
12360 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
12370 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75  t->pageSize = (u
12380 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  16)pageSize;.   
12390 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
123a0 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53 69   = (u16)usableSi
123b0 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ze;.#ifndef SQLI
123c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
123d0 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
123e0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
123f0 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34  te(&page1[36 + 4
12400 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70  *4])?1:0);.    p
12410 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
12420 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
12430 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  1[36 + 7*4])?1:0
12440 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
12450 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20   /* maxLocal is 
12460 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
12470 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f  nt of payload to
12480 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66   store locally f
12490 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20  or.  ** a cell. 
124a0 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   Make sure it is
124b0 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f   small enough so
124c0 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d   that at least m
124d0 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65  inFanout.  ** ce
124e0 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74  lls can will fit
124f0 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57   on one page.  W
12500 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79  e assume a 10-by
12510 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  te page header..
12520 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65    ** Besides the
12530 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65   payload, the ce
12540 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20  ll must store:. 
12550 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70   **     2-byte p
12560 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
12570 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ll.  **     4-by
12580 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
12590 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65  .  **     9-byte
125a0 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a   nKey value.  **
125b0 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74       4-byte nDat
125c0 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  a value.  **    
125d0 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4-byte overflow
125e0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20   page pointer.  
125f0 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e  ** So a cell con
12600 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74  sists of a 2-byt
12610 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64  e poiner, a head
12620 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
12630 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
12640 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
12650 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
12660 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
12670 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
12680 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
12690 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
126a0 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70  t->maxLocal = (p
126b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
126c0 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*64/255 - 23;.
126d0 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
126e0 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
126f0 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
12700 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  23;.  pBt->maxLe
12710 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  af = pBt->usable
12720 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74  Size - 35;.  pBt
12730 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74  ->minLeaf = (pBt
12740 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
12750 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *32/255 - 23;.  
12760 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
12770 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
12780 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
12790 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
127a0 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75  = pPage1;.  retu
127b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
127c0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
127d0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
127e0 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
127f0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
12800 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12810 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
12820 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  o outstanding cu
12830 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65  rsors and we are
12840 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64   not in the midd
12850 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73  le.** of a trans
12860 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65  action but there
12870 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20   is a read lock 
12880 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  on the database,
12890 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
128a0 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65  utine unrefs the
128b0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
128c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
128d0 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74   which .** has t
128e0 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c  he effect of rel
128f0 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20  easing the read 
12900 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
12910 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
12920 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
12930 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
12940 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
12950 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
12960 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
12970 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
12980 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12990 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
129a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
129b0 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f  ert( pBt->pCurso
129c0 72 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  r==0 || pBt->inT
129d0 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53  ransaction>TRANS
129e0 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70  _NONE );.  if( p
129f0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
12a00 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
12a10 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
12a20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
12a30 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
12a40 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
12a50 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
12a60 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
12a70 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  r)==1 );.    ass
12a80 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
12a90 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72  ->aData );.    r
12aa0 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e  eleasePage(pBt->
12ab0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74  pPage1);.    pBt
12ac0 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
12ad0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  }.}../*.** Creat
12ae0 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  e a new database
12af0 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
12b00 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
12b10 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a  of the.** file..
12b20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
12b30 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
12b40 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
12b50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
12b60 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
12b70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
12b80 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72   nPage;..  asser
12b90 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12ba0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
12bb0 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
12bc0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
12bd0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
12be0 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
12bf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e  !=SQLITE_OK || n
12c00 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65  Page>0 ){.    re
12c10 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
12c20 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
12c30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
12c40 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
12c50 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
12c60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
12c70 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
12c80 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
12c90 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
12ca0 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
12cb0 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
12cc0 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
12cd0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
12ce0 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
12cf0 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
12d00 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61  ata[16], pBt->pa
12d10 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
12d20 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
12d30 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  19] = 1;.  asser
12d40 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
12d50 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze<=pBt->pageSiz
12d60 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65  e && pBt->usable
12d70 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70  Size+255>=pBt->p
12d80 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
12d90 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d  [20] = (u8)(pBt-
12da0 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
12db0 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
12dc0 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20  data[21] = 64;. 
12dd0 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a   data[22] = 32;.
12de0 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b    data[23] = 32;
12df0 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
12e00 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
12e10 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
12e20 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
12e30 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
12e40 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65  A );.  pBt->page
12e50 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23  SizeFixed = 1;.#
12e60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12e70 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
12e80 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
12e90 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  oVacuum==1 || pB
12ea0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30  t->autoVacuum==0
12eb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
12ec0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31  t->incrVacuum==1
12ed0 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63   || pBt->incrVac
12ee0 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34  uum==0 );.  put4
12ef0 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
12f00 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56  4*4], pBt->autoV
12f10 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79  acuum);.  put4by
12f20 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a  te(&data[36 + 7*
12f30 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  4], pBt->incrVac
12f40 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  uum);.#endif.  r
12f50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
12f70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77  t to start a new
12f80 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
12f90 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
12fa0 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20  n.** is started 
12fb0 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
12fc0 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72  gument is nonzer
12fd0 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72  o, otherwise a r
12fe0 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ead-.** transact
12ff0 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63  ion.  If the sec
13000 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
13010 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78  2 or more and ex
13020 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73  clusive.** trans
13030 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
13040 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  d, meaning that 
13050 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
13060 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
13070 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
13080 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69  abase.  A preexi
13090 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  sting transactio
130a0 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20  n may not be.** 
130b0 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c  upgraded to excl
130c0 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67  usive by calling
130d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20   this routine a 
130e0 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68  second time - th
130f0 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79  e.** exclusivity
13100 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73   flag only works
13110 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73   for a new trans
13120 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
13130 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
13140 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65  n must be starte
13150 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
13160 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e  ing any .** chan
13170 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
13180 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ase.  None of th
13190 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
131a0 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f  ines .** will wo
131b0 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e  rk unless a tran
131c0 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
131d0 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20  ed first:.**.** 
131e0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
131f0 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a  eCreateTable().*
13200 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
13210 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29  reeCreateIndex()
13220 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
13230 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
13240 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
13250 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
13260 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
13270 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a  3BtreeInsert().*
13280 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
13290 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20  reeDelete().**  
132a0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
132b0 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a  UpdateMeta().**.
132c0 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c  ** If an initial
132d0 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75   attempt to acqu
132e0 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69  ire the lock fai
132f0 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f  ls because of lo
13300 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a  ck contention.**
13310 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
13320 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
13330 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20   unlocked, then 
13340 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
13350 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68  handler.** if th
13360 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74  ere is one.  But
13370 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72   if there was pr
13380 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d  eviously a read-
13390 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20  lock, do not.** 
133a0 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
133b0 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72  handler - just r
133c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
133d0 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y.  SQLITE_BUSY 
133e0 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
133f0 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c  when there is al
13400 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
13410 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  k in order to av
13420 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a  oid a deadlock..
13430 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  **.** Suppose th
13440 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63  ere are two proc
13450 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20  esses A and B.  
13460 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  A has a read loc
13470 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61  k and B has.** a
13480 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20   reserved lock. 
13490 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   B tries to prom
134a0 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ote to exclusive
134b0 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
134c0 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27  because.** of A'
134d0 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20  s read lock.  A 
134e0 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
134f0 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74   to reserved but
13500 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42   is blocked by B
13510 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20  ..** One or the 
13520 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f  other of the two
13530 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20   processes must 
13540 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72  give way or ther
13550 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70  e can be.** no p
13560 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74  rogress.  By ret
13570 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55  urning SQLITE_BU
13580 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b  SY and not invok
13590 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c  ing the busy cal
135a0 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20  lback.** when A 
135b0 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
135c0 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f  ad lock, we enco
135d0 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20  urage A to give 
135e0 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20  up and let B.** 
135f0 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20  proceed..*/.int 
13600 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
13610 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c  nTrans(Btree *p,
13620 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20   int wrflag){.  
13630 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20  sqlite3 *pBlock 
13640 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20  = 0;.  BtShared 
13650 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13660 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13670 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  _OK;..  sqlite3B
13680 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13690 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
136a0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
136b0 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
136c0 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
136d0 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
136e0 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
136f0 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
13700 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
13710 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
13720 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
13730 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
13740 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
13750 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
13760 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
13770 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
13780 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
13790 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
137a0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  n;.  }..  /* Wri
137b0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
137c0 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
137d0 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
137e0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
137f0 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
13800 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
13810 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
13820 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
13830 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
13840 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13850 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
13860 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  HE.  /* If anoth
13870 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
13880 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
13890 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
138a0 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
138b0 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62  on this shared-b
138c0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61  tree structure a
138d0 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74  nd a second writ
138e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
138f0 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c  .  ** requested,
13900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
13910 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  OCKED..  */.  if
13920 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74  ( (wrflag && pBt
13930 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
13940 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c  =TRANS_WRITE) ||
13950 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20   pBt->isPending 
13960 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20  ){.    pBlock = 
13970 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
13980 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72  ;.  }else if( wr
13990 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74  flag>1 ){.    Bt
139a0 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20  Lock *pIter;.   
139b0 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
139c0 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
139d0 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
139e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
139f0 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
13a00 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20  .        pBlock 
13a10 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
13a20 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65  >db;.        bre
13a30 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
13a40 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f  }.  }.  if( pBlo
13a50 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
13a60 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
13a70 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b  ed(p->db, pBlock
13a80 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
13a90 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
13aa0 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20  CACHE;.    goto 
13ab0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
13ac0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
13ad0 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72  y read-only or r
13ae0 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61  ead-write transa
13af0 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20  ction implies a 
13b00 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20  read-lock on .  
13b10 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66  ** page 1. So if
13b20 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72   some other shar
13b30 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20  ed-cache client 
13b40 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72  already has a wr
13b50 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f  ite-lock .  ** o
13b60 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72  n page 1, the tr
13b70 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
13b80 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20   be opened. */. 
13b90 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65   rc = queryShare
13ba0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
13bb0 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  p, MASTER_ROOT, 
13bc0 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
13bd0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
13be0 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67  ) goto trans_beg
13bf0 75 6e 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20  un;..  do {.    
13c00 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65  /* Call lockBtre
13c10 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72  e() until either
13c20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20   pBt->pPage1 is 
13c30 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20  populated or.   
13c40 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20   ** lockBtree() 
13c50 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e  returns somethin
13c60 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  g other than SQL
13c70 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65  ITE_OK. lockBtre
13c80 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72  e().    ** may r
13c90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
13ca0 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  but leave pBt->p
13cb0 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69  Page1 set to 0 i
13cc0 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72  f after.    ** r
13cd0 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74  eading page 1 it
13ce0 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20   discovers that 
13cf0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
13d00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
13d10 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f     ** file is no
13d20 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e  t pBt->pageSize.
13d30 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f   In this case lo
13d40 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75  ckBtree() will u
13d50 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74  pdate.    ** pBt
13d60 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68  ->pageSize to th
13d70 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
13d80 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
13d90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
13da0 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  e( pBt->pPage1==
13db0 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  0 && SQLITE_OK==
13dc0 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28  (rc = lockBtree(
13dd0 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66  pBt)) );..    if
13de0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13df0 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
13e00 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64     if( pBt->read
13e10 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
13e20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
13e30 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
13e40 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
13e50 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
13e60 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72  n(pBt->pPager,wr
13e70 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65  flag>1,sqlite3Te
13e80 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62  mpInMemory(p->db
13e90 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
13ea0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13eb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
13ec0 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
13ed0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13ee0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
13ef0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13f00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  OK ){.      unlo
13f10 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
13f20 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
13f30 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
13f40 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
13f50 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
13f60 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
13f70 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65       btreeInvoke
13f80 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29  BusyHandler(pBt)
13f90 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
13fa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13fb0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
13fc0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
13fd0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
13fe0 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66  ction++;.#ifndef
13ff0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
14000 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
14010 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
14020 29 7b 0a 09 61 73 73 65 72 74 28 20 70 2d 3e 6c  ){..assert( p->l
14030 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26  ock.pBtree==p &&
14040 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d   p->lock.iTable=
14050 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =1 );.        p-
14060 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45  >lock.eLock = RE
14070 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  AD_LOCK;.       
14080 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d   p->lock.pNext =
14090 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
140a0 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20       pBt->pLock 
140b0 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20  = &p->lock;.    
140c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
140d0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
140e0 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
140f0 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
14100 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
14110 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
14120 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
14130 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
14140 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
14150 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  s;.    }.#ifndef
14160 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
14170 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69 66  RED_CACHE.    if
14180 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
14190 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
141a0 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20  pWriter );.     
141b0 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
141c0 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 73  p;.      pBt->is
141d0 45 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38 29  Exclusive = (u8)
141e0 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20  (wrflag>1);.    
141f0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74  }.#endif.  }...t
14200 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66  rans_begun:.  if
14210 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14220 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
14230 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61   /* This call ma
14240 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68  kes sure that th
14250 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
14260 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f  correct number o
14270 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61  f.    ** open sa
14280 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65  vepoints. If the
14290 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
142a0 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
142b0 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  n 0 and.    ** t
142c0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
142d0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
142e0 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  en, then it will
142f0 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e   be opened here.
14300 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
14310 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
14320 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
14330 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e  pPager, p->db->n
14340 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
14350 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
14360 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
14370 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
14380 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
14390 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
143a0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
143b0 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
143c0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
143d0 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
143e0 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
143f0 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
14400 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
14410 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
14420 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
14430 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
14440 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
14450 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
14460 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
14470 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
14480 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
14490 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
144a0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
144b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144c0 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
144d0 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
144e0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14500 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
14510 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
14520 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14540 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
14550 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61   code */.  BtSha
14560 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
14570 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e  ->pBt;.  u8 isIn
14580 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
14590 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70  isInit;.  Pgno p
145a0 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
145b0 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
145c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
145d0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
145e0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ex) );.  rc = bt
145f0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
14600 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
14610 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
14620 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
14630 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20  rmaps_out;.  }. 
14640 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
14650 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
14660 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
14670 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
14680 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
14690 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61  , i);..    ptrma
146a0 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
146b0 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a  e, pCell, &rc);.
146c0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
146d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
146e0 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
146f0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
14700 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
14710 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
14720 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
14730 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  gno, &rc);.    }
14740 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
14750 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
14760 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
14770 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
14780 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
14790 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
147a0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
147b0 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
147c0 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
147d0 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63  &rc);.  }..set_c
147e0 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
147f0 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  :.  pPage->isIni
14800 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
14810 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14820 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
14830 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f  on pPage is a po
14840 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
14850 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69  rom.  Modify thi
14860 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20  s pointer so.** 
14870 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
14880 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  o iTo. Parameter
14890 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
148a0 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
148b0 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f  nter to.** be mo
148c0 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c  dified, as  foll
148d0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
148e0 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
148f0 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
14900 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
14910 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
14920 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
14930 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
14940 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
14950 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
14960 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
14970 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
14980 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
14990 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
149b0 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
149c0 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
149d0 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
149e0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
149f0 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
14a00 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
14a10 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
14a20 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a40 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
14a50 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
14a60 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
14a70 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
14a80 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
14a90 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
14aa0 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
14ab0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14ac0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
14ad0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
14ae0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14af0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
14b00 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
14b10 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
14b20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
14b30 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
14b40 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
14b50 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
14b60 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
14b70 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
14b80 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
14b90 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
14ba0 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
14bb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14bc0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
14bd0 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
14be0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
14bf0 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
14c00 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67     u8 isInitOrig
14c10 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
14c20 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
14c30 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20   int nCell;..   
14c40 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
14c50 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c  Page);.    nCell
14c60 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
14c70 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
14c80 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
14c90 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
14ca0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
14cb0 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
14cc0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
14cd0 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
14ce0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
14cf0 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72          btreePar
14d00 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
14d10 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
14d20 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
14d30 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
14d40 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f          if( iFro
14d50 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65  m==get4byte(&pCe
14d60 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
14d70 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  w]) ){.         
14d80 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65     put4byte(&pCe
14d90 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
14da0 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  w], iTo);.      
14db0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14dc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14dd0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
14de0 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34          if( get4
14df0 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72  byte(pCell)==iFr
14e00 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  om ){.          
14e10 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
14e20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
14e30 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
14e40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14e50 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65   .    if( i==nCe
14e60 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
14e70 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54  eType!=PTRMAP_BT
14e80 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  REE || .        
14e90 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67    get4byte(&pPag
14ea0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
14eb0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69  hdrOffset+8])!=i
14ec0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
14ed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
14ee0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
14ef0 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
14f00 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
14f10 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
14f20 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  t+8], iTo);.    
14f30 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  }..    pPage->is
14f40 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
14f50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
14f60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
14f70 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
14f80 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
14f90 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
14fa0 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
14fb0 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
14fc0 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
14fd0 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
14fe0 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54  s valid..**.** T
14ff0 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  he isCommit flag
15000 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
15010 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
15020 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
15030 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t.** the journal
15040 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
15050 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
15060 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
15070 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e  ge->pgno .** can
15080 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
15090 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
150a0 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
150b0 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
150c0 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f  that.** page..*/
150d0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f  .static int relo
150e0 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68  catePage(.  BtSh
150f0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
15100 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f       /* Btree */
15110 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50  .  MemPage *pDbP
15120 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  age,        /* O
15130 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  pen page to move
15140 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
15150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15160 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74  * Pointer map 't
15170 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70  ype' entry for p
15180 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
15190 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20   iPtrPage,      
151a0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
151b0 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e  map 'page-no' en
151c0 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
151d0 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50  */.  Pgno iFreeP
151e0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
151f0 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f   The location to
15200 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f   move pDbPage to
15210 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
15220 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  it             /
15230 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  * isCommit flag 
15240 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
15250 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a  3PagerMovepage *
15260 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
15270 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
15280 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
15290 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
152a0 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
152b0 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
152c0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
152d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
152e0 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
152f0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
15300 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
15310 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
15320 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
15330 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
15340 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
15350 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
15360 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
15370 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15380 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
15390 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
153a0 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70  sert( pDbPage->p
153b0 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a  Bt==pBt );..  /*
153c0 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
153d0 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
153e0 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
153f0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
15400 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
15410 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
15420 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
15430 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
15440 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
15450 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
15460 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
15470 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
15480 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
15490 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
154a0 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
154b0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
154c0 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  , isCommit);.  i
154d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
154e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
154f0 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65  c;.  }.  pDbPage
15500 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61  ->pgno = iFreePa
15510 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62  ge;..  /* If pDb
15520 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65  Page was a btree
15530 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d  -page, then it m
15540 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61  ay have child pa
15550 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73  ges and/or cells
15560 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74  .  ** that point
15570 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
15580 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  es. The pointer 
15590 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
155a0 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70  all these.  ** p
155b0 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
155c0 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20  changed..  **.  
155d0 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73  ** If pDbPage is
155e0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
155f0 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
15600 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74  t 4 bytes may st
15610 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74  ore a.  ** point
15620 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65  er to a subseque
15630 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
15640 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
15650 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a   case, then.  **
15660 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
15670 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
15680 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62  ated for the sub
15690 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
156a0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
156b0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
156c0 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
156d0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
156e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
156f0 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50  hildPtrmaps(pDbP
15700 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
15710 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15720 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15730 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
15740 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c     Pgno nextOvfl
15750 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50   = get4byte(pDbP
15760 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
15770 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30   if( nextOvfl!=0
15780 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
15790 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
157a0 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
157b0 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20  OW2, iFreePage, 
157c0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
157d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
157e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
157f0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
15800 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20  }.  }..  /* Fix 
15810 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69  the database poi
15820 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74  nter on page iPt
15830 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74  rPage that point
15840 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f  ed at iDbPage so
15850 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  .  ** that it po
15860 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67  ints at iFreePag
15870 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20  e. Also fix the 
15880 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
15890 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50  y for.  ** iPtrP
158a0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
158b0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
158c0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
158d0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
158e0 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
158f0 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
15900 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15910 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
15920 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
15930 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15940 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
15950 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
15960 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15970 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
15980 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
15990 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
159a0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
159b0 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
159c0 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
159d0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
159e0 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
159f0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
15a00 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
15a10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15a20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
15a30 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
15a40 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
15a50 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
15a60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15a70 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
15a80 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
15a90 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
15aa0 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
15ab0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
15ac0 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
15ad0 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
15ae0 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
15af0 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
15b00 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
15b10 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
15b20 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
15b30 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20  sful,.** return 
15b40 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
15b50 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
15b60 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
15b70 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20  ore no.** point 
15b80 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  in calling this 
15b90 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c  function again),
15ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
15bb0 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20  ONE..**.** More 
15bc0 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73  specificly, this
15bd0 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
15be0 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
15bf0 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  e the .** databa
15c00 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c  se so that the l
15c10 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
15c20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
15c30 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c  n use.** is no l
15c40 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
15c50 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20  .** If the nFin 
15c60 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
15c70 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63  -zero, this func
15c80 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20  tion assumes.** 
15c90 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
15ca0 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
15cb0 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
15cc0 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72  () until.** it r
15cd0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
15ce0 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20  NE or an error, 
15cf0 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73  and that nFin is
15d00 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
15d10 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61  f pages the data
15d20 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63  base file will c
15d30 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69  ontain after thi
15d40 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  s .** process is
15d50 20 63 6f 6d 70 6c 65 74 65 2e 20 20 49 66 20 6e   complete.  If n
15d60 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 69 74 20  Fin is zero, it 
15d70 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
15d80 2a 2a 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ** incrVacuumSte
15d90 70 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  p() will be call
15da0 65 64 20 61 20 66 69 6e 69 74 65 20 61 6d 6f 75  ed a finite amou
15db0 6e 74 20 6f 66 20 74 69 6d 65 73 0a 2a 2a 20 77  nt of times.** w
15dc0 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
15dd0 6e 6f 74 20 65 6d 70 74 79 20 74 68 65 20 66 72  not empty the fr
15de0 65 65 6c 69 73 74 2e 20 20 41 20 66 75 6c 6c 20  eelist.  A full 
15df0 61 75 74 6f 76 61 63 75 75 6d 0a 2a 2a 20 68 61  autovacuum.** ha
15e00 73 20 6e 46 69 6e 3e 30 2e 20 20 41 20 22 50 52  s nFin>0.  A "PR
15e10 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c  AGMA incremental
15e20 5f 76 61 63 75 75 6d 22 20 68 61 73 20 6e 46 69  _vacuum" has nFi
15e30 6e 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  n==0..*/.static 
15e40 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74  int incrVacuumSt
15e50 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ep(BtShared *pBt
15e60 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e  , Pgno nFin, Pgn
15e70 6f 20 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67  o iLastPg){.  Pg
15e80 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20  no nFreeList;   
15e90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15ea0 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c  r of pages still
15eb0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
15ec0 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
15ed0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15ee0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
15ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73  ;.  assert( iLas
15f00 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69  tPg>nFin );..  i
15f10 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
15f20 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
15f30 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
15f40 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
15f50 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  t) ){.    int rc
15f60 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
15f70 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
15f80 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
15f90 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
15fa0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
15fb0 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
15fc0 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
15fd0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15fe0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
15ff0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
16000 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
16010 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
16020 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
16030 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16040 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16050 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
16060 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
16070 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
16080 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
16090 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
160a0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
160b0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
160c0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e  {.      if( nFin
160d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
160e0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
160f0 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
16100 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
16110 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
16120 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e  .        ** if n
16130 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  Fin is non-zero.
16140 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
16150 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
16160 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
16170 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
16180 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
16190 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
161a0 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
161b0 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
161c0 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
161d0 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
161e0 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
161f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
16200 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
16210 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
16220 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
16230 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
16240 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
16250 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
16260 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20  astPg, 1);.     
16270 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16280 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16290 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
162a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
162b0 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
162c0 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
162d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
162e0 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
162f0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
16300 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
16310 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16320 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
16330 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
16340 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
16350 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
16360 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  ;..      rc = bt
16370 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
16380 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50  iLastPg, &pLastP
16390 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
163a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
163b0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
163c0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
163d0 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69      /* If nFin i
163e0 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
163f0 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
16400 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
16410 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
16420 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
16430 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
16440 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
16450 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
16460 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
16470 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
16480 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61   if nFin is grea
16490 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
164a0 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
164b0 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
164c0 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
164d0 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
164e0 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
164f0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
16500 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
16510 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f       */.      do
16520 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
16530 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
16540 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
16550 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
16560 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
16570 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ePg, 0, 0);.    
16580 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
165a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
165b0 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20  LastPg);.       
165c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
165d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
165e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
165f0 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ePg);.      }whi
16600 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69  le( nFin!=0 && i
16610 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20  FreePg>nFin );. 
16620 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
16630 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a  eePg<iLastPg );.
16640 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
16650 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
16660 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62  ite(pLastPg->pDb
16670 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
16680 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16690 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
166a0 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
166b0 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
166c0 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
166d0 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20  Pg, nFin!=0);.  
166e0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
166f0 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
16700 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16720 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16730 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16740 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30  }..  if( nFin==0
16750 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d   ){.    iLastPg-
16760 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c  -;.    while( iL
16770 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
16780 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50  YTE_PAGE(pBt)||P
16790 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
167a0 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20  , iLastPg) ){.  
167b0 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
167c0 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
167d0 50 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  Pg) ){.        M
167e0 65 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20 20 20  emPage *pPg;.   
167f0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 62 74       int rc = bt
16800 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
16810 69 4c 61 73 74 50 67 2c 20 26 70 50 67 2c 20 30  iLastPg, &pPg, 0
16820 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16830 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16840 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16850 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
16860 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16870 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
16880 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
16890 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
168a0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69  (pPg);.        i
168b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
168c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
168d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
168e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
168f0 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
16900 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
16910 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
16920 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61  pBt->pPager, iLa
16930 73 74 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  stPg);.  }.  ret
16940 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16950 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ../*.** A write-
16960 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
16970 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72   be opened befor
16980 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
16990 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70  unction..** It p
169a0 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65  erforms a single
169b0 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f   unit of work to
169c0 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65  wards an increme
169d0 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a  ntal vacuum..**.
169e0 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d  ** If the increm
169f0 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20  ental vacuum is 
16a00 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74  finished after t
16a10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
16a20 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f   run,.** SQLITE_
16a30 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
16a40 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66  . If it is not f
16a50 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20  inished, but no 
16a60 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a  error occurred,.
16a70 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
16a80 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
16a90 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
16aa0 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e  ror code. .*/.in
16ab0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
16ac0 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  crVacuum(Btree *
16ad0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
16ae0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
16af0 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
16b00 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
16b10 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
16b20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
16b30 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
16b40 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
16b50 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
16b60 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
16b70 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
16b80 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
16b90 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
16ba0 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
16bb0 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  (pBt);.    rc = 
16bc0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
16bd0 42 74 2c 20 30 2c 20 70 61 67 65 72 50 61 67 65  Bt, 0, pagerPage
16be0 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20 20 7d  count(pBt));.  }
16bf0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16c00 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16c10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
16c20 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
16c30 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
16c40 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
16c50 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
16c60 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
16c70 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  ted for an auto-
16c80 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e  vacuum database.
16c90 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
16ca0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
16cb0 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69   then *pnTrunc i
16cc0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
16cd0 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
16ce0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16cf0 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  e should be trun
16d00 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20  cated to during 
16d10 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
16d20 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65  ss. .** i.e. the
16d30 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
16d40 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73  en reorganized s
16d50 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20  o that only the 
16d60 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a  first *pnTrunc.*
16d70 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  * pages are in u
16d80 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
16d90 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  t autoVacuumComm
16da0 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  it(BtShared *pBt
16db0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
16dc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
16dd0 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
16de0 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e  pPager;.  VVA_ON
16df0 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  LY( int nRef = s
16e00 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
16e10 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  unt(pPager) );..
16e20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16e30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
16e40 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e  ->mutex) );.  in
16e50 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
16e60 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
16e70 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74   assert(pBt->aut
16e80 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20  oVacuum);.  if( 
16e90 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  !pBt->incrVacuum
16ea0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69   ){.    Pgno nFi
16eb0 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
16ec0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
16ed0 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
16ee0 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f  autovacuuming */
16ef0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b  .    Pgno nFree;
16f00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16f10 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
16f20 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69  e freelist initi
16f30 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ally */.    Pgno
16f40 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f   nPtrmap;      /
16f50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
16f60 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
16f70 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
16f80 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   iFree;        /
16f90 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20  * The next page 
16fa0 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
16fb0 20 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20     int nEntry;  
16fc0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16fd0 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e  of entries on on
16fe0 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f  e ptrmap page */
16ff0 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b  .    Pgno nOrig;
17000 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
17010 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  ase size before 
17020 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  freeing */..    
17030 6e 4f 72 69 67 20 3d 20 70 61 67 65 72 50 61 67  nOrig = pagerPag
17040 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
17050 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
17060 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c  GE(pBt, nOrig) |
17070 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47  | nOrig==PENDING
17080 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
17090 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
170a0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
170b0 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62  o create a datab
170c0 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68  ase for which th
170d0 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20  e final page.   
170e0 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
170f0 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
17100 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e  ge or the pendin
17110 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20  g-byte page. If 
17120 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  one.      ** is 
17130 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69  encountered, thi
17140 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72  s indicates corr
17150 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  uption..      */
17160 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
17170 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
17180 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46  T;.    }..    nF
17190 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
171a0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
171b0 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 45 6e  ta[36]);.    nEn
171c0 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  try = pBt->usabl
171d0 65 53 69 7a 65 2f 35 3b 0a 20 20 20 20 6e 50 74  eSize/5;.    nPt
171e0 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f  rmap = (nFree-nO
171f0 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  rig+PTRMAP_PAGEN
17200 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45  O(pBt, nOrig)+nE
17210 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20  ntry)/nEntry;.  
17220 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
17230 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
17240 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e  ;.    if( nOrig>
17250 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
17260 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50  E(pBt) && nFin<P
17270 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
17280 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
17290 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Fin--;.    }.   
172a0 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
172b0 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
172c0 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
172d0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
172e0 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d   ){.      nFin--
172f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17300 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74  nFin>nOrig ) ret
17310 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
17320 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66 6f  PT_BKPT;..    fo
17330 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69  r(iFree=nOrig; i
17340 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d  Free>nFin && rc=
17350 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65  =SQLITE_OK; iFre
17360 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e--){.      rc =
17370 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
17380 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65  pBt, nFin, iFree
17390 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
173a0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
173b0 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  E || rc==SQLITE_
173c0 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29  OK) && nFree>0 )
173d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
173e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63  ITE_OK;.      rc
173f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
17400 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
17410 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
17420 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
17430 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
17440 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  2], 0);.      pu
17450 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
17460 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
17470 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
17480 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
17490 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
174a0 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   nFin);.    }.  
174b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
174c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
174d0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
174e0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
174f0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
17500 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67  nRef==sqlite3Pag
17510 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
17520 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
17530 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  c;.}..#else /* i
17540 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17550 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
17560 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c  # define setChil
17570 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49  dPtrmaps(x) SQLI
17580 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
17590 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
175a0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
175b0 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
175c0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
175d0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
175e0 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
175f0 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
17600 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
17610 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
17620 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
17630 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
17640 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
17650 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
17660 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
17670 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
17680 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
17690 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
176a0 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
176b0 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
176c0 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
176d0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
176e0 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
176f0 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
17700 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
17710 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
17720 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
17730 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
17740 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
17750 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
17760 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
17770 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
17780 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
17790 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
177a0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
177b0 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
177c0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
177d0 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
177e0 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
177f0 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
17800 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
17810 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
17820 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
17830 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
17840 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
17850 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
17860 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
17870 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
17880 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
17890 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
178a0 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
178b0 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
178c0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
178d0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
178e0 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
178f0 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
17900 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
17910 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
17920 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
17930 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
17940 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
17950 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
17960 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
17970 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
17980 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
17990 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
179a0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
179b0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
179c0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
179d0 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
179e0 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
179f0 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
17a00 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
17a10 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
17a20 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
17a30 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
17a40 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
17a50 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
17a60 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
17a70 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
17a80 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
17a90 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
17aa0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
17ab0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
17ac0 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
17ad0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
17ae0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17af0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
17b00 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
17b10 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
17b20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17b30 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
17b40 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
17b50 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
17b60 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
17b70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
17b80 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e  eeEnter(p);.#ifn
17b90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17ba0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
17bb0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
17bc0 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
17bd0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
17be0 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  t(pBt);.      if
17bf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17c00 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17c10 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17c20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
17c30 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
17c40 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
17c50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
17c60 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
17c70 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
17c80 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
17c90 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17ca0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
17cb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
17cc0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
17cd0 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72  ed from both Btr
17ce0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
17cf0 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c  () and BtreeRoll
17d00 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65  back().** at the
17d10 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61   conclusion of a
17d20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
17d30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
17d40 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
17d50 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
17d60 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17d70 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
17d80 20 2a 70 43 73 72 3b 0a 20 20 61 73 73 65 72 74   *pCsr;.  assert
17d90 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
17da0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a  ldsMutex(p) );..
17db0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
17dc0 61 20 63 75 72 73 6f 72 20 68 65 6c 64 20 6f 70  a cursor held op
17dd0 65 6e 20 62 79 20 74 68 69 73 20 62 2d 74 72 65  en by this b-tre
17de0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 66  e connection. If
17df0 20 6f 6e 65 20 65 78 69 73 74 73 2c 0a 20 20 2a   one exists,.  *
17e00 2a 20 74 68 65 6e 20 74 68 65 20 74 72 61 6e 73  * then the trans
17e10 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64  action will be d
17e20 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 72  owngraded to a r
17e30 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
17e40 74 69 6f 6e 0a 20 20 2a 2a 20 69 6e 73 74 65 61  tion.  ** instea
17e50 64 20 6f 66 20 61 63 74 75 61 6c 6c 79 20 63 6f  d of actually co
17e60 6e 63 6c 75 64 65 64 2e 20 41 20 73 75 62 73 65  ncluded. A subse
17e70 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 43 6f  quent call to Co
17e80 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 0a  mmitPhaseTwo() .
17e90 20 20 2a 2a 20 6f 72 20 52 6f 6c 6c 62 61 63 6b    ** or Rollback
17ea0 28 29 20 77 69 6c 6c 20 66 69 6e 69 73 68 20 74  () will finish t
17eb0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  he transaction a
17ec0 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  nd unlock the da
17ed0 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 66 6f  tabase.  */.  fo
17ee0 72 28 70 43 73 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCsr=pBt->pCur
17ef0 73 6f 72 3b 20 70 43 73 72 20 26 26 20 70 43 73  sor; pCsr && pCs
17f00 72 2d 3e 70 42 74 72 65 65 21 3d 70 3b 20 70 43  r->pBtree!=p; pC
17f10 73 72 3d 70 43 73 72 2d 3e 70 4e 65 78 74 29 3b  sr=pCsr->pNext);
17f20 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 3d  .  assert( pCsr=
17f30 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73  =0 || p->inTrans
17f40 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 0a  >TRANS_NONE );..
17f50 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
17f60 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 69  ontent(pBt);.  i
17f70 66 28 20 70 43 73 72 20 29 7b 0a 20 20 20 20 64  f( pCsr ){.    d
17f80 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
17f90 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
17fa0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72  (p);.    p->inTr
17fb0 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ans = TRANS_READ
17fc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
17fd0 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
17fe0 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  had any kind of 
17ff0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
18000 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20  , decrement the 
18010 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
18020 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  ion count of the
18030 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
18040 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
18050 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20  n count .    ** 
18060 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74  reaches 0, set t
18070 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
18080 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
18090 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
180a0 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20  Unused().    ** 
180b0 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20  call below will 
180c0 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
180d0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  .  */.    if( p-
180e0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
180f0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c  NONE ){.      cl
18100 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
18110 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
18120 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
18130 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20  saction--;.     
18140 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
18150 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
18160 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
18170 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
18180 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NONE;.      }.  
18190 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
181a0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
181b0 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
181c0 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
181d0 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20  unlock the .    
181e0 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73  ** pager if this
181f0 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
18200 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
18210 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
18220 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72    */.    p->inTr
18230 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
18240 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  ;.    unlockBtre
18250 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
18260 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
18270 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  grity(p);.}../*.
18280 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72  ** Commit the tr
18290 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
182a0 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
182b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
182c0 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
182d0 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
182e0 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d  of a 2-phase com
182f0 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c  mit.  The.** sql
18300 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
18310 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e  haseOne() routin
18320 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
18330 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c   phase and shoul
18340 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  d.** be invoked 
18350 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
18360 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
18370 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  The sqlite3Btree
18380 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
18390 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20  .** routine did 
183a0 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  all the work of 
183b0 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74  writing informat
183c0 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20  ion out to disk 
183d0 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65  and flushing the
183e0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20  .** contents so 
183f0 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72  that they are wr
18400 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64  itten onto the d
18410 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c  isk platter.  Al
18420 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
18430 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64  e has to do is d
18440 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74  elete or truncat
18450 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65  e or zero the he
18460 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74  ader in the.** t
18470 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
18480 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65  nal (which cause
18490 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
184a0 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64  n to commit) and
184b0 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  .** drop locks..
184c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
184d0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
184e0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
184f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
18500 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
18510 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
18520 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
18530 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
18540 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18550 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
18560 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  wo(Btree *p){.  
18570 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
18580 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
18590 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
185a0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
185b0 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
185c0 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
185d0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
185e0 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
185f0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
18600 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
18610 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
18620 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
18630 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
18640 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
18650 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
18660 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
18670 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
18680 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
18690 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
186a0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
186b0 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
186c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
186d0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
186e0 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
186f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18710 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
18720 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
18730 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
18740 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
18750 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
18760 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
18770 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
18780 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
18790 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
187a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
187b0 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68  /*.** Do both ph
187c0 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74  ases of a commit
187d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
187e0 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65  BtreeCommit(Btre
187f0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
18800 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
18810 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
18820 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
18830 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29  itPhaseOne(p, 0)
18840 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
18850 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
18860 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
18870 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b  mmitPhaseTwo(p);
18880 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
18890 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
188a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
188b0 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
188c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
188d0 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72  ber of write-cur
188e0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
188f0 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69  s handle. This i
18900 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
18910 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
18920 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
18930 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
18940 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
18950 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
18960 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
18970 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
18980 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  , a write-cursor
18990 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74   is any cursor t
189a0 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c  hat.** is capabl
189b0 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20  e of writing to 
189c0 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68  the databse.  Th
189d0 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72  at means the cur
189e0 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69  sor was.** origi
189f0 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  nally opened for
18a00 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65   writing and the
18a10 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20   cursor has not 
18a20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62  be disabled.** b
18a30 79 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61  y having its sta
18a40 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55  te changed to CU
18a50 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73  RSOR_FAULT..*/.s
18a60 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57  tatic int countW
18a70 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68  riteCursors(BtSh
18a80 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
18a90 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
18aa0 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
18ab0 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
18ac0 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
18ad0 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
18ae0 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61   if( pCur->wrFla
18af0 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  g && pCur->eStat
18b00 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e!=CURSOR_FAULT 
18b10 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
18b20 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
18b30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
18b40 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
18b50 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
18b60 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
18b70 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
18b80 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
18b90 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65  ursor on BtShare
18ba0 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a  d that pBtree.**
18bb0 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
18bc0 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20  ** Every cursor 
18bd0 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c  is tripped, incl
18be0 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68  uding cursors th
18bf0 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20  at belong.** to 
18c00 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
18c10 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
18c20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61  happen to be sha
18c30 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68  ring.** the cach
18c40 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a  e with pBtree..*
18c50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18c60 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68  e gets called wh
18c70 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  en a rollback oc
18c80 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72  curs..** All cur
18c90 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73  sors using the s
18ca0 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62  ame cache must b
18cb0 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20  e tripped.** to 
18cc0 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f  prevent them fro
18cd0 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20  m trying to use 
18ce0 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a  the btree after.
18cf0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ** the rollback.
18d00 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d    The rollback m
18d10 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20  ay have deleted 
18d20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76  tables.** or mov
18d30 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73  ed root pages, s
18d40 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66  o it is not suff
18d50 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76  icient to.** sav
18d60 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
18d70 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
18d80 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a  cursor must be.*
18d90 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  * invalidated..*
18da0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
18db0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
18dc0 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
18dd0 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20   int errCode){. 
18de0 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
18df0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18e00 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72  r(pBtree);.  for
18e10 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
18e20 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
18e30 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74  >pNext){.    int
18e40 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   i;.    sqlite3B
18e50 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
18e60 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74  p);.    p->eStat
18e70 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  e = CURSOR_FAULT
18e80 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78  ;.    p->skipNex
18e90 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20  t = errCode;.   
18ea0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e   for(i=0; i<=p->
18eb0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
18ec0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18ed0 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
18ee0 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d      p->apPage[i]
18ef0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
18f00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
18f10 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a  ave(pBtree);.}..
18f20 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
18f30 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
18f40 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c  n progress.  All
18f50 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65   cursors will be
18f60 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79  .** invalided by
18f70 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
18f80 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
18f90 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a   use a cursor.**
18fa0 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61   that was open a
18fb0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
18fc0 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  of this operatio
18fd0 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a  n will result.**
18fe0 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   in an error..**
18ff0 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
19000 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
19010 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
19020 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
19030 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
19040 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
19050 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
19060 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
19070 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19080 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65  eeRollback(Btree
19090 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
190a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
190b0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
190c0 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
190d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
190e0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61 76  r(p);.  rc = sav
190f0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
19100 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20   0, 0);.#ifndef 
19110 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
19120 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72  ED_CACHE.  if( r
19130 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19140 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61      /* This is a
19150 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74   horrible situat
19160 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61  ion. An IO or ma
19170 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
19180 75 72 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20  urred whilst.   
19190 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61   ** trying to sa
191a0 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  ve cursor positi
191b0 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20  ons. If this is 
191c0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c  an automatic rol
191d0 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a  lback (as.    **
191e0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61   the result of a
191f0 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c   constraint, mal
19200 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72  loc() failure or
19210 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20   IO error) then 
19220 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68  .    ** the cach
19230 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61  e may be interna
19240 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  lly inconsistent
19250 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61   (not contain va
19260 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20  lid trees) so.  
19270 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73    ** we cannot s
19280 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65  imply return the
19290 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61   error to the ca
192a0 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61  ller. Instead, a
192b0 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c  bort .    ** all
192c0 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61   queries that ma
192d0 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f  y be using any o
192e0 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
192f0 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76  at failed to sav
19300 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
19310 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
19320 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b  lCursors(p, rc);
19330 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74  .  }.#endif.  bt
19340 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
19350 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
19360 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
19370 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
19380 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
19390 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
193a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
193b0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
193c0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
193d0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
193e0 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
193f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
19400 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
19410 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
19420 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
19430 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
19440 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
19450 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74  o.    ** call bt
19460 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
19470 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
19480 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
19490 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
194a0 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
194b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65   */.    if( btre
194c0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
194d0 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
194e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
194f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
19500 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
19510 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
19520 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
19530 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
19540 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
19550 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
19560 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
19570 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
19580 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19590 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
195a0 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73  ./*.** Start a s
195b0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
195c0 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
195d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20  transaction can 
195e0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a  can be rolled.**
195f0 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
19600 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
19610 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75  transaction. You
19620 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
19630 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65  ansaction .** be
19640 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
19650 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
19660 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
19670 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f  on is ended auto
19680 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66  matically .** if
19690 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
196a0 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72  ction commits or
196b0 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
196c0 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
196d0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
196e0 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
196f0 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
19700 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
19710 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
19720 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
19730 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
19740 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
19750 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
19760 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
19770 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
19780 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
19790 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
197a0 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
197b0 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
197c0 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
197d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
197e0 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73  ** A statement s
197f0 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ub-transaction i
19800 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
19810 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61   an anonymous sa
19820 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20  vepoint. The.** 
19830 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
19840 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
19850 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61  eter is the tota
19860 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  l number of save
19870 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75  points,.** inclu
19880 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f  ding the new ano
19890 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
198a0 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d  , open on the B-
198b0 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68  Tree. i.e. if th
198c0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
198d0 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
198e0 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61  and no other sta
198f0 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
19900 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74  ons open,.** iSt
19910 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68  atement is 1. Th
19920 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  is anonymous sav
19930 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65  epoint can be re
19940 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64  leased or rolled
19950 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74   back.** using t
19960 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
19970 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74  avepoint() funct
19980 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
19990 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
199a0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
199b0 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69  iStatement){.  i
199c0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
199d0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
199e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
199f0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
19a00 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
19a10 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
19a20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 72 65 61  assert( pBt->rea
19a30 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  dOnly==0 );.  as
19a40 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
19a50 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
19a60 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62  iStatement>p->db
19a70 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  ->nSavepoint );.
19a80 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 69    if( NEVER(p->i
19a90 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
19aa0 49 54 45 20 7c 7c 20 70 42 74 2d 3e 72 65 61 64  ITE || pBt->read
19ab0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 63 20  Only) ){.    rc 
19ac0 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  = SQLITE_INTERNA
19ad0 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
19ae0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
19af0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
19b00 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 2f  S_WRITE );.    /
19b10 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c  * At the pager l
19b20 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e  evel, a statemen
19b30 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
19b40 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74   a savepoint wit
19b50 68 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 64 65  h.    ** an inde
19b60 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  x greater than a
19b70 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72  ll savepoints cr
19b80 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79  eated explicitly
19b90 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 53 51   using.    ** SQ
19ba0 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
19bb0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
19bc0 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
19bd0 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 20  rollback any.   
19be0 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69   ** such savepoi
19bf0 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74  nts while the st
19c00 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
19c10 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
19c20 20 61 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a   active..    */.
19c30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19c40 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
19c50 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
19c60 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 7d  iStatement);.  }
19c70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
19c80 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
19c90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
19ca0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
19cb0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
19cc0 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61  ion, op, is alwa
19cd0 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ys SAVEPOINT_ROL
19ce0 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45  LBACK.** or SAVE
19cf0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54  POINT_RELEASE. T
19d00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74  his function eit
19d10 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20  her releases or 
19d20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a  rolls back the.*
19d30 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e  * savepoint iden
19d40 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
19d50 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20  ter iSavepoint, 
19d60 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
19d70 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70   value .** of op
19d80 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
19d90 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  , iSavepoint is 
19da0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
19db0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48  equal to zero. H
19dc0 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73  owever, if op is
19dd0 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  .** SAVEPOINT_RO
19de0 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61  LLBACK, then iSa
19df0 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f  vepoint may also
19e00 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20   be -1. In this 
19e10 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  case the .** con
19e20 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74  tents of the ent
19e30 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
19e40 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  are rolled back.
19e50 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
19e60 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72  nt.** from a nor
19e70 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mal transaction 
19e80 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20  rollback, as no 
19e90 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73  locks are releas
19ea0 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72  ed and the.** tr
19eb0 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e  ansaction remain
19ec0 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  s open..*/.int s
19ed0 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
19ee0 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  oint(Btree *p, i
19ef0 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65  nt op, int iSave
19f00 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
19f10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19f20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72  if( p && p->inTr
19f30 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
19f40 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
19f50 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
19f60 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
19f70 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
19f80 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
19f90 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
19fa0 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65     assert( iSave
19fb0 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61  point>=0 || (iSa
19fc0 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f  vepoint==-1 && o
19fd0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
19fe0 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71  LBACK) );.    sq
19ff0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1a000 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  p);.    rc = sql
1a010 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
1a020 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1a030 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
1a040 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1a050 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a060 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1a070 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pBt);.    }.   
1a080 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a090 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
1a0a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a0b0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75   Create a new cu
1a0c0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72  rsor for the BTr
1a0d0 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73  ee whose root is
1a0e0 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
1a0f0 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61  iTable. If a rea
1a100 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73  d-only cursor is
1a110 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
1a120 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
1a130 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72  * the caller alr
1a140 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73  eady has at leas
1a150 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  t a read-only tr
1a160 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a  ansaction open.*
1a170 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
1a180 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20  e already. If a 
1a190 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20  write-cursor is 
1a1a0 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a  requested, then.
1a1b0 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  ** the caller is
1a1c0 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65   assumed to have
1a1d0 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
1a1e0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1a1f0 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20  * If wrFlag==0, 
1a200 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1a210 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
1a220 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a   for reading..**
1a230 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74   If wrFlag==1, t
1a240 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
1a250 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
1a260 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a  eading or for.**
1a270 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65   writing if othe
1a280 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72  r conditions for
1a290 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73   writing are als
1a2a0 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a  o met.  These.**
1a2b0 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69   are the conditi
1a2c0 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  ons that must be
1a2d0 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f   met in order fo
1a2e0 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  r writing to.** 
1a2f0 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  be allowed:.**.*
1a300 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72  * 1:  The cursor
1a310 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1a320 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
1a330 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20  ag==1.**.** 2:  
1a340 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  Other database c
1a350 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
1a360 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70  share the same p
1a370 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20  ager cache.**   
1a380 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20    but which are 
1a390 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f  not in the READ_
1a3a0 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74  UNCOMMITTED stat
1a3b0 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a  e may not have.*
1a3c0 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70  *     cursors op
1a3d0 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  en with wrFlag==
1a3e0 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  0 on the same ta
1a3f0 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ble.  Otherwise.
1a400 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67  **     the chang
1a410 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  es made by this 
1a420 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75  write cursor wou
1a430 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f  ld be visible to
1a440 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64  .**     the read
1a450 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
1a460 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
1a470 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
1a480 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73   3:  The databas
1a490 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62  e must be writab
1a4a0 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d  le (not on read-
1a4b0 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a  only media).**.*
1a4c0 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74  * 4:  There must
1a4d0 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72   be an active tr
1a4e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1a4f0 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20   No checking is 
1a500 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  done to make sur
1a510 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62  e that page iTab
1a520 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65  le really is the
1a530 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  .** root page of
1a540 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69   a b-tree.  If i
1a550 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  t is not, then t
1a560 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72  he cursor acquir
1a570 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77  ed.** will not w
1a580 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ork correctly..*
1a590 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d  *.** It is assum
1a5a0 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ed that the sqli
1a5b0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
1a5c0 7a 65 28 29 20 62 79 74 65 73 20 6f 66 20 6d 65  ze() bytes of me
1a5d0 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e 74 65 64  mory .** pointed
1a5e0 20 74 6f 20 62 79 20 70 43 75 72 20 68 61 76 65   to by pCur have
1a5f0 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20   been zeroed by 
1a600 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
1a610 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
1a620 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
1a630 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a650 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
1a660 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a680 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
1a690 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
1a6a0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
1a6b0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6d0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
1a6e0 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
1a6f0 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
1a700 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
1a710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1a720 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
1a730 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
1a740 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1a750 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1a760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
1a770 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
1a780 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  r */.){.  BtShar
1a790 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1a7a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a7b0 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65   /* Shared b-tre
1a7c0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61  e handle */..  a
1a7d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1a7e0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1a7f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
1a800 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61  Flag==0 || wrFla
1a810 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  g==1 );..  /* Th
1a820 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1a830 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65  rt statements ve
1a840 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69  rify that if thi
1a850 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20  s is a sharable 
1a860 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74  .  ** b-tree dat
1a870 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65  abase, the conne
1a880 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
1a890 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
1a8a0 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a  ble locks, .  **
1a8b0 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68   and that no oth
1a8c0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
1a8d0 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  s any open curso
1a8e0 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  r that conflicts
1a8f0 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73   with .  ** this
1a900 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
1a910 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
1a920 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
1a930 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f  iTable, pKeyInfo
1a940 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29  !=0, wrFlag+1) )
1a950 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1a960 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61  ag==0 || !hasRea
1a970 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54  dConflicts(p, iT
1a980 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41  able) );..  /* A
1a990 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63  ssert that the c
1a9a0 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64  aller has opened
1a9b0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72   the required tr
1a9c0 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20  ansaction. */.  
1a9d0 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
1a9e0 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  ns>TRANS_NONE );
1a9f0 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
1aa00 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61  g==0 || p->inTra
1aa10 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1aa20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1aa30 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d  ->pPage1 && pBt-
1aa40 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
1aa50 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 77  ;..  if( NEVER(w
1aa60 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e 72 65  rFlag && pBt->re
1aa70 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72  adOnly) ){.    r
1aa80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
1aa90 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
1aaa0 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 70 61   iTable==1 && pa
1aab0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1aac0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
1aad0 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b  rn SQLITE_EMPTY;
1aae0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74  .  }..  /* Now t
1aaf0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72  hat no other err
1ab00 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66  ors can occur, f
1ab10 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e  inish filling in
1ab20 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20   the BtCursor.  
1ab30 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64  ** variables and
1ab40 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
1ab50 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
1ab60 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70  ed list.  */.  p
1ab70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  Cur->pgnoRoot = 
1ab80 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20  (Pgno)iTable;.  
1ab90 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31  pCur->iPage = -1
1aba0 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ;.  pCur->pKeyIn
1abb0 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
1abc0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
1abd0 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d  p;.  pCur->pBt =
1abe0 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72   pBt;.  pCur->wr
1abf0 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c 61  Flag = (u8)wrFla
1ac00 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  g;.  pCur->pNext
1ac10 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
1ac20 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65  .  if( pCur->pNe
1ac30 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  xt ){.    pCur->
1ac40 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
1ac50 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  Cur;.  }.  pBt->
1ac60 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
1ac70 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1ac80 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
1ac90 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  .  pCur->cachedR
1aca0 6f 77 69 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  owid = 0;.  retu
1acb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1acc0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1acd0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
1ace0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
1ad10 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
1ad20 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad40 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1ad50 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
1ad60 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
1ad70 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad90 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
1ada0 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
1adb0 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
1adc0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ade0 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
1adf0 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
1ae00 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
1ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1ae30 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
1ae40 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1ae50 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1ae60 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
1ae70 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
1ae80 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
1ae90 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
1aea0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1aeb0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1aec0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1aed0 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
1aee0 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f   of a BtCursor o
1aef0 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a  bject in bytes..
1af00 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72  **.** This inter
1af10 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20  faces is needed 
1af20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66  so that users of
1af30 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65   cursors can pre
1af40 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66  allocate.** suff
1af50 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74  icient storage t
1af60 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e  o hold a cursor.
1af70 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f    The BtCursor o
1af80 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a  bject is opaque.
1af90 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74  ** to users so t
1afa0 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68  hey cannot do th
1afb0 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73  e sizeof() thems
1afc0 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73  elves - they mus
1afd0 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72  t call.** this r
1afe0 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  outine..*/.int s
1aff0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1b000 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72  rSize(void){.  r
1b010 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42 74 43  eturn sizeof(BtC
1b020 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ursor);.}../*.**
1b030 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64 20   Set the cached 
1b040 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65  rowid value of e
1b050 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74  very cursor in t
1b060 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
1b070 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72   file.** as pCur
1b080 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20   and having the 
1b090 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e  same root page n
1b0a0 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20 20  umber as pCur.  
1b0b0 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  The value is.** 
1b0c0 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a  set to iRowid..*
1b0d0 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69  *.** Only positi
1b0e0 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20  ve rowid values 
1b0f0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76  are considered v
1b100 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63 61  alid for this ca
1b110 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68  che..** The cach
1b120 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
1b130 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61   to zero, indica
1b140 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20  ting an invalid 
1b150 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65  cache..** A btre
1b160 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  e will work fine
1b170 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65   with zero or ne
1b180 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20  gative rowids.  
1b190 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a  We just cannot.*
1b1a0 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20  * cache zero or 
1b1b0 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c  negative rowids,
1b1c0 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62   which means tab
1b1d0 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65 72  les that use zer
1b1e0 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65  o or.** negative
1b1f0 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75   rowids might ru
1b200 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
1b210 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63 74  r.  But in pract
1b220 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ice, zero.** or 
1b230 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20  negative rowids 
1b240 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f  are very uncommo
1b250 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64  n so this should
1b260 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
1b270 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
1b280 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64  e3BtreeSetCached
1b290 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
1b2a0 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pCur, sqlite3_in
1b2b0 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42  t64 iRowid){.  B
1b2c0 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f  tCursor *p;.  fo
1b2d0 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70  r(p=pCur->pBt->p
1b2e0 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1b2f0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1b300 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75  p->pgnoRoot==pCu
1b310 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d  r->pgnoRoot ) p-
1b320 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69  >cachedRowid = i
1b330 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73  Rowid;.  }.  ass
1b340 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65  ert( pCur->cache
1b350 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29  dRowid==iRowid )
1b360 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1b370 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77  n the cached row
1b380 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  id for the given
1b390 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61   cursor.  A nega
1b3a0 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20  tive or zero.** 
1b3b0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
1b3c0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
1b3d0 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20 69  rowid cache is i
1b3e0 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
1b3f0 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  d be.** ignored.
1b400 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 63    If the rowid c
1b410 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20 62  ache has never b
1b420 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20  efore been set, 
1b430 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69  then a.** zero i
1b440 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1b450 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c  qlite3_int64 sql
1b460 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68  ite3BtreeGetCach
1b470 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  edRowid(BtCursor
1b480 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
1b490 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f  n pCur->cachedRo
1b4a0 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  wid;.}../*.** Cl
1b4b0 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
1b4c0 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
1b4d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b4e0 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
1b4f0 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
1b500 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
1b510 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b520 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
1b530 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1b540 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
1b550 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
1b560 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
1b570 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1b580 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1b590 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
1b5a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1b5b0 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71  (pBtree);.    sq
1b5c0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
1b5d0 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
1b5e0 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
1b5f0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1b600 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
1b610 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
1b620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74  }else{.      pBt
1b630 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
1b640 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1b650 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65     if( pCur->pNe
1b660 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  xt ){.      pCur
1b670 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
1b680 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20   pCur->pPrev;.  
1b690 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
1b6a0 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
1b6b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
1b6c0 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
1b6d0 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
1b6e0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
1b6f0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
1b700 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
1b710 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
1b720 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
1b730 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
1b740 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b750 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
1b760 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1b770 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1b780 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
1b790 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
1b7a0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
1b7b0 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
1b7c0 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
1b7d0 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
1b7e0 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
1b7f0 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
1b800 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
1b810 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
1b820 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
1b830 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
1b840 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
1b850 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
1b860 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
1b870 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
1b880 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
1b890 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
1b8a0 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  ell()..**.** 200
1b8b0 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20  7-06-25:  There 
1b8c0 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65  is a bug in some
1b8d0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56   versions of MSV
1b8e0 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65  C that cause the
1b8f0 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  .** compiler to 
1b900 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65  crash when getCe
1b910 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c  llInfo() is impl
1b920 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63  emented as a mac
1b930 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65  ro..** But there
1b940 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c   is a measureabl
1b950 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67  e speed advantag
1b960 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d  e to using the m
1b970 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28  acro on gcc.** (
1b980 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c  when less compil
1b990 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
1b9a0 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30   like -Os or -O0
1b9b0 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68   are used and th
1b9c0 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73  e.** compiler is
1b9d0 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73   not doing agres
1b9e0 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20  sive inlining.) 
1b9f0 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61   So we use a rea
1ba00 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  l function.** fo
1ba10 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63  r MSVC and a mac
1ba20 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e  ro for everythin
1ba30 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20  g else.  Ticket 
1ba40 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65  #2457..*/.#ifnde
1ba50 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
1ba60 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
1ba70 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
1ba80 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
1ba90 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e  nfo info;.    in
1baa0 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1bab0 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65  iPage;.    memse
1bac0 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
1bad0 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62  of(info));.    b
1bae0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1baf0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1bb00 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  ], pCur->aiIdx[i
1bb10 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  Page], &info);. 
1bb20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d     assert( memcm
1bb30 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
1bb40 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
1bb50 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
1bb60 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
1bb70 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
1bb80 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d  #endif.#ifdef _M
1bb90 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20  SC_VER.  /* Use 
1bba0 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
1bbb0 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20  in MSVC to work 
1bbc0 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74  around bugs in t
1bbd0 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f  hat compiler. */
1bbe0 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67  .  static void g
1bbf0 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
1bc00 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1bc10 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1bc20 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
1bc30 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1bc40 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20  r->iPage;.      
1bc50 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1bc60 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1bc70 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
1bc80 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
1bc90 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  o);.      pCur->
1bca0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20  validNKey = 1;. 
1bcb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bcc0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
1bcd0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
1bce0 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20  #else /* if not 
1bcf0 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a  _MSC_VER */.  /*
1bd00 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20   Use a macro in 
1bd10 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c  all other compil
1bd20 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ers so that the 
1bd30 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69  function is inli
1bd40 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67  ned */.#define g
1bd50 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd90 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43        \.  if( pC
1bda0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1bdb0 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
1bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bde0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74         \.    int
1bdf0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1be00 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1be10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be30 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74          \.    bt
1be40 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1be50 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1be60 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
1be70 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
1be80 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61  ; \.    pCur->va
1be90 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20  lidNKey = 1;    
1bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bed0 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20     \.  }else{   
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74      \.    assert
1bf30 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20  CellInfo(pCur); 
1bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf70 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69       \.  }.#endi
1bf80 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f  f /* _MSC_VER */
1bf90 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1bfa0 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
1bfb0 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
1bfc0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
1bfd0 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
1bfe0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1bff0 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
1c000 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
1c010 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
1c020 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
1c030 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1c040 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
1c050 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
1c060 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
1c070 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
1c080 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1c090 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
1c0a0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
1c0b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1c0c0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
1c0d0 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1c0e0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
1c0f0 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
1c100 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
1c110 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
1c120 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  UG */../*.** Set
1c130 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73   *pSize to the s
1c140 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65  ize of the buffe
1c150 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  r needed to hold
1c160 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
1c170 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65   the key for the
1c180 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
1c190 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
1c1a0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a  s not pointing.*
1c1b0 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  * to a valid ent
1c1c0 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65  ry, *pSize is se
1c1d0 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46  t to 0. .**.** F
1c1e0 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
1c1f0 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20  the INTKEY flag 
1c200 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  set, this routin
1c210 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65  e returns the ke
1c220 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74  y.** itself, not
1c230 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1c240 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e  ytes in the key.
1c250 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
1c260 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20  r must position 
1c270 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72  the cursor prior
1c280 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
1c290 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a  s routine..** .*
1c2a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
1c2b0 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20  annot fail.  It 
1c2c0 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
1c2d0 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69  QLITE_OK.  .*/.i
1c2e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
1c2f0 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
1c300 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
1c310 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
1c320 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1c330 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1c340 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1c350 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
1c360 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
1c370 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1c380 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1c390 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
1c3a0 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d   ){.    *pSize =
1c3b0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1c3c0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1c3d0 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d  r);.    *pSize =
1c3e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1c3f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1c400 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1c410 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
1c420 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1c430 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
1c440 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
1c450 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
1c460 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a  y points to..**.
1c470 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
1c480 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  st guarantee tha
1c490 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
1c4a0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f  pointing to a no
1c4b0 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20  n-NULL.** valid 
1c4c0 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  entry.  In other
1c4d0 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c   words, the call
1c4e0 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75  ing procedure mu
1c4f0 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20  st guarantee.** 
1c500 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
1c510 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74  has Cursor.eStat
1c520 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  e==CURSOR_VALID.
1c530 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  .**.** Failure i
1c540 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
1c550 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
1c560 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
1c570 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d  LITE_OK..** It m
1c580 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c  ight just as wel
1c590 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65  l be a procedure
1c5a0 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64   (returning void
1c5b0 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75  ) but we continu
1c5c0 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61  e.** to return a
1c5d0 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74  n integer result
1c5e0 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72   code for histor
1c5f0 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f  ical reasons..*/
1c600 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1c610 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
1c620 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
1c630 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
1c640 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1c650 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1c660 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1c670 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1c680 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
1c690 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65  (pCur);.  *pSize
1c6a0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44   = pCur->info.nD
1c6b0 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ata;.  return SQ
1c6c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1c6d0 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
1c6e0 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
1c6f0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1c700 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
1c710 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
1c720 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
1c730 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
1c740 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
1c750 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
1c760 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
1c770 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
1c780 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
1c790 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
1c7a0 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
1c7b0 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
1c7c0 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
1c7d0 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
1c7e0 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
1c7f0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1c800 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
1c810 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1c820 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1c830 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
1c840 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1c850 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
1c860 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
1c870 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
1c880 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
1c890 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
1c8a0 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
1c8b0 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
1c8c0 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
1c8d0 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
1c8e0 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
1c8f0 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
1c900 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
1c910 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
1c920 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
1c930 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
1c940 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
1c950 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
1c960 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
1c970 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1c980 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
1c990 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
1c9a0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
1c9b0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
1c9c0 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
1c9d0 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
1c9e0 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
1c9f0 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
1ca00 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
1ca10 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
1ca20 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
1ca30 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
1ca40 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
1ca50 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
1ca60 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
1ca70 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
1ca80 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
1ca90 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
1caa0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
1cab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1cac0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1cad0 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
1cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caf0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
1cb00 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
1cb10 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
1cb20 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
1cb30 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
1cb40 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
1cb50 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
1cb60 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
1cb70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1cb80 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
1cb90 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
1cba0 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
1cbb0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1cbc0 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
1cbd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1cbe0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1cbf0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1cc00 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1cc10 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
1cc20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1cc30 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1cc40 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
1cc50 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
1cc60 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
1cc70 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
1cc80 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
1cc90 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
1cca0 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
1ccb0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
1ccc0 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
1ccd0 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
1cce0 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
1ccf0 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
1cd00 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
1cd10 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
1cd20 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
1cd30 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
1cd40 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
1cd50 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
1cd60 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
1cd70 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
1cd80 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1cd90 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
1cda0 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
1cdb0 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
1cdc0 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
1cdd0 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
1cde0 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
1cdf0 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
1ce00 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1ce10 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
1ce20 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
1ce30 20 69 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67   if( iGuess<=pag
1ce40 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
1ce50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1ce60 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
1ce70 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
1ce80 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1ce90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1cea0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1ceb0 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
1cec0 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
1ced0 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
1cee0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1cef0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
1cf00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1cf10 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
1cf20 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
1cf30 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
1cf40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cf50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1cf60 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
1cf70 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b  vfl, &pPage, 0);
1cf80 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
1cf90 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
1cfa0 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  age==0 );.    if
1cfb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cfc0 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
1cfd0 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
1cfe0 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
1cff0 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20  }..  *pPgnoNext 
1d000 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70  = next;.  if( pp
1d010 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50  Page ){.    *ppP
1d020 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d  age = pPage;.  }
1d030 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
1d040 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
1d050 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  }.  return (rc==
1d060 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51  SQLITE_DONE ? SQ
1d070 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d  LITE_OK : rc);.}
1d080 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
1d090 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
1d0a0 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
1d0b0 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
1d0c0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
1d0d0 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
1d0e0 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
1d0f0 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
1d100 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
1d110 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
1d120 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
1d130 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
1d140 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
1d150 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
1d160 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
1d170 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
1d180 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
1d190 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
1d1a0 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
1d1b0 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
1d1c0 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
1d1d0 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
1d1e0 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
1d1f0 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
1d200 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
1d210 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1d220 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
1d230 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
1d240 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
1d250 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
1d260 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
1d270 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
1d280 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
1d290 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
1d2a0 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
1d2b0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1d2c0 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
1d2d0 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
1d2e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d2f0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1d300 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
1d310 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
1d320 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
1d330 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
1d340 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
1d350 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
1d360 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
1d370 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
1d380 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
1d390 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
1d3a0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
1d3b0 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
1d3c0 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
1d3d0 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
1d3e0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
1d3f0 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
1d400 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1d410 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d420 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d430 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
1d440 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
1d450 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
1d460 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1d470 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
1d480 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
1d490 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
1d4a0 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
1d4b0 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
1d4c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d4d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1d4e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1d4f0 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
1d500 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
1d510 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
1d520 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
1d530 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
1d540 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
1d550 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a  o. If the eOp.**
1d560 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
1d570 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
1d580 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20  operation (data 
1d590 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62  copied into.** b
1d5a0 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20  uffer pBuf). If 
1d5b0 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  it is non-zero, 
1d5c0 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f  a write (data co
1d5d0 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66  pied from.** buf
1d5e0 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a  fer pBuf)..**.**
1d5f0 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
1d600 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
1d610 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
1d620 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
1d630 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
1d640 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
1d650 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
1d660 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
1d670 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
1d680 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
1d690 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
1d6a0 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
1d6b0 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
1d6c0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
1d6d0 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
1d6e0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73   the BtCursor.is
1d6f0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
1d700 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20  lag is set, and 
1d710 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
1d720 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73  ursor entry uses
1d730 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
1d740 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69  rflow pages, thi
1d750 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c  s function.** al
1d760 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f  locates space fo
1d770 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70  r and lazily pop
1d780 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66  luates the overf
1d790 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a  low page-list .*
1d7a0 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  * cache array (B
1d7b0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
1d7c0 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63  w). Subsequent c
1d7d0 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a  alls use this.**
1d7e0 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
1d7f0 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
1d800 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f  pplied offset mo
1d810 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
1d820 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
1d830 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1d840 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
1d850 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20  located, it may 
1d860 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
1d870 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
1d880 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
1d890 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
1d8a0 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
1d8b0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
1d8c0 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
1d8d0 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
1d8e0 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
1d8f0 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
1d900 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
1d910 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
1d920 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1d930 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
1d940 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
1d950 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
1d960 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
1d970 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
1d980 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
1d990 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
1d9a0 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
1d9b0 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
1d9c0 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
1d9d0 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
1d9e0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1d9f0 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
1da00 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
1da10 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
1da20 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
1da30 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
1da40 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
1da50 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
1da60 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da80 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
1da90 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
1daa0 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
1dab0 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
1dac0 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
1dad0 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1daf0 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
1db00 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
1db10 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
1db20 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
1db30 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
1db40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e  LITE_OK;.  u32 n
1db50 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  Key;.  int iIdx 
1db60 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
1db70 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1db80 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1db90 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
1dba0 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
1dbb0 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
1dbc0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
1dbd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dbe0 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
1dbf0 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
1dc00 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
1dc10 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
1dc20 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1dc30 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1dc40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1dc50 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1dc60 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1dc70 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  l );.  assert( c
1dc80 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1dc90 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43  pCur) );..  getC
1dca0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1dcb0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
1dcc0 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70  ->info.pCell + p
1dcd0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
1dce0 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61  r;.  nKey = (pPa
1dcf0 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a  ge->intKey ? 0 :
1dd00 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
1dd10 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e  .nKey);..  if( N
1dd20 45 56 45 52 28 6f 66 66 73 65 74 2b 61 6d 74 20  EVER(offset+amt 
1dd30 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66  > nKey+pCur->inf
1dd40 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c 20  o.nData) .   || 
1dd50 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
1dd60 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
1dd70 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
1dd80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20  ->usableSize].  
1dd90 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
1dda0 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1ddb0 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
1ddc0 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
1ddd0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65   error */.    re
1dde0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1ddf0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
1de00 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
1de10 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
1de20 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
1de30 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
1de40 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
1de50 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
1de60 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
1de70 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
1de80 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
1de90 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
1dea0 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
1deb0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
1dec0 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
1ded0 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
1dee0 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
1def0 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
1df00 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
1df10 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
1df20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
1df30 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
1df40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
1df50 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
1df60 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
1df70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1df80 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
1df90 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
1dfa0 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
1dfb0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
1dfc0 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
1dfd0 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
1dfe0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
1dff0 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
1e000 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
1e010 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
1e020 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69  fo.nLocal]);..#i
1e030 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e040 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f  T_INCRBLOB.    /
1e050 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62  * If the isIncrb
1e060 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
1e070 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74  s set and the Bt
1e080 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
1e090 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  [].    ** has no
1e0a0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
1e0b0 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
1e0c0 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20  w. The array is 
1e0d0 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20  sized at.    ** 
1e0e0 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
1e0f0 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
1e100 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
1e110 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20   chain. The.    
1e120 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
1e130 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
1e140 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f  flow page is sto
1e150 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
1e160 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e  [0],.    ** etc.
1e170 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
1e180 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
1e190 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f   array means "no
1e1a0 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20  t yet known".   
1e1b0 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69   ** (the cache i
1e1c0 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
1e1d0 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
1e1e0 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  if( pCur->isIncr
1e1f0 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70  blobHandle && !p
1e200 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
1e210 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
1e220 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
1e230 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
1e240 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
1e250 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
1e260 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76  .      pCur->aOv
1e270 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a  erflow = (Pgno *
1e280 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
1e290 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a  ro(sizeof(Pgno)*
1e2a0 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a  nOvfl);.      /*
1e2b0 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77 61 79 73   nOvfl is always
1e2c0 20 70 6f 73 69 74 69 76 65 2e 20 20 49 66 20 69   positive.  If i
1e2d0 74 20 77 65 72 65 20 7a 65 72 6f 2c 20 66 65 74  t were zero, fet
1e2e0 63 68 50 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20  chPayload would 
1e2f0 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  have.      ** be
1e300 65 6e 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  en used instead 
1e310 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  of this routine.
1e320 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
1e330 57 41 59 53 28 6e 4f 76 66 6c 29 20 26 26 20 21  WAYS(nOvfl) && !
1e340 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1e350 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e360 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1e370 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1e380 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
1e390 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1e3a0 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
1e3b0 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
1e3c0 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
1e3d0 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
1e3e0 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
1e3f0 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
1e400 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
1e410 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  to it..    */.  
1e420 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
1e430 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
1e440 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f  Overflow[offset/
1e450 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ovflSize] ){.   
1e460 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65     iIdx = (offse
1e470 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t/ovflSize);.   
1e480 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
1e490 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1e4a0 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  dx];.      offse
1e4b0 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
1e4c0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Size);.    }.#en
1e4d0 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20  dif..    for( ; 
1e4e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1e4f0 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
1e500 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69  ge; iIdx++){..#i
1e510 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e520 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
1e530 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
1e540 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
1e550 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1e560 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
1e570 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
1e580 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
1e590 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
1e5a0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c  verflow[iIdx] ||
1e5b0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1e5c0 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
1e5d0 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
1e5e0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1e5f0 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
1e600 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1e610 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f     if( offset>=o
1e620 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
1e630 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72     /* The only r
1e640 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68  eason to read th
1e650 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62  is page is to ob
1e660 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20  tain the page.  
1e670 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
1e680 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67  for the next pag
1e690 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
1e6a0 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
1e6b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
1e6c0 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  a is not require
1e6d0 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20  d. So first try 
1e6e0 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76  to lookup the ov
1e6f0 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a  erflow.        *
1e700 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  * page-list cach
1e710 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20  e, if any, then 
1e720 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
1e730 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1e740 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  ().        ** fu
1e750 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  nction..        
1e760 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1e770 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1e780 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
1e790 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
1e7a0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1e7b0 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Idx+1] ){.      
1e7c0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
1e7d0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1e7e0 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Idx+1];.        
1e7f0 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20  } else .#endif. 
1e800 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
1e810 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
1e820 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
1e830 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
1e840 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
1e850 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
1e860 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1e870 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
1e880 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
1e890 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
1e8a0 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
1e8b0 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
1e8c0 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
1e8d0 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
1e8e0 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
1e8f0 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )..        */.  
1e900 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
1e910 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69  bPage;.        i
1e920 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
1e930 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e940 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
1e950 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
1e960 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  &pDbPage);.     
1e970 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e990 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
1e9a0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
1e9b0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
1e9c0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
1e9d0 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
1e9e0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
1e9f0 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
1ea00 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
1ea10 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
1ea20 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
1ea30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ea40 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
1ea50 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
1ea60 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
1ea70 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29  a, eOp, pDbPage)
1ea80 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1ea90 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
1eaa0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1eab0 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
1eac0 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
1ead0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 66  ;.          pBuf
1eae0 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d   += a;.        }
1eaf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1eb00 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
1eb10 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
1eb20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1eb30 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1eb40 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
1eb50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1eb60 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b  ad part of the k
1eb70 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
1eb80 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
1eb90 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
1eba0 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
1ebb0 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
1ebc0 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
1ebd0 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
1ebe0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
1ebf0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1ec00 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
1ec10 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
1ec20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
1ec30 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
1ec40 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1ec50 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
1ec60 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
1ec70 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
1ec80 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
1ec90 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1eca0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1ecb0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
1ecc0 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
1ecd0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
1ece0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1ecf0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1ed00 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
1ed10 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
1ed20 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
1ed30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ed40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1ed50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1ed60 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
1ed70 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
1ed80 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
1ed90 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
1eda0 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
1edb0 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
1edc0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
1edd0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1ede0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
1edf0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1ee00 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1ee10 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
1ee20 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
1ee30 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  ll );.    rc = a
1ee40 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
1ee50 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
1ee60 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
1ee70 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pBuf, 0);.  }.  
1ee80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ee90 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
1eea0 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69   the data associ
1eeb0 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
1eec0 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
1eed0 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
1eee0 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
1eef0 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
1ef00 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
1ef10 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
1ef20 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
1ef30 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
1ef40 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
1ef50 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
1ef60 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
1ef70 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
1ef80 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
1ef90 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
1efa0 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
1efb0 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
1efc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1efd0 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f  treeData(BtCurso
1efe0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
1eff0 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
1f000 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
1f010 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51   rc;..#ifndef SQ
1f020 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1f030 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e  OB.  if ( pCur->
1f040 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1f050 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  NVALID ){.    re
1f060 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
1f070 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
1f080 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1f090 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1f0a0 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
1f0b0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
1f0c0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1f0d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f0e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1f0f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1f100 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
1f110 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
1f120 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
1f130 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
1f140 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1f150 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1f160 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
1f170 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1f180 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
1f190 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
1f1a0 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
1f1b0 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a   amt, pBuf, 0);.
1f1c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1f1d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1f1e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
1f1f0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
1f200 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
1f210 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
1f220 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
1f230 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
1f240 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
1f250 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
1f260 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70   the key if skip
1f270 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f  Key==0 and it po
1f280 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69  ints to the begi
1f290 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66  nning of data if
1f2a0 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20  .** skipKey==1. 
1f2b0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
1f2c0 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
1f2d0 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72  e key/data is wr
1f2e0 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
1f2f0 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
1f300 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
1f310 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
1f320 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69  not be.** a vali
1f330 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
1f340 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1f350 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
1f360 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
1f370 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
1f380 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
1f390 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
1f3a0 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
1f3b0 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
1f3c0 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
1f3d0 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
1f3e0 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
1f3f0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
1f400 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
1f410 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
1f420 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
1f430 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
1f440 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
1f450 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
1f460 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
1f470 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
1f480 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
1f490 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20  assemble.** the 
1f4a0 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
1f4b0 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
1f4c0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
1f4d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
1f4e0 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
1f4f0 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
1f500 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
1f510 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
1f520 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
1f530 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
1f540 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
1f550 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
1f560 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
1f570 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1f580 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1f590 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1f5a0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
1f5b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1f5c0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
1f5d0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
1f5e0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
1f5f0 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20  .  int *pAmt,   
1f600 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1f610 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
1f620 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
1f630 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69  ere */.  int ski
1f640 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a  pKey          /*
1f650 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20   read beginning 
1f660 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
1f670 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  is true */.){.  
1f680 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1f690 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61  Payload;.  MemPa
1f6a0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32  ge *pPage;.  u32
1f6b0 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f   nKey;.  u32 nLo
1f6c0 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  cal;..  assert( 
1f6d0 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
1f6e0 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
1f6f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1f700 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72  iPage]);.  asser
1f710 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1f720 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1f730 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1f740 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1f750 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  ) );.  pPage = p
1f760 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1f770 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
1f780 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1f790 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
1f7a0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  ge->nCell );.  i
1f7b0 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 69  f( NEVER(pCur->i
1f7c0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 29 20 29 7b  nfo.nSize==0) ){
1f7d0 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
1f7e0 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1f7f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 20 70  [pCur->iPage], p
1f800 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1f810 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20  >iPage],.       
1f820 20 20 20 20 20 20 20 20 20 20 20 20 26 70 43 75              &pCu
1f830 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20  r->info);.  }.  
1f840 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
1f850 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61  >info.pCell;.  a
1f860 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d  Payload += pCur-
1f870 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
1f880 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1f890 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  ey ){.    nKey =
1f8a0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1f8b0 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75   nKey = (int)pCu
1f8c0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
1f8d0 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  }.  if( skipKey 
1f8e0 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20  ){.    aPayload 
1f8f0 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f  += nKey;.    nLo
1f900 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
1f910 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a  .nLocal - nKey;.
1f920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f    }else{.    nLo
1f930 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
1f940 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 61 73 73  .nLocal;.    ass
1f950 65 72 74 28 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65  ert( nLocal<=nKe
1f960 79 20 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74  y );.  }.  *pAmt
1f970 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74   = nLocal;.  ret
1f980 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a  urn aPayload;.}.
1f990 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
1f9a0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
1f9b0 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20  r pCur is point 
1f9c0 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a  to, return as.**
1f9d0 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74   many bytes of t
1f9e0 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61  he key or data a
1f9f0 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
1fa00 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20  on the local.** 
1fa10 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72  b-tree page.  Wr
1fa20 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
1fa30 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
1fa40 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a  s into *pAmt..**
1fa50 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
1fa60 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65  returned is ephe
1fa70 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f  meral.  The key/
1fa80 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a  data may move.**
1fa90 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64   or be destroyed
1faa0 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c   on the next cal
1fab0 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72  l to any Btree r
1fac0 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75  outine,.** inclu
1fad0 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20  ding calls from 
1fae0 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67  other threads ag
1faf0 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63  ainst the same c
1fb00 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  ache..** Hence, 
1fb10 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
1fb20 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62  tShared should b
1fb30 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20  e held prior to 
1fb40 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20  calling.** this 
1fb50 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
1fb60 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73  hese routines is
1fb70 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69   used to get qui
1fb80 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79  ck access to key
1fb90 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20   and data.** in 
1fba0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
1fbb0 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  where no overflo
1fbc0 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64  w pages are used
1fbd0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
1fbe0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79  *sqlite3BtreeKey
1fbf0 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
1fc00 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29  pCur, int *pAmt)
1fc10 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  {.  const void *
1fc20 70 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  p = 0;.  assert(
1fc30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1fc40 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
1fc50 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
1fc60 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1fc70 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1fc80 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
1fc90 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43  (pCur->eState==C
1fca0 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a  URSOR_VALID) ){.
1fcb0 20 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76      p = (const v
1fcc0 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
1fcd0 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29  d(pCur, pAmt, 0)
1fce0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1fcf0 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.}.const void *
1fd00 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
1fd10 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
1fd20 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29  pCur, int *pAmt)
1fd30 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  {.  const void *
1fd40 70 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  p = 0;.  assert(
1fd50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1fd60 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
1fd70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
1fd80 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1fd90 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1fda0 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
1fdb0 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43  (pCur->eState==C
1fdc0 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a  URSOR_VALID) ){.
1fdd0 20 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76      p = (const v
1fde0 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
1fdf0 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29  d(pCur, pAmt, 1)
1fe00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1fe10 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
1fe20 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
1fe30 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
1fe40 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
1fe50 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
1fe60 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
1fe70 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
1fe80 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
1fe90 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1fea0 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
1feb0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68  TE_CORRUPT if th
1fec0 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  e page-header fl
1fed0 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20  ags field of.** 
1fee0 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
1fef0 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ge does not matc
1ff00 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c  h the flags fiel
1ff10 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  d of the parent 
1ff20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69  (i.e..** if an i
1ff30 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61  ntkey page appea
1ff40 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72  rs to be the par
1ff50 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74  ent of a non-int
1ff60 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20  key page, or.** 
1ff70 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a  vice-versa)..*/.
1ff80 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1ff90 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
1ffa0 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
1ffb0 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  no){.  int rc;. 
1ffc0 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69   int i = pCur->i
1ffd0 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Page;.  MemPage 
1ffe0 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53  *pNewPage;.  BtS
1fff0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
20000 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  r->pBt;..  asser
20010 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
20020 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
20030 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
20040 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
20050 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
20060 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
20070 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
20080 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
20090 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41  ge>=(BTCURSOR_MA
200a0 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20  X_DEPTH-1) ){.  
200b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
200c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
200d0 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  }.  rc = getAndI
200e0 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77  nitPage(pBt, new
200f0 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29  Pgno, &pNewPage)
20100 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
20110 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e  urn rc;.  pCur->
20120 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e  apPage[i+1] = pN
20130 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e  ewPage;.  pCur->
20140 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a  aiIdx[i+1] = 0;.
20150 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b    pCur->iPage++;
20160 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ..  pCur->info.n
20170 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
20180 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
20190 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d  .  if( pNewPage-
201a0 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77  >nCell<1 || pNew
201b0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43  Page->intKey!=pC
201c0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69  ur->apPage[i]->i
201d0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
201e0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
201f0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
20200 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20210 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
20220 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50  UG./*.** Page pP
20230 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
20240 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
20250 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
20260 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
20270 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
20280 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
20290 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
202a0 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
202b0 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
202c0 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
202d0 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
202e0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
202f0 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
20300 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
20310 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
20320 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
20330 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
20340 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
20350 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
20360 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
20370 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
20380 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
20390 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
203a0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
203b0 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
203c0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
203d0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
203e0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
203f0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
20400 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
20410 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
20420 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
20430 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
20440 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
20450 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
20460 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
20470 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
20480 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
20490 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
204a0 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
204b0 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
204c0 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
204d0 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
204e0 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
204f0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
20500 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
20510 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
20520 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
20530 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
20540 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
20550 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
20560 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
20570 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
20580 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
20590 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
205a0 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
205b0 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
205c0 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
205d0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
205e0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
205f0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
20600 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
20610 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20620 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
20630 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
20640 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
20650 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e  );.  assertParen
20660 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72  tIndex(.    pCur
20670 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
20680 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
20690 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
206a0 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
206b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
206c0 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20  ->iPage]->pgno. 
206d0 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67   );.  releasePag
206e0 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  e(pCur->apPage[p
206f0 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
20700 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
20710 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
20720 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
20730 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a  alidNKey = 0;.}.
20740 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
20750 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
20760 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
20770 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73   of its b-tree s
20780 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
20790 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  If the table has
207a0 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
207b0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63  page, then the c
207c0 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
207d0 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68  o point.** to th
207e0 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  e virtual root p
207f0 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74  age instead of t
20800 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
20810 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73  age. A table has
20820 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f   a.** virtual ro
20830 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65  ot page when the
20840 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
20850 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
20860 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69  lls and a .** si
20870 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e  ngle child page.
20880 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   This can only h
20890 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74  appen with the t
208a0 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70  able rooted at p
208b0 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age 1..**.** If 
208c0 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  the b-tree struc
208d0 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ture is empty, t
208e0 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
208f0 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55  is set to .** CU
20900 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74  RSOR_INVALID. Ot
20910 68 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72  herwise, the cur
20920 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f  sor is set to po
20930 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  int to the first
20940 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64  .** cell located
20950 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72   on the root (or
20960 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70   virtual root) p
20970 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73  age and the curs
20980 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73  or state.** is s
20990 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c  et to CURSOR_VAL
209a0 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ID..**.** If thi
209b0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
209c0 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ns successfully,
209d0 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d   it may be assum
209e0 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70  ed that the.** p
209f0 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73  age-header flags
20a00 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
20a10 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f  he [virtual] roo
20a20 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78  t-page is the ex
20a30 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20  pected .** kind 
20a40 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28  of b-tree page (
20a50 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65  i.e. if when ope
20a60 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
20a70 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e  the caller did n
20a80 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20  ot.** specify a 
20a90 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
20aa0 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
20ab0 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20   is set to 0x05 
20ac0 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69  or 0x0D,.** indi
20ad0 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62  cating a table b
20ae0 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65  -tree, or if the
20af0 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63   caller did spec
20b00 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a  ify a KeyInfo .*
20b10 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  * structure the 
20b20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
20b30 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30  t to 0x02 or 0x0
20b40 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e  A, indicating an
20b50 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65   index.** b-tree
20b60 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
20b70 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
20b80 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
20b90 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
20ba0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20bb0 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  _OK;.  Btree *p 
20bc0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
20bd0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20be0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
20bf0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
20c00 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
20c10 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
20c20 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
20c30 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
20c40 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
20c50 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
20c60 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
20c70 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
20c80 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
20c90 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
20ca0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
20cb0 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
20cc0 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
20cd0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
20ce0 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
20cf0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20d00 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d  pCur->skipNext!=
20d10 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
20d20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
20d30 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  skipNext;.    }.
20d40 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20d50 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
20d60 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43  );.  }..  if( pC
20d70 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a  ur->iPage>=0 ){.
20d80 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
20d90 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d  or(i=1; i<=pCur-
20da0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
20db0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
20dc0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
20dd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
20de0 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  ->iPage = 0;.  }
20df0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67  else{.    rc = g
20e00 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
20e10 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
20e20 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  t, &pCur->apPage
20e30 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [0]);.    if( rc
20e40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20e50 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
20e60 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
20e70 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ID;.      return
20e80 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
20e90 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
20ea0 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 75 72 2d  .    /* If pCur-
20eb0 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74  >pKeyInfo is not
20ec0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
20ed0 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e  caller that open
20ee0 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20  ed this cursor. 
20ef0 20 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74     ** expected t
20f00 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20  o open it on an 
20f10 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74  index b-tree. Ot
20f20 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79  herwise, if pKey
20f30 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a 2a 20 4e  Info is.    ** N
20f40 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ULL, the caller 
20f50 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20  expects a table 
20f60 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20  b-tree. If this 
20f70 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c  is not the case,
20f80 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61  .    ** return a
20f90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
20fa0 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20   error.  */.    
20fb0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
20fc0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
20fd0 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =1 || pCur->apPa
20fe0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30  ge[0]->intKey==0
20ff0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 43 75   );.    if( (pCu
21000 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21  r->pKeyInfo==0)!
21010 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  =pCur->apPage[0]
21020 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
21030 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21040 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
21050 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73    }.  }..  /* As
21060 73 65 72 74 20 74 68 61 74 20 74 68 65 20 72 6f  sert that the ro
21070 6f 74 20 70 61 67 65 20 69 73 20 6f 66 20 74 68  ot page is of th
21080 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 2e 20  e correct type. 
21090 54 68 69 73 20 6d 75 73 74 20 62 65 20 74 68 65  This must be the
210a0 0a 20 20 2a 2a 20 63 61 73 65 20 61 73 20 74 68  .  ** case as th
210b0 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66  e call to this f
210c0 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61  unction that loa
210d0 64 65 64 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  ded the root-pag
210e0 65 20 28 65 69 74 68 65 72 0a 20 20 2a 2a 20 74  e (either.  ** t
210f0 68 69 73 20 63 61 6c 6c 20 6f 72 20 61 20 70 72  his call or a pr
21100 65 76 69 6f 75 73 20 69 6e 76 6f 63 61 74 69 6f  evious invocatio
21110 6e 29 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  n) would have de
21120 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
21130 6e 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 61  n .  ** if the a
21140 73 73 75 6d 70 74 69 6f 6e 20 77 65 72 65 20 6e  ssumption were n
21150 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 69 74 20  ot true, and it 
21160 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
21170 66 6f 72 20 74 68 65 20 66 6c 61 67 73 20 0a 20  for the flags . 
21180 20 2a 2a 20 62 79 74 65 20 74 6f 20 68 61 76 65   ** byte to have
21190 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 77   been modified w
211a0 68 69 6c 65 20 74 68 69 73 20 63 75 72 73 6f 72  hile this cursor
211b0 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65   is holding a re
211c0 66 65 72 65 6e 63 65 0a 20 20 2a 2a 20 74 6f 20  ference.  ** to 
211d0 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  the page.  */.  
211e0 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70  pRoot = pCur->ap
211f0 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72  Page[0];.  asser
21200 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
21210 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
21220 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
21230 74 2d 3e 69 73 49 6e 69 74 20 26 26 20 28 70 43  t->isInit && (pC
21240 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
21250 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  ==pRoot->intKey 
21260 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  );..  pCur->aiId
21270 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  x[0] = 0;.  pCur
21280 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
21290 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  ;.  pCur->atLast
212a0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
212b0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20  lidNKey = 0;..  
212c0 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
212d0 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c  ==0 && !pRoot->l
212e0 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
212f0 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28  subpage;.    if(
21300 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20   pRoot->pgno!=1 
21310 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
21320 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
21330 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
21340 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
21350 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
21360 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
21370 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
21380 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63  OR_VALID;.    rc
21390 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
213a0 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20  Cur, subpage);. 
213b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
213c0 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 52 6f  ->eState = ((pRo
213d0 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52  ot->nCell>0)?CUR
213e0 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52  SOR_VALID:CURSOR
213f0 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20  _INVALID);.  }. 
21400 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21410 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
21420 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
21430 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
21440 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
21450 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68  e.** entry to wh
21460 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
21470 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
21480 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
21490 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e  t leaf is the on
214a0 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  e with the small
214b0 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69  est key - the fi
214c0 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  rst.** in ascend
214d0 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
214e0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c  atic int moveToL
214f0 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  eftmost(BtCursor
21500 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
21510 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
21520 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
21530 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
21540 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
21550 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
21560 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
21570 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21580 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
21590 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
215a0 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
215b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
215c0 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20  ->iPage])->leaf 
215d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
215e0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
215f0 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
21600 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f  Cell );.    pgno
21610 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
21620 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
21630 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
21640 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d  age]));.    rc =
21650 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
21660 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
21670 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21680 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
21690 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
216a0 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
216b0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
216c0 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69  e.** page to whi
216d0 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
216e0 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f  ly pointing.  No
216f0 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65  tice the differe
21700 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d  nce.** between m
21710 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20  oveToLeftmost() 
21720 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  and moveToRightm
21730 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65  ost().  moveToLe
21740 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  ftmost().** find
21750 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
21760 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
21770 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61  e *entry* wherea
21780 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  s moveToRightmos
21790 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
217a0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
217b0 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70  y beneath the *p
217c0 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  age*..**.** The 
217d0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
217e0 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
217f0 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
21800 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b   - the last.** k
21810 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ey in ascending 
21820 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
21830 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74   int moveToRight
21840 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
21850 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
21860 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
21870 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
21880 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a  ge *pPage = 0;..
21890 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
218a0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
218b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
218c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
218d0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
218e0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
218f0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
21900 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21910 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
21920 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
21930 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
21940 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
21950 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
21960 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
21970 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
21980 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20  ->nCell;.    rc 
21990 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
219a0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
219b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
219c0 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  OK ){.    pCur->
219d0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
219e0 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
219f0 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  l-1;.    pCur->i
21a00 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
21a10 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
21a20 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ey = 0;.  }.  re
21a30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
21a40 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
21a50 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
21a60 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
21a70 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
21a80 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
21a90 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
21aa0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
21ab0 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
21ac0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
21ad0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
21ae0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
21af0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
21b00 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
21b10 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
21b20 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
21b30 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
21b40 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21b50 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
21b60 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
21b70 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
21b80 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
21b90 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
21ba0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
21bb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21bc0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
21bd0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21be0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
21bf0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
21c00 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21c10 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
21c20 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
21c30 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  1;.      rc = SQ
21c40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
21c50 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
21c60 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
21c70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
21c80 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  ll>0 );.      *p
21c90 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
21ca0 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
21cb0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
21cc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21cd0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
21ce0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
21cf0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
21d00 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
21d10 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
21d20 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
21d30 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
21d40 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
21d50 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
21d60 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
21d70 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
21d80 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
21d90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
21da0 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
21db0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
21dc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
21dd0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
21de0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
21df0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
21e00 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
21e10 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
21e20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
21e30 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
21e40 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74  already points t
21e50 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
21e60 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
21e70 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53  p. */.  if( CURS
21e80 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
21e90 65 53 74 61 74 65 20 26 26 20 70 43 75 72 2d 3e  eState && pCur->
21ea0 61 74 4c 61 73 74 20 29 7b 0a 23 69 66 64 65 66  atLast ){.#ifdef
21eb0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
21ec0 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
21ed0 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74  serves to assert
21ee0 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73  () that the curs
21ef0 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70  or really does p
21f00 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20  oint .    ** to 
21f10 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
21f20 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f  n the b-tree. */
21f30 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
21f40 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43   for(ii=0; ii<pC
21f50 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29  ur->iPage; ii++)
21f60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21f70 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d  pCur->aiIdx[ii]=
21f80 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69  =pCur->apPage[ii
21f90 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
21fa0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
21fb0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21fc0 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70  iPage]==pCur->ap
21fd0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
21fe0 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20  ]->nCell-1 );.  
21ff0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22000 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22010 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e  ge]->leaf );.#en
22020 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
22030 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
22040 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
22050 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
22060 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22070 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
22080 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
22090 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ate ){.      ass
220a0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
220b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
220c0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
220d0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
220e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
220f0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
22100 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
22110 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
22120 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
22130 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
22140 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75  pCur);.      pCu
22150 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d  r->atLast = rc==
22160 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a  SQLITE_OK ?1:0;.
22170 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22180 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
22190 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
221a0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
221b0 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
221c0 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
221d0 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
221e0 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
221f0 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
22200 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
22210 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
22220 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
22230 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
22240 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
22250 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
22260 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
22270 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
22280 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
22290 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
222a0 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
222b0 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
222c0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
222d0 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
222e0 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
222f0 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
22300 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
22310 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
22320 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
22330 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
22340 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
22350 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
22360 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
22370 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
22380 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
22390 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
223a0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
223b0 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
223c0 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
223d0 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
223e0 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
223f0 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
22400 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
22410 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
22420 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
22430 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
22440 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
22450 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
22460 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
22470 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22490 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
224a0 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
224b0 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
224c0 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
224d0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
224e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
224f0 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
22500 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
22510 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
22520 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
22530 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
22540 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
22550 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
22560 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
22570 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
22580 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
22590 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
225a0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
225b0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
225c0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225e0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
225f0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
22600 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
22610 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
22620 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
22630 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
22640 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
22650 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55   be moved */.  U
22660 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
22670 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63  IdxKey, /* Unpac
22680 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
22690 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20  .  i64 intKey,  
226a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
226b0 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a  he table key */.
226c0 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
226d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
226e0 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
226f0 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
22700 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
22710 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
22720 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
22730 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
22740 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
22750 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
22760 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
22770 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
22780 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
22790 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
227a0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
227b0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29    assert( pRes )
227c0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64  ;.  assert( (pId
227d0 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
227e0 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b  >pKeyInfo==0) );
227f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
22800 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
22810 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
22820 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
22830 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
22840 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
22850 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
22860 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
22870 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  /.  if( pCur->eS
22880 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
22890 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69  ID && pCur->vali
228a0 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75  dNKey .   && pCu
228b0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
228c0 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69  tKey .  ){.    i
228d0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
228e0 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
228f0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
22900 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22910 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
22920 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73   if( pCur->atLas
22930 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t && pCur->info.
22940 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  nKey<intKey ){. 
22950 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b       *pRes = -1;
22960 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
22970 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
22980 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
22990 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
229a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
229b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
229c0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
229d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
229e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
229f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22a00 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29  iPage]->isInit )
22a10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
22a20 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22a30 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  Page]->nCell>0 |
22a40 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
22a50 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
22a60 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
22a70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
22a80 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65  ALID ){.    *pRe
22a90 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  s = -1;.    asse
22aa0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
22ab0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
22ac0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Cell==0 );.    r
22ad0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22ae0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
22af0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
22b00 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65  intKey || pIdxKe
22b10 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  y );.  for(;;){.
22b20 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72      int lwr, upr
22b30 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
22b40 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
22b50 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
22b60 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22b70 5d 3b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20  ];.    int c;.. 
22b80 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65     /* pPage->nCe
22b90 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  ll must be great
22ba0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66  er than zero. If
22bb0 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f   this is the roo
22bc0 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68  t-page.    ** th
22bd0 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68  e cursor would h
22be0 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44  ave been INVALID
22bf0 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20   above and this 
22c00 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20  for(;;) loop.   
22c10 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20   ** not run. If 
22c20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
22c30 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20  root-page, then 
22c40 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  the moveToChild(
22c50 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  ) routine.    **
22c60 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65   would have alre
22c70 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20  ady detected db 
22c80 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69  corruption. Simi
22c90 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73  larly, pPage mus
22ca0 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
22cb0 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65  right kind (inde
22cc0 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62  x or table) of b
22cd0 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65  -tree page. Othe
22ce0 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d  rwise.    ** a m
22cf0 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20  oveToChild() or 
22d00 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c  moveToRoot() cal
22d10 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74  l would have det
22d20 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e  ected corruption
22d30 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
22d40 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
22d50 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
22d60 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28  pPage->intKey==(
22d70 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20  pIdxKey==0) );. 
22d80 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
22d90 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
22da0 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 62 69  ll-1;.    if( bi
22db0 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  asRight ){.     
22dc0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
22dd0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
22de0 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  )upr;.    }else{
22df0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
22e00 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
22e10 3d 20 28 75 31 36 29 28 28 75 70 72 2b 6c 77 72  = (u16)((upr+lwr
22e20 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  )/2);.    }.    
22e30 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 69  for(;;){.      i
22e40 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  nt idx = pCur->a
22e50 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22e60 5d 3b 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63  ]; /* Index of c
22e70 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70  urrent cell in p
22e80 50 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 75 38  Page */.      u8
22e90 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22eb0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
22ec0 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
22ed0 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20  pPage */..      
22ee0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
22ef0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 65 6c   = 0;.      pCel
22f00 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
22f10 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65  ge, idx) + pPage
22f20 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
22f30 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
22f40 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
22f50 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
22f60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
22f70 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
22f80 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d           u32 dum
22f90 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  my;.          pC
22fa0 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ell += getVarint
22fb0 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29  32(pCell, dummy)
22fc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22fd0 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43      getVarint(pC
22fe0 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c  ell, (u64*)&nCel
22ff0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  lKey);.        i
23000 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74  f( nCellKey==int
23010 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
23020 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   c = 0;.        
23030 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
23040 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
23050 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20         c = -1;. 
23060 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23070 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23080 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20  nCellKey>intKey 
23090 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
230a0 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
230b0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c         pCur->val
230c0 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  idNKey = 1;.    
230d0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
230e0 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a  Key = nCellKey;.
230f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23100 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69       /* The maxi
23110 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61  mum supported pa
23120 67 65 2d 73 69 7a 65 20 69 73 20 33 32 37 36 38  ge-size is 32768
23130 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61   bytes. This mea
23140 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ns that.        
23150 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** the maximum n
23160 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20  umber of record 
23170 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20  bytes stored on 
23180 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a  an index B-Tree.
23190 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
231a0 69 73 20 61 74 20 6d 6f 73 74 20 38 31 39 38 20  is at most 8198 
231b0 62 79 74 65 73 2c 20 77 68 69 63 68 20 6d 61 79  bytes, which may
231c0 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20   be stored as a 
231d0 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a  2-byte.        *
231e0 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69  * varint. This i
231f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
23200 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  ed to attempt to
23210 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a   avoid parsing .
23220 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
23230 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68  ntire cell by ch
23240 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63  ecking for the c
23250 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72  ases where the r
23260 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20  ecord is .      
23270 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69    ** stored enti
23280 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20  rely within the 
23290 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69  b-tree page by i
232a0 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69  nspecting the fi
232b0 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  rst .        ** 
232c0 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  2 bytes of the c
232d0 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ell..        */.
232e0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c          int nCel
232f0 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20  l = pCell[0];.  
23300 20 20 20 20 20 20 69 66 28 20 21 28 6e 43 65 6c        if( !(nCel
23310 6c 20 26 20 30 78 38 30 29 20 26 26 20 6e 43 65  l & 0x80) && nCe
23320 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ll<=pPage->maxLo
23330 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  cal ){.         
23340 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
23350 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f  runs if the reco
23360 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  rd-size field of
23370 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20   the cell is a. 
23380 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
23390 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61  le byte varint a
233a0 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69  nd the record fi
233b0 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
233c0 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20  he main.        
233d0 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65    ** b-tree page
233e0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
233f0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
23400 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
23410 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
23420 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[1], pIdxKey);.
23430 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
23440 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30  ( !(pCell[1] & 0
23450 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20  x80) .          
23460 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43  && (nCell = ((nC
23470 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20  ell&0x7f)<<7) + 
23480 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65  pCell[1])<=pPage
23490 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20  ->maxLocal.     
234a0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
234b0 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69  /* The record-si
234c0 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20  ze field is a 2 
234d0 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
234e0 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20  the record .    
234f0 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e        ** fits en
23500 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
23510 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  in b-tree page. 
23520 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20   */.          c 
23530 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
23540 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
23550 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
23560 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  2], pIdxKey);.  
23570 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23580 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
23590 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20  cord flows over 
235a0 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  onto one or more
235b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
235c0 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   In.          **
235d0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77   this case the w
235e0 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20  hole cell needs 
235f0 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20  to be parsed, a 
23600 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
23610 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
23620 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  d accessPayload(
23630 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65  ) used to retrie
23640 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  ve the record in
23650 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  to the.         
23660 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72   ** buffer befor
23670 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
23680 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c  are() can be cal
23690 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  led. */.        
236a0 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79    void *pCellKey
236b0 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
236c0 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79   const pCellBody
236d0 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65   = pCell - pPage
236e0 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
236f0 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 50            btreeP
23700 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
23710 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70  e, pCellBody, &p
23720 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
23730 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69        nCell = (i
23740 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
23750 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  ey;.          pC
23760 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ellKey = sqlite3
23770 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b  Malloc( nCell );
23780 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
23790 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  CellKey==0 ){.  
237a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
237b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
237c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
237d0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
237e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
237f0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
23800 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
23810 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
23820 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
23830 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  0);.          c 
23840 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
23850 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
23860 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
23870 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
23880 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
23890 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
238a0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
238b0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
238c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
238d0 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
238e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
238f0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
23900 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
23910 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
23920 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75  idx;.          u
23930 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20  pr = lwr - 1;.  
23940 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23950 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23960 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
23970 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
23980 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
23990 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
239a0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
239b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
239c0 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
239d0 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
239e0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
239f0 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
23a00 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x-1;.      }.   
23a10 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
23a20 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
23a30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
23a40 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
23a50 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
23a60 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20  (lwr+upr)/2);.  
23a70 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
23a80 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20  lwr==upr+1 );.  
23a90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
23aa0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
23ab0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
23ac0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
23ad0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
23ae0 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
23af0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
23b00 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
23b10 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
23b20 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
23b30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
23b40 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
23b50 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
23b60 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
23b70 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50   }.    if( chldP
23b80 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  g==0 ){.      as
23b90 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
23ba0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
23bb0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23bc0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
23bd0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
23be0 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
23bf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
23c00 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
23c10 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  sh;.    }.    pC
23c20 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23c30 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77  iPage] = (u16)lw
23c40 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  r;.    pCur->inf
23c50 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
23c60 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
23c70 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
23c80 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
23c90 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
23ca0 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65  ( rc ) goto move
23cb0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d  to_finish;.  }.m
23cc0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
23cd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
23ce0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
23cf0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
23d00 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
23d10 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
23d20 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
23d30 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
23d40 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
23d50 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
23d60 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
23d70 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
23d80 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
23d90 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
23da0 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
23db0 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
23dc0 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
23dd0 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
23de0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
23df0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
23e00 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
23e10 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
23e20 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
23e30 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
23e40 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
23e50 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
23e60 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
23e70 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
23e80 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
23e90 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
23ea0 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
23eb0 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
23ec0 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
23ed0 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
23ee0 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
23ef0 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
23f00 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
23f10 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
23f20 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
23f30 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
23f40 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
23f50 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
23f60 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
23f70 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
23f80 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
23f90 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
23fa0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
23fb0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
23fc0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
23fd0 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
23fe0 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
23ff0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
24000 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
24010 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
24020 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
24030 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
24040 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
24050 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24060 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24070 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
24080 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
24090 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
240a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
240b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
240c0 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
240d0 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
240e0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
240f0 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
24100 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
24110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
24120 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
24130 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 70 43  Next>0 ){.    pC
24140 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
24150 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
24160 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24170 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
24180 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
24190 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
241a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
241b0 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b  Page];.  idx = +
241c0 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  +pCur->aiIdx[pCu
241d0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
241e0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
241f0 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
24200 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx<=pPage->nCel
24210 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  l );..  pCur->in
24220 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
24230 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
24240 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d  = 0;.  if( idx>=
24250 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
24260 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
24270 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
24280 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
24290 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
242a0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
242b0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
242c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
242d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
242e0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
242f0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
24300 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
24310 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
24320 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
24330 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
24340 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
24350 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
24360 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
24370 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
24380 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
24390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
243a0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
243b0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
243c0 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
243d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
243e0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
243f0 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
24400 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
24410 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
24420 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
24430 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
24440 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
24450 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
24460 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
24470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24480 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24490 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
244a0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
244b0 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
244c0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
244d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
244e0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
244f0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
24500 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
24510 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  }.../*.** Step t
24520 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
24530 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
24540 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
24550 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
24560 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
24570 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
24580 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
24590 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
245a0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
245b0 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
245c0 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
245d0 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
245e0 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
245f0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
24600 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
24610 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
24620 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
24630 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
24640 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
24650 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
24660 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
24670 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
24680 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
24690 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
246a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
246b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
246c0 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61  c;.  }.  pCur->a
246d0 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28  tLast = 0;.  if(
246e0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
246f0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
24700 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
24710 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24720 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
24730 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30  pCur->skipNext<0
24740 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
24750 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
24760 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
24770 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24780 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
24790 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50  pNext = 0;..  pP
247a0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
247b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
247c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
247d0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
247e0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
247f0 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
24800 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
24810 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63  ->iPage];.    rc
24820 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
24830 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
24840 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
24850 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
24860 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
24870 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
24880 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
24890 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
248a0 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
248b0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
248c0 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20  >iPage]==0 ){.  
248d0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
248e0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
248f0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
24900 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
24910 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
24920 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
24930 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24940 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
24950 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
24960 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
24970 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
24980 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
24990 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43  Key = 0;..    pC
249a0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
249b0 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50  iPage]--;.    pP
249c0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
249d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
249e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
249f0 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
24a00 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
24a10 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
24a20 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
24a30 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
24a40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
24a50 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
24a60 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
24a70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24a80 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
24a90 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
24aa0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
24ab0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
24ac0 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
24ad0 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
24ae0 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
24af0 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
24b00 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
24b10 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
24b20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
24b30 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
24b40 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
24b50 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
24b60 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
24b70 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
24b80 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
24b90 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
24ba0 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
24bb0 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
24bc0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
24bd0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
24be0 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
24bf0 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
24c00 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
24c10 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
24c20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75  and *pPgno are u
24c30 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20  ndefined in the 
24c40 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
24c50 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76  r..** Do not inv
24c60 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  oke sqlite3Pager
24c70 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61  Unref() on *ppPa
24c80 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  ge if an error i
24c90 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
24ca0 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
24cb0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
24cc0 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65  ot 0, then a (fe
24cd0 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20  eble) effort is 
24ce0 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
24cf0 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
24d00 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
24d10 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
24d20 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
24d30 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
24d40 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
24d50 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
24d60 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
24d70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
24d80 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
24d90 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
24da0 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
24db0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
24dc0 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72  exact" parameter
24dd0 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74   is not 0, and t
24de0 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e  he page-number n
24df0 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a  earby exists .**
24e00 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
24e10 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
24e20 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65   it is guarentee
24e30 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
24e40 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c  . This.** is onl
24e50 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  y used by auto-v
24e60 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20  acuum databases 
24e70 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20  when allocating 
24e80 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a  a new table..*/.
24e90 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
24ea0 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
24eb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a  BtShared *pBt, .
24ec0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
24ed0 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ge, .  Pgno *pPg
24ee0 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72  no, .  Pgno near
24ef0 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29  by,.  u8 exact.)
24f00 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
24f10 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
24f20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
24f30 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
24f40 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
24f50 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
24f60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
24f70 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
24f80 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
24f90 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
24fa0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
24fb0 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
24fc0 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
24fd0 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
24fe0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
24ff0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
25000 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25010 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
25020 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
25030 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
25040 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 70 61  1;.  mxPage = pa
25050 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
25060 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  );.  n = get4byt
25070 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
25080 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73  [36]);.  testcas
25090 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29  e( n==mxPage-1 )
250a0 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67  ;.  if( n>=mxPag
250b0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
250c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
250d0 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  KPT;.  }.  if( n
250e0 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
250f0 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
25100 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
25110 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
25120 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
25130 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
25140 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
25150 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
25160 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
25170 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
25180 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
25190 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61    /* If the 'exa
251a0 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61  ct' parameter wa
251b0 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65  s true and a que
251c0 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
251d0 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
251e0 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
251f0 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
25200 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
25210 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
25220 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
25230 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
25240 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
25250 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
25260 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25270 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
25280 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72  f( exact && near
25290 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20  by<=mxPage ){.  
252a0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
252b0 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
252c0 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  by>0 );.      as
252d0 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
252e0 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72  acuum );.      r
252f0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
25300 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
25310 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
25320 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
25330 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
25340 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
25350 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61  E ){.        sea
25360 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
25370 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e     }.      *pPgn
25380 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  o = nearby;.    
25390 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
253a0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Decrement the f
253b0 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62  ree-list count b
253c0 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20  y 1. Set iTrunk 
253d0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
253e0 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
253f0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
25400 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e   page. iPrevTrun
25410 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31  k is initially 1
25420 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
25430 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
25440 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
25450 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
25460 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
25470 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
25480 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
25490 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
254a0 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
254b0 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
254c0 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
254d0 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
254e0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
254f0 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
25500 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
25510 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
25520 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
25530 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
25540 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
25550 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e  rby' is located.
25560 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
25570 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
25580 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
25590 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
255a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75   ){.        iTru
255b0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
255c0 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
255d0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
255e0 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  e{.        iTrun
255f0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
25600 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
25610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25620 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
25630 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
25640 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
25650 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  age ){.        r
25660 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
25670 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
25680 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
25690 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
256a0 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
256b0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
256c0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
256d0 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  {.        pTrunk
256e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
256f0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
25700 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  page;.      }.. 
25710 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
25720 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
25730 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [4]);.      if( 
25740 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
25750 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
25760 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
25770 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
25780 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
25790 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
257a0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
257b0 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
257c0 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
257d0 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
257e0 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
257f0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
25800 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
25810 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
25820 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
25830 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
25840 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
25850 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
25860 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
25870 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
25880 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
25890 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
258a0 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
258b0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
258c0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
258d0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
258e0 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
258f0 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
25900 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
25910 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
25920 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
25930 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
25940 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
25950 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
25960 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28     }else if( k>(
25970 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u32)(pBt->usable
25980 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20  Size/4 - 2) ){. 
25990 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
259a0 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
259b0 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
259c0 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
259d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
259e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
259f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
25a00 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
25a10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25a20 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
25a30 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
25a40 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61  earchList && nea
25a50 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20  rby==iTrunk ){. 
25a60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
25a70 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
25a80 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
25a90 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
25aa0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
25ab0 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
25ac0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
25ad0 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
25ae0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
25af0 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
25b00 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20  gno==iTrunk );. 
25b10 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
25b20 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
25b30 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
25b40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
25b50 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
25b60 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
25b70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
25b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
25b90 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
25ba0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
25bb0 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
25bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
25bd0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
25be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
25bf0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
25c00 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
25c10 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
25c20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
25c30 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
25c40 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
25c50 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
25c60 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
25c70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
25c80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25c90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
25ca0 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
25cb0 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
25cc0 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
25cd0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
25ce0 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
25cf0 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
25d00 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
25d10 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
25d20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
25d30 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
25d40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
25d50 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
25d60 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
25d70 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
25d80 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
25d90 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
25da0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
25db0 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29  ewTrunk>mxPage )
25dc0 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  { .            r
25dd0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
25de0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
25df0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
25e00 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
25e10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25e20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65     testcase( iNe
25e30 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29  wTrunk==mxPage )
25e40 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
25e50 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
25e60 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
25e70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
25e80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
25e90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25ea0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
25eb0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
25ec0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
25ed0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
25ee0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
25ef0 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
25f00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
25f10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25f20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
25f30 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
25f40 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
25f50 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
25f60 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
25f70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25f80 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
25f90 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
25fa0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
25fb0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
25fc0 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
25fd0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
25fe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
25ff0 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
26000 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
26010 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
26020 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
26030 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
26040 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
26050 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
26060 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
26070 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
26080 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
26090 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
260a0 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
260b0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
260c0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
260d0 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
260e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
260f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
26100 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
26110 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
26120 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
26130 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
26140 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
26150 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
26160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
26170 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
26180 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
26190 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
261a0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
261b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
261c0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
261d0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
261e0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
261f0 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
26200 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
26210 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
26220 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  dif.      }else 
26230 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20  if( k>0 ){.     
26240 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
26250 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
26260 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  unk */.        u
26270 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  32 closest;.    
26280 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
26290 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
262a0 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
262b0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
262c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
262d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
262e0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
262f0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
26300 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
26310 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
26320 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
26330 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
26340 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
26350 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  32 i;.          
26360 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
26370 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
26380 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20  .          dist 
26390 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
263a0 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a  a[8]) - nearby;.
263b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69            if( di
263c0 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64  st<0 ) dist = -d
263d0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ist;.          f
263e0 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=1; i<k; i++
263f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
26400 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65  nt d2 = get4byte
26410 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
26420 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
26430 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29        if( d2<0 )
26440 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20   d2 = -d2;.     
26450 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
26460 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
26470 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
26480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
26490 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
264a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
264b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
264c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
264d0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
264e0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
264f0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
26500 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
26510 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
26520 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
26530 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
26540 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20  f( iPage>mxPage 
26550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
26560 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
26570 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
26580 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
26590 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
265a0 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
265b0 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
265c0 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
265d0 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c  ( !searchList ||
265e0 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29   iPage==nearby )
265f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
26600 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  noContent;.     
26610 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
26620 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54  age;.          T
26630 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
26640 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20   %d was leaf %d 
26650 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25  of %d on trunk %
26660 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
26670 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66      ": %d more f
26680 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20  ree pages\n",.  
26690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
266a0 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31  pPgno, closest+1
266b0 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  , k, pTrunk->pgn
266c0 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
266d0 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c      if( closest<
266e0 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k-1 ){.         
266f0 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
26700 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26  [8+closest*4], &
26710 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29  aData[4+k*4], 4)
26720 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26730 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
26740 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  (&aData[4], k-1)
26750 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
26760 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
26770 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 72 75  Iswriteable(pTru
26780 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nk->pDbPage) );.
26790 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74            noCont
267a0 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48  ent = !btreeGetH
267b0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a  asContent(pBt, *
267c0 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  pPgno);.        
267d0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
267e0 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
267f0 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
26800 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
26810 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26820 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26830 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
26840 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
26850 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
26860 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
26870 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26880 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
26890 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
268a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
268b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
268c0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
268d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
268e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
268f0 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
26900 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
26910 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
26920 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
26930 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
26940 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
26950 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
26960 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65  freelist, so cre
26970 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61  ate a new page a
26980 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64  t the.    ** end
26990 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
269a0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
269b0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
269c0 42 74 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  Bt);.    *pPgno 
269d0 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a 20 20  = nPage + 1;..  
269e0 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45    if( *pPgno==PE
269f0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
26a00 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 28 2a  pBt) ){.      (*
26a10 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a  pPgno)++;.    }.
26a20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26a30 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
26a40 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
26a50 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41  oVacuum && PTRMA
26a60 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70  P_ISPAGE(pBt, *p
26a70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f  Pgno) ){.      /
26a80 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
26a90 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
26aa0 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
26ab0 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
26ac0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
26ad0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
26ae0 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
26af0 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
26b00 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
26b10 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
26b20 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
26b30 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
26b40 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
26b50 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
26b60 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
26b70 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
26b80 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
26b90 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
26ba0 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
26bb0 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  age)\n", *pPgno)
26bc0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26bd0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
26be0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
26bf0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  );.      rc = bt
26c00 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
26c10 2a 70 50 67 6e 6f 2c 20 26 70 50 67 2c 20 30 29  *pPgno, &pPg, 0)
26c20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
26c30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26c40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26c50 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d  3PagerWrite(pPg-
26c60 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
26c70 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
26c80 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
26c90 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
26ca0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 28 2a 70  rn rc;.      (*p
26cb0 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69  Pgno)++;.      i
26cc0 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49  f( *pPgno==PENDI
26cd0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
26ce0 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b  ) ){ (*pPgno)++;
26cf0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
26d00 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
26d10 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
26d20 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
26d30 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
26d40 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
26d50 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , ppPage, 0);.  
26d60 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
26d70 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
26d80 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
26d90 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
26da0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
26db0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26dc0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
26dd0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  (*ppPage);.    }
26de0 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
26df0 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
26e00 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
26e10 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
26e20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
26e30 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
26e40 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
26e50 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
26e60 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
26e70 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
26e80 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
26e90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26ea0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73  _OK ){.    if( s
26eb0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
26ec0 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
26ed0 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b  )->pDbPage)>1 ){
26ee0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
26ef0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
26f00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26f10 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
26f20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67     }.    (*ppPag
26f30 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  e)->isInit = 0;.
26f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
26f50 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
26f60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26f70 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26f80 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
26f90 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74   page iPage to t
26fa0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26fb0 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20   free-list. .** 
26fc0 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
26fd0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
26fe0 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72  ot already a par
26ff0 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69  t of the free-li
27000 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  st..**.** The va
27010 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
27020 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
27030 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
27040 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a  on is optional..
27050 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  ** If the caller
27060 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65   happens to have
27070 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
27080 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
27090 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
270a0 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65  ng to page iPage
270b0 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70   handy, it may p
270c0 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65  ass it as the se
270d0 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20  cond value. .** 
270e0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61  Otherwise, it ma
270f0 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  y pass NULL..**.
27100 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20  ** If a pointer 
27110 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a  to a MemPage obj
27120 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73  ect is passed as
27130 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
27140 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66  ment,.** its ref
27150 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
27160 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74  not altered by t
27170 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
27180 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
27190 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a  Page2(BtShared *
271a0 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d  pBt, MemPage *pM
271b0 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61  emPage, Pgno iPa
271c0 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
271d0 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  pTrunk = 0;     
271e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
271f0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
27200 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72  ge */.  Pgno iTr
27210 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
27220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
27230 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  age number of fr
27240 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
27250 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65  ge */ .  MemPage
27260 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
27270 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20  pPage1;      /* 
27280 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20  Local reference 
27290 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d  to page 1 */.  M
272a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
272b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272c0 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67     /* Page being
272d0 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e   freed. May be N
272e0 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ULL. */.  int rc
272f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27310 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
27320 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
27330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27340 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
27350 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
27360 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f   on free-list */
27370 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
27380 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
27390 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
273a0 61 73 73 65 72 74 28 20 69 50 61 67 65 3e 31 20  assert( iPage>1 
273b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d  );.  assert( !pM
273c0 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61  emPage || pMemPa
273d0 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20  ge->pgno==iPage 
273e0 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61  );..  if( pMemPa
273f0 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20  ge ){.    pPage 
27400 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20  = pMemPage;.    
27410 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
27420 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
27430 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
27440 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c  age = btreePageL
27450 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65  ookup(pBt, iPage
27460 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63  );.  }..  /* Inc
27470 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
27480 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
27490 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
274a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
274b0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
274c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
274d0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
274e0 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  .  nFree = get4b
274f0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
27500 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62  ta[36]);.  put4b
27510 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
27520 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29  ta[36], nFree+1)
27530 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
27540 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
27550 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54   /* If the SQLIT
27560 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  E_SECURE_DELETE 
27570 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
27580 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
27590 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73  then.  ** always
275a0 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
275b0 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
275c0 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
275d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 21 70 50  .  */.  if( (!pP
275e0 61 67 65 20 26 26 20 28 72 63 20 3d 20 62 74 72  age && (rc = btr
275f0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
27600 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
27610 29 29 0a 20 20 20 7c 7c 20 20 20 20 20 20 20 20  )).   ||        
27620 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65      (rc = sqlite
27630 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
27640 65 2d 3e 70 44 62 50 61 67 65 29 29 0a 20 20 29  e->pDbPage)).  )
27650 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
27660 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6d  age_out;.  }.  m
27670 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
27680 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42  ta, 0, pPage->pB
27690 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65  t->pageSize);.#e
276a0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
276b0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
276c0 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
276d0 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
276e0 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
276f0 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
27700 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
27710 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
27720 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
27730 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70  UM ){.    ptrmap
27740 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
27750 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
27760 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66   0, &rc);.    if
27770 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
27780 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
27790 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61   /* Now manipula
277a0 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  te the actual da
277b0 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
277c0 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72   structure. Ther
277d0 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70  e are two.  ** p
277e0 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66  ossibilities. If
277f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
27800 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74  s currently empt
27810 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72  y, or if the fir
27820 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61  st.  ** trunk pa
27830 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
27840 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65  ist is full, the
27850 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c  n this page will
27860 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e   become a.  ** n
27870 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  ew free-list tru
27880 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  nk page. Otherwi
27890 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f  se, it will beco
278a0 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  me a leaf of the
278b0 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
278c0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75  k page in the cu
278d0 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e  rrent free-list.
278e0 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
278f0 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20  s if it.  ** is 
27900 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
27910 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65  the page as a ne
27920 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  w free-list leaf
27930 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ..  */.  if( nFr
27940 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ee!=0 ){.    u32
27950 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   nLeaf;         
27960 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
27970 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  l number of leaf
27980 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20   cells on trunk 
27990 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72  page */..    iTr
279a0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
279b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
279c0 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  ]);.    rc = btr
279d0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
279e0 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
279f0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
27a00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27a10 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
27a20 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
27a30 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
27a40 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
27a50 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c  [4]);.    if( nL
27a60 65 61 66 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  eaf > pBt->usabl
27a70 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20  eSize/4 - 2 ){. 
27a80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27a90 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
27aa0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
27ab0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
27ac0 20 20 69 66 28 20 6e 4c 65 61 66 3c 70 42 74 2d    if( nLeaf<pBt-
27ad0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
27ae0 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
27af0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
27b00 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
27b10 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
27b20 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
27b30 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
27b40 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
27b50 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
27b60 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
27b70 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
27b80 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
27b90 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
27ba0 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
27bb0 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
27bc0 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
27bd0 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
27be0 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
27bf0 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
27c00 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
27c10 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
27c20 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
27c30 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
27c40 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
27c50 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
27c60 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
27c70 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
27c80 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
27c90 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
27ca0 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
27cb0 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
27cc0 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
27cd0 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
27ce0 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
27cf0 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
27d00 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
27d10 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
27d20 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  ll continue to r
27d30 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
27d40 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
27d50 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
27d60 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
27d70 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
27d80 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
27d90 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
27da0 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
27db0 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
27dc0 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
27dd0 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
27de0 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
27df0 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
27e00 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
27e10 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
27e20 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
27e30 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f  e/4-8"..      */
27e40 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
27e50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
27e60 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
27e70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
27e80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27e90 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
27ea0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e  unk->aData[4], n
27eb0 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20  Leaf+1);.       
27ec0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
27ed0 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66  k->aData[8+nLeaf
27ee0 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 23 69 66  *4], iPage);.#if
27ef0 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  ndef SQLITE_SECU
27f00 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  RE_DELETE.      
27f10 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
27f20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27f30 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
27f40 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
27f50 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
27f60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
27f70 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeSetHasContent
27f80 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
27f90 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
27fa0 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
27fb0 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
27fc0 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
27fd0 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
27fe0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  gno));.      got
27ff0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
28000 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
28010 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73  If control flows
28020 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
28030 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20  then it was not 
28040 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
28050 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  the.  ** the pag
28060 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  e being freed as
28070 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20   a leaf page of 
28080 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
28090 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
280a0 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  ..  ** Possibly 
280b0 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65  because the free
280c0 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20  -list is empty, 
280d0 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61  or possibly beca
280e0 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  use the .  ** fi
280f0 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
28100 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
28110 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ll. Either way, 
28120 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
28130 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  reed.  ** will b
28140 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69  ecome the new fi
28150 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
28160 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
28170 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
28180 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  e==0 && SQLITE_O
28190 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65  K!=(rc = btreeGe
281a0 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
281b0 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b  , &pPage, 0)) ){
281c0 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
281d0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63  ge_out;.  }.  rc
281e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
281f0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
28200 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
28210 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28220 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
28230 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  ut;.  }.  put4by
28240 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
28250 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34   iTrunk);.  put4
28260 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
28270 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74  ta[4], 0);.  put
28280 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
28290 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29  Data[32], iPage)
282a0 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45  ;.  TRACE(("FREE
282b0 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
282c0 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
282d0 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  ng %d\n", pPage-
282e0 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b  >pgno, iTrunk));
282f0 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a  ..freepage_out:.
28300 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
28310 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
28320 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65   = 0;.  }.  rele
28330 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
28340 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
28350 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  runk);.  return 
28360 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rc;.}.static voi
28370 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  d freePage(MemPa
28380 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a  ge *pPage, int *
28390 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
283a0 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
283b0 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65  .    *pRC = free
283c0 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74  Page2(pPage->pBt
283d0 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  , pPage, pPage->
283e0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pgno);.  }.}../*
283f0 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65  .** Free any ove
28400 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
28410 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
28420 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73  given Cell..*/.s
28430 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43  tatic int clearC
28440 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
28450 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ge, unsigned cha
28460 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53  r *pCell){.  BtS
28470 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
28480 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49  ge->pBt;.  CellI
28490 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f  nfo info;.  Pgno
284a0 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74   ovflPgno;.  int
284b0 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c   rc;.  int nOvfl
284c0 3b 0a 20 20 75 31 36 20 6f 76 66 6c 50 61 67 65  ;.  u16 ovflPage
284d0 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
284e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
284f0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
28500 6d 75 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65  mutex) );.  btre
28510 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
28520 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
28530 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69  o);.  if( info.i
28540 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20  Overflow==0 ){. 
28550 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28560 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
28570 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
28580 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
28590 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
285a0 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
285b0 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
285c0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
285d0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
285e0 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
285f0 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
28600 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
28610 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
28620 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
28630 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
28640 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
28650 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
28660 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67    assert( ovflPg
28670 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30  no==0 || nOvfl>0
28680 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76   );.  while( nOv
28690 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  fl-- ){.    Pgno
286a0 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20   iNext = 0;.    
286b0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
286c0 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c   0;.    if( ovfl
286d0 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67  Pgno<2 || ovflPg
286e0 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e  no>pagerPagecoun
286f0 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
28700 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65  /* 0 is not a le
28710 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
28720 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f  and page 1 canno
28730 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a  t be an .      *
28740 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  * overflow page.
28750 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76   Therefore if ov
28760 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74  flPgno<2 or past
28770 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
28780 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74  .      ** file t
28790 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
287a0 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a   be corrupt. */.
287b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
287c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
287d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
287e0 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72  nOvfl ){.      r
287f0 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
28800 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  age(pBt, ovflPgn
28810 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78  o, &pOvfl, &iNex
28820 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
28830 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28840 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 72 65    }.    rc = fre
28850 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66  ePage2(pBt, pOvf
28860 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  l, ovflPgno);.  
28870 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20    if( pOvfl ){. 
28880 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
28890 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
288a0 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
288b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
288c0 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67  n rc;.    ovflPg
288d0 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a  no = iNext;.  }.
288e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
288f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
28900 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
28910 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
28920 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
28930 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
28940 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
28950 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
28960 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
28970 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
28980 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
28990 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
289a0 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
289b0 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
289c0 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
289d0 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
289e0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
289f0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
28a00 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
28a10 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
28a20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
28a30 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
28a40 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
28a50 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
28a60 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
28a70 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
28a80 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
28a90 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
28aa0 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
28ab0 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
28ac0 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
28ad0 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
28ae0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
28af0 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
28b00 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
28b10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
28b20 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
28b30 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
28b40 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
28b50 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
28b60 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
28b70 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
28b80 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
28b90 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
28ba0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
28bb0 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
28bc0 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
28bd0 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
28be0 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
28bf0 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  data */.  int nZ
28c00 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
28c10 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
28c20 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20  a zero bytes to 
28c30 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20  append to pData 
28c40 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c60 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
28c70 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
28c80 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
28c90 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
28ca0 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
28cb0 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61  n, rc;.  int spa
28cc0 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
28cd0 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
28ce0 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
28cf0 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ase = 0;.  unsig
28d00 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
28d10 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
28d20 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
28d30 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
28d40 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
28d50 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a  o pgnoOvfl = 0;.
28d60 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20    int nHeader;. 
28d70 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
28d80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
28d90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
28da0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
28db0 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20   );..  /* pPage 
28dc0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
28dd0 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e  ly writeable sin
28de0 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62  ce pCell might b
28df0 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
28e00 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68   buffer space th
28e10 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66  at is separate f
28e20 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75  rom the pPage bu
28e30 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61  ffer area */.  a
28e40 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61  ssert( pCell<pPa
28e50 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65  ge->aData || pCe
28e60 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ll>=&pPage->aDat
28e70 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
28e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
28e90 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
28ea0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
28eb0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
28ec0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
28ed0 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
28ee0 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50  r = 0;.  if( !pP
28ef0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
28f00 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20   nHeader += 4;. 
28f10 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
28f20 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e  hasData ){.    n
28f30 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
28f40 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
28f50 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f  er], nData+nZero
28f60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28f70 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20  nData = nZero = 
28f80 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72  0;.  }.  nHeader
28f90 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
28fa0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
28fb0 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (u64*)&nKey);.  
28fc0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
28fd0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
28fe0 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
28ff0 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d  ( info.nHeader==
29000 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73  nHeader );.  ass
29010 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
29020 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  nKey );.  assert
29030 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75  ( info.nData==(u
29040 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29  32)(nData+nZero)
29050 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c   );.  .  /* Fill
29060 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
29070 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  */.  nPayload = 
29080 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20  nData + nZero;. 
29090 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
290a0 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d  ey ){.    pSrc =
290b0 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63   pData;.    nSrc
290c0 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44   = nData;.    nD
290d0 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ata = 0;.  }else
290e0 7b 20 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  { .    if( NEVER
290f0 28 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  (nKey>0x7fffffff
29100 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a   || pKey==0) ){.
29110 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
29120 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
29130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79  ;.    }.    nPay
29140 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65  load += (int)nKe
29150 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b  y;.    pSrc = pK
29160 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28  ey;.    nSrc = (
29170 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  int)nKey;.  }.  
29180 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e  *pnSize = info.n
29190 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66  Size;.  spaceLef
291a0 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  t = info.nLocal;
291b0 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
291c0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20  Cell[nHeader];. 
291d0 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
291e0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
291f0 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79  ;..  while( nPay
29200 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66  load>0 ){.    if
29210 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
29220 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
29230 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
29240 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  .      Pgno pgno
29250 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66  Ptrmap = pgnoOvf
29260 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70  l; /* Overflow p
29270 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  age pointer-map 
29280 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  entry page */.  
29290 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
292a0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
292b0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
292c0 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20   pgnoOvfl++;.   
292d0 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20       } while( . 
292e0 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f           PTRMAP_
292f0 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f  ISPAGE(pBt, pgno
29300 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66  Ovfl) || pgnoOvf
29310 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  l==PENDING_BYTE_
29320 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20  PAGE(pBt) .     
29330 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65     );.      }.#e
29340 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20  ndif.      rc = 
29350 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
29360 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26  e(pBt, &pOvfl, &
29370 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76  pgnoOvfl, pgnoOv
29380 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20  fl, 0);.#ifndef 
29390 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
293a0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
293b0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
293c0 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
293d0 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65  cuum, and the se
293e0 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65  cond or subseque
293f0 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  nt.      ** over
29400 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69  flow page is bei
29410 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64  ng allocated, ad
29420 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
29430 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
29440 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20      ** for that 
29450 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20  page now. .     
29460 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
29470 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
29480 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  t overflow page,
29490 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61   then write a pa
294a0 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20  rtial entry .   
294b0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69     ** to the poi
294c0 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20  nter-map. If we 
294d0 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f  write nothing to
294e0 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61   this pointer-ma
294f0 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a  p slot,.      **
29500 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69   then the optimi
29510 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68  stic overflow ch
29520 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69  ain processing i
29530 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20  n clearCell().  
29540 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e      ** may misin
29550 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e  terpret the unin
29560 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73  itialised values
29570 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a   and delete the.
29580 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70        ** wrong p
29590 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61  ages from the da
295a0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f  tabase..      */
295b0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
295c0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63  autoVacuum && rc
295d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
295e0 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20         u8 eType 
295f0 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54  = (pgnoPtrmap?PT
29600 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50  RMAP_OVERFLOW2:P
29610 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29  TRMAP_OVERFLOW1)
29620 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
29630 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  Put(pBt, pgnoOvf
29640 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74  l, eType, pgnoPt
29650 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20  rmap, &rc);.    
29660 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
29670 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
29680 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20  age(pOvfl);.    
29690 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
296a0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72  ndif.      if( r
296b0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  c ){.        rel
296c0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
296d0 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ase);.        re
296e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
296f0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54  ..      /* If pT
29700 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
29710 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72  zero than pPrior
29720 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
29730 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20   data area.     
29740 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
29750 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
29760 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
29770 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
29780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
29790 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
297a0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
297b0 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
297c0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
297d0 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69        /* If pPri
297e0 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  or is part of th
297f0 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
29800 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
29810 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20  sure pPage.     
29820 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
29830 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  teable */.      
29840 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70  assert( pPrior<p
29850 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
29860 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61  Prior>=&pPage->a
29870 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
29880 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
29890 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
298a0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
298b0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
298c0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
298d0 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b  rior, pgnoOvfl);
298e0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
298f0 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
29900 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65        pToRelease
29910 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20   = pOvfl;.      
29920 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e  pPrior = pOvfl->
29930 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74  aData;.      put
29940 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29  4byte(pPrior, 0)
29950 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64  ;.      pPayload
29960 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61   = &pOvfl->aData
29970 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65  [4];.      space
29980 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62  Left = pBt->usab
29990 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20  leSize - 4;.    
299a0 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f  }.    n = nPaylo
299b0 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70  ad;.    if( n>sp
299c0 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70  aceLeft ) n = sp
299d0 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a  aceLeft;..    /*
299e0 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
299f0 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
29a00 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20  pPayload points 
29a10 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
29a20 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  ea.    ** of pTo
29a30 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
29a40 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
29a50 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
29a60 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
29a70 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
29a80 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
29a90 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
29aa0 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
29ab0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50  );..    /* If pP
29ac0 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f  ayload is part o
29ad0 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
29ae0 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
29af0 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
29b00 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
29b10 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
29b20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64  assert( pPayload
29b30 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
29b40 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67   pPayload>=&pPag
29b50 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
29b60 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
29b70 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
29b80 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
29b90 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
29ba0 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e  ;..    if( nSrc>
29bb0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
29bc0 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63  >nSrc ) n = nSrc
29bd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29be0 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65  pSrc );.      me
29bf0 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
29c00 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  Src, n);.    }el
29c10 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
29c20 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29  (pPayload, 0, n)
29c30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79  ;.    }.    nPay
29c40 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70  load -= n;.    p
29c50 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20  Payload += n;.  
29c60 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20    pSrc += n;.   
29c70 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20   nSrc -= n;.    
29c80 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a  spaceLeft -= n;.
29c90 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20      if( nSrc==0 
29ca0 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20  ){.      nSrc = 
29cb0 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72  nData;.      pSr
29cc0 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d  c = pData;.    }
29cd0 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
29ce0 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
29cf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29d00 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  OK;.}../*.** Rem
29d10 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c  ove the i-th cel
29d20 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54  l from pPage.  T
29d30 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65  his routine effe
29d40 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a  cts pPage only..
29d50 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** The cell cont
29d60 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64  ent is not freed
29d70 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e   or deallocated.
29d80 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
29d90 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c  that.** the cell
29da0 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
29db0 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61  n copied somepla
29dc0 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72  ce else.  This r
29dd0 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72  outine just.** r
29de0 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72  emoves the refer
29df0 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c  ence to the cell
29e00 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a   from pPage..**.
29e10 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20  ** "sz" must be 
29e20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
29e30 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e  tes in the cell.
29e40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
29e50 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65  dropCell(MemPage
29e60 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78   *pPage, int idx
29e70 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70  , int sz, int *p
29e80 52 43 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  RC){.  int i;   
29e90 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
29ea0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
29eb0 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
29ec0 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
29ed0 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
29ee0 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
29ef0 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
29f00 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
29f10 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
29f20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
29f30 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
29f40 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
29f50 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
29f60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
29f70 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
29f80 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  t hdr;        /*
29f90 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   Beginning of th
29fa0 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73  e header.  0 mos
29fb0 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61  t pages.  100 pa
29fc0 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ge 1 */..  if( *
29fd0 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
29fe0 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
29ff0 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
2a000 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
2a010 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
2a020 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
2a030 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2a040 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2a050 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2a060 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2a070 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2a080 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2a090 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
2a0a0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
2a0b0 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  r = &data[pPage-
2a0c0 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
2a0d0 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74  idx];.  pc = get
2a0e0 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64  2byte(ptr);.  hd
2a0f0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
2a100 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65  fset;.  testcase
2a110 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26  ( pc==get2byte(&
2a120 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a  data[hdr+5]) );.
2a130 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
2a140 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  z==pPage->pBt->u
2a150 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69  sableSize );.  i
2a160 66 28 20 70 63 20 3c 20 67 65 74 32 62 79 74 65  f( pc < get2byte
2a170 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c  (&data[hdr+5]) |
2a180 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d  | pc+sz > pPage-
2a190 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2a1a0 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
2a1b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2a1c0 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
2a1d0 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53    }.  rc = freeS
2a1e0 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
2a1f0 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  sz);.  if( rc ){
2a200 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
2a210 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2a220 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69    for(i=idx+1; i
2a230 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
2a240 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20  ++, ptr+=2){.   
2a250 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d   ptr[0] = ptr[2]
2a260 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70  ;.    ptr[1] = p
2a270 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61  tr[3];.  }.  pPa
2a280 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70  ge->nCell--;.  p
2a290 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2a2a0 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  r+3], pPage->nCe
2a2b0 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ll);.  pPage->nF
2a2c0 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a  ree += 2;.}../*.
2a2d0 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
2a2e0 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
2a2f0 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
2a300 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
2a310 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
2a320 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
2a330 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
2a340 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
2a350 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
2a360 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
2a370 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
2a380 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
2a390 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
2a3a0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
2a3b0 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
2a3c0 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
2a3d0 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
2a3e0 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
2a3f0 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
2a400 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  in pPage->aOvfl[
2a410 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
2a420 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
2a430 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
2a440 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
2a450 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
2a460 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
2a470 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
2a480 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
2a490 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
2a4a0 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
2a4b0 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
2a4c0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
2a4d0 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  incremented..**.
2a4e0 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e  ** If nSkip is n
2a4f0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f  on-zero, then do
2a500 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69   not copy the fi
2a510 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
2a520 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20  of the.** cell. 
2a530 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
2a540 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61  overwrite them a
2a550 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
2a560 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a  on returns. If.*
2a570 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  * nSkip is non-z
2a580 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20  ero, then pCell 
2a590 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  may not point to
2a5a0 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f   an invalid memo
2a5b0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20  ry location .** 
2a5c0 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  (but pCell+nSkip
2a5d0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
2a5e0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
2a5f0 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20  d insertCell(.  
2a600 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2a610 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77    /* Page into w
2a620 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79  hich we are copy
2a630 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ing */.  int i, 
2a640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2a650 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74  w cell becomes t
2a660 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20  he i-th cell of 
2a670 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  the page */.  u8
2a680 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
2a690 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
2a6a0 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20  e new cell */.  
2a6b0 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20  int sz,         
2a6c0 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f    /* Bytes of co
2a6d0 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a  ntent in pCell *
2a6e0 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20  /.  u8 *pTemp,  
2a6f0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74        /* Temp st
2a700 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20  orage space for 
2a710 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64  pCell, if needed
2a720 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c   */.  Pgno iChil
2a730 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  d,      /* If no
2a740 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20  n-zero, replace 
2a750 66 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69  first 4 bytes wi
2a760 74 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f  th this value */
2a770 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20  .  int *pRC     
2a780 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64       /* Read and
2a790 20 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f   write return co
2a7a0 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a  de from here */.
2a7b0 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20  ){.  int idx;   
2a7c0 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
2a7d0 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c  to write new cel
2a7e0 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74  l content in dat
2a7f0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  a[] */.  int j; 
2a800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2a810 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2a820 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20  int end;        
2a830 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
2a840 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65  past the last ce
2a850 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
2a860 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  ta[] */.  int in
2a870 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  s;          /* I
2a880 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77  ndex in data[] w
2a890 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f  here new cell po
2a8a0 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65  inter is inserte
2a8b0 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  d */.  int cellO
2a8c0 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72  ffset;   /* Addr
2a8d0 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ess of first cel
2a8e0 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
2a8f0 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  a[] */.  u8 *dat
2a900 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
2a910 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
2a920 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20   whole page */. 
2a930 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
2a940 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d     /* Used for m
2a950 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  oving informatio
2a960 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61  n around in data
2a970 5b 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b  [] */..  int nSk
2a980 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34  ip = (iChild ? 4
2a990 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70   : 0);..  if( *p
2a9a0 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  RC ) return;..  
2a9b0 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
2a9c0 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  i<=pPage->nCell+
2a9d0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2a9e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2a9f0 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43  age->nCell<=MX_C
2aa00 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20  ELL(pPage->pBt) 
2aa10 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  && MX_CELL(pPage
2aa20 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a  ->pBt)<=5460 );.
2aa30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2aa40 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61  >nOverflow<=Arra
2aa50 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76  ySize(pPage->aOv
2aa60 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fl) );.  assert(
2aa70 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72   sz==cellSizePtr
2aa80 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29  (pPage, pCell) )
2aa90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2aaa0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2aab0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2aac0 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
2aad0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
2aae0 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
2aaf0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
2ab00 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
2ab10 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70  y(pTemp+nSkip, p
2ab20 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
2ab30 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65  Skip);.      pCe
2ab40 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
2ab50 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  }.    if( iChild
2ab60 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
2ab70 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64  te(pCell, iChild
2ab80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  );.    }.    j =
2ab90 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2aba0 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
2abb0 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   j<(int)(sizeof(
2abc0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69  pPage->aOvfl)/si
2abd0 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
2abe0 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50  l[0])) );.    pP
2abf0 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43  age->aOvfl[j].pC
2ac00 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ell = pCell;.   
2ac10 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
2ac20 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20  .idx = (u16)i;. 
2ac30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
2ac40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2ac50 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2ac60 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2ac70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ac80 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63  .      *pRC = rc
2ac90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
2aca0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2acb0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2acc0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2acd0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2ace0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2acf0 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  Data;.    cellOf
2ad00 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
2ad10 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
2ad20 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
2ad30 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
2ad40 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f  .    ins = cellO
2ad50 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20  ffset + 2*i;.   
2ad60 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70   rc = allocateSp
2ad70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26  ace(pPage, sz, &
2ad80 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  idx);.    if( rc
2ad90 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72   ){ *pRC = rc; r
2ada0 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20  eturn; }.    /* 
2adb0 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  The allocateSpac
2adc0 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72  e() routine guar
2add0 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f  antees the follo
2ade0 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72 74  wing two propert
2adf0 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74  ies.    ** if it
2ae00 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
2ae10 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2ae20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a  idx >= end+2 );.
2ae30 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b      assert( idx+
2ae40 73 7a 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74  sz <= pPage->pBt
2ae50 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
2ae60 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
2ae70 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ++;.    pPage->n
2ae80 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20  Free -= (u16)(2 
2ae90 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70  + sz);.    memcp
2aea0 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69  y(&data[idx+nSki
2aeb0 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  p], pCell+nSkip,
2aec0 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
2aed0 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
2aee0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61      put4byte(&da
2aef0 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29  ta[idx], iChild)
2af00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
2af10 6a 3d 65 6e 64 2c 20 70 74 72 3d 26 64 61 74 61  j=end, ptr=&data
2af20 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32  [j]; j>ins; j-=2
2af30 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20  , ptr-=2){.     
2af40 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32   ptr[0] = ptr[-2
2af50 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20  ];.      ptr[1] 
2af60 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d  = ptr[-1];.    }
2af70 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
2af80 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a  ata[ins], idx);.
2af90 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
2afa0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2afb0 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  set+3], pPage->n
2afc0 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  Cell);.#ifndef S
2afd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2afe0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
2aff0 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  age->pBt->autoVa
2b000 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  cuum ){.      /*
2b010 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f   The cell may co
2b020 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  ntain a pointer 
2b030 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
2b040 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74  age. If so, writ
2b050 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65  e.      ** the e
2b060 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
2b070 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20  rflow page into 
2b080 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
2b090 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2b0a0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
2b0b0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
2b0c0 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  RC);.    }.#endi
2b0d0 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  f.  }.}../*.** A
2b0e0 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c  dd a list of cel
2b0f0 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54  ls to a page.  T
2b100 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62  he page should b
2b110 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  e initially empt
2b120 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20  y..** The cells 
2b130 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
2b140 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  o fit on the pag
2b150 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2b160 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a  d assemblePage(.
2b170 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2b180 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ,   /* The page 
2b190 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64  to be assemblied
2b1a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
2b1b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
2b1c0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
2b1d0 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61  o add to this pa
2b1e0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
2b1f0 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  ell,      /* Poi
2b200 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f  nters to cell bo
2b210 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61  dies */.  u16 *a
2b220 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53  Size        /* S
2b230 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  izes of the cell
2b240 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
2b250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2b260 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2b270 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20   u8 *pCellptr;  
2b280 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2b290 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
2b2a0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
2b2b0 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
2b2c0 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
2b2d0 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
2b2e0 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
2b2f0 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
2b300 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2b310 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70  er to data for p
2b320 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Page */.  const 
2b330 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
2b340 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
2b350 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2b360 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61  of header on pPa
2b370 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ge */.  const in
2b380 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67  t nUsable = pPag
2b390 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2b3a0 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69  ze; /* Usable si
2b3b0 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20  ze of page */.. 
2b3c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2b3d0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
2b3e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2b3f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2b400 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2b410 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  );.  assert( nCe
2b420 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d  ll>=0 && nCell<=
2b430 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2b440 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70  Bt) && MX_CELL(p
2b450 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30  Page->pBt)<=5460
2b460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2b470 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2b480 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2b490 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  Page) );..  /* C
2b4a0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
2b4b0 67 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ge has just been
2b4c0 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50   zeroed by zeroP
2b4d0 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72  age() */.  asser
2b4e0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
2b4f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2b500 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2b510 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20  dr+5])==nUsable 
2b520 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d  );..  pCellptr =
2b530 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
2b540 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c  llOffset + nCell
2b550 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20  *2];.  cellbody 
2b560 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72  = nUsable;.  for
2b570 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30  (i=nCell-1; i>=0
2b580 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65 6c  ; i--){.    pCel
2b590 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63  lptr -= 2;.    c
2b5a0 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a 65  ellbody -= aSize
2b5b0 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74  [i];.    put2byt
2b5c0 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c  e(pCellptr, cell
2b5d0 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70  body);.    memcp
2b5e0 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79  y(&data[cellbody
2b5f0 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53  ], apCell[i], aS
2b600 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70  ize[i]);.  }.  p
2b610 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2b620 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20  r+3], nCell);.  
2b630 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
2b640 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29  dr+5], cellbody)
2b650 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
2b660 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e   -= (nCell*2 + n
2b670 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64  Usable - cellbod
2b680 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  y);.  pPage->nCe
2b690 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b  ll = (u16)nCell;
2b6a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
2b6b0 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65  llowing paramete
2b6c0 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77  rs determine how
2b6d0 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70   many adjacent p
2b6e0 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65  ages get involve
2b6f0 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63  d.** in a balanc
2b700 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
2b710 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  NN is the number
2b720 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
2b730 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20   either side.** 
2b740 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
2b750 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
2b760 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  the balancing op
2b770 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20  eration.  NB is 
2b780 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d  the.** total num
2b790 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
2b7a0 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69  t participate, i
2b7b0 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72  ncluding the tar
2b7c0 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  get page and.** 
2b7d0 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  NN neighbors on 
2b7e0 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a  either side..**.
2b7f0 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76  ** The minimum v
2b800 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20  alue of NN is 1 
2b810 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e  (of course).  In
2b820 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76  creasing NN abov
2b830 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20  e 1.** (to 2 or 
2b840 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73  3) gives a modes
2b850 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e  t improvement in
2b860 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45   SELECT and DELE
2b870 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  TE performance.*
2b880 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f  * in exchange fo
2b890 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61  r a larger degra
2b8a0 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54  dation in INSERT
2b8b0 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66   and UPDATE perf
2b8c0 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
2b8d0 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65  value of NN appe
2b8e0 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20  ars to give the 
2b8f0 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65  best results ove
2b900 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rall..*/.#define
2b910 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20   NN 1           
2b920 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
2b930 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
2b940 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
2b950 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28   */.#define NB (
2b960 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20  NN*2+1)      /* 
2b970 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f  Total pages invo
2b980 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  lved in the bala
2b990 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66  nce */...#ifndef
2b9a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
2b9b0 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20  CKBALANCE./*.** 
2b9c0 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
2b9d0 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65  balance() handle
2b9e0 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65  s the common spe
2b9f0 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a  cial case where.
2ba00 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ** a new entry i
2ba10 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
2ba20 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20   on the extreme 
2ba30 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65  right-end of the
2ba40 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68  .** tree, in oth
2ba50 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74  er words, when t
2ba60 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c  he new entry wil
2ba70 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72  l become the lar
2ba80 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  gest.** entry in
2ba90 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
2baa0 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69   Instead of tryi
2bab0 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68  ng to balance th
2bac0 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  e 3 right-most l
2bad0 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20  eaf pages, just 
2bae0 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67  add.** a new pag
2baf0 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68  e to the right-h
2bb00 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74  and side and put
2bb10 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74   the one new ent
2bb20 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61  ry in.** that pa
2bb30 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73  ge.  This leaves
2bb40 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20   the right side 
2bb50 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65  of the tree some
2bb60 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63  what.** unbalanc
2bb70 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72  ed.  But odds ar
2bb80 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  e that we will b
2bb90 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20  e inserting new 
2bba0 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68  entries.** at th
2bbb0 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72  e end soon after
2bbc0 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61  wards so the nea
2bbd0 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77  rly empty page w
2bbe0 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66  ill quickly.** f
2bbf0 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72  ill up.  On aver
2bc00 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65  age..**.** pPage
2bc10 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67   is the leaf pag
2bc20 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  e which is the r
2bc30 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69  ight-most page i
2bc40 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70  n the tree..** p
2bc50 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61  Parent is its pa
2bc60 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73  rent.  pPage mus
2bc70 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20  t have a single 
2bc80 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a  overflow entry.*
2bc90 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20  * which is also 
2bca0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
2bcb0 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65  ntry on the page
2bcc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61  ..**.** The pSpa
2bcd0 63 65 20 62 75 66 66 65 72 20 69 73 20 75 73 65  ce buffer is use
2bce0 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d  d to store a tem
2bcf0 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74  porary copy of t
2bd00 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65  he divider.** ce
2bd10 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ll that will be 
2bd20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50  inserted into pP
2bd30 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65  arent. Such a ce
2bd40 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
2bd50 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20   4.** byte page 
2bd60 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20  number followed 
2bd70 62 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  by a variable le
2bd80 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e  ngth integer. In
2bd90 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
2bda0 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65   at most 13 byte
2bdb0 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53 70  s. Hence the pSp
2bdc0 61 63 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  ace buffer must 
2bdd0 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31  be at.** least 1
2bde0 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  3 bytes in size.
2bdf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2be00 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d  alance_quick(Mem
2be10 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d  Page *pParent, M
2be20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
2be30 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74  8 *pSpace){.  Bt
2be40 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42  Shared *const pB
2be50 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20  t = pPage->pBt; 
2be60 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74     /* B-Tree Dat
2be70 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  abase */.  MemPa
2be80 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  ge *pNew;       
2be90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bea0 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  /* Newly allocat
2beb0 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ed page */.  int
2bec0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bee0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
2bef0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e   */.  Pgno pgnoN
2bf00 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
2bf10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2bf20 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65  ge number of pNe
2bf30 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  w */..  assert( 
2bf40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2bf50 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2bf60 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2bf70 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2bf80 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
2bf90 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
2bfa0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2bfb0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b  >nOverflow==1 );
2bfc0 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  ..  if( NEVER(pP
2bfd0 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 29 20 29  age->nCell<=0) )
2bfe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2bff0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20  ORRUPT_BKPT;..  
2c000 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
2c010 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67  w page. This pag
2c020 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  e will become th
2c030 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  e right-sibling 
2c040 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20  of .  ** pPage. 
2c050 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20  Make the parent 
2c060 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73  page writable, s
2c070 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64  o that the new d
2c080 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a  ivider cell.  **
2c090 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 64   may be inserted
2c0a0 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20  . If both these 
2c0b0 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73  operations are s
2c0c0 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65  uccessful, proce
2c0d0 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ed..  */.  rc = 
2c0e0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2c0f0 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
2c100 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a  gnoNew, 0, 0);..
2c110 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c120 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a  _OK ){..    u8 *
2c130 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34  pOut = &pSpace[4
2c140 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
2c150 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b   = pPage->aOvfl[
2c160 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 75 31  0].pCell;.    u1
2c170 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53  6 szCell = cellS
2c180 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
2c190 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53  ell);.    u8 *pS
2c1a0 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  top;..    assert
2c1b0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2c1c0 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e  writeable(pNew->
2c1d0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
2c1e0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
2c1f0 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e  Data[0]==(PTF_IN
2c200 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
2c210 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20  A|PTF_LEAF) );. 
2c220 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
2c230 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
2c240 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45  _LEAFDATA|PTF_LE
2c250 41 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c  AF);.    assembl
2c260 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26  ePage(pNew, 1, &
2c270 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b  pCell, &szCell);
2c280 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2c290 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
2c2a0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
2c2b0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
2c2c0 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  map.    ** with 
2c2d0 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
2c2e0 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e  new page, and an
2c2f0 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  y pointer from t
2c300 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  he .    ** cell 
2c310 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61  on the page to a
2c320 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
2c330 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
2c340 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  ese.    ** opera
2c350 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65  tions fails, the
2c360 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
2c370 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e  set, but the con
2c380 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  tents.    ** of 
2c390 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2c3a0 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75  are still manipu
2c3b0 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f 64  lated by thh cod
2c3c0 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20  e below..    ** 
2c3d0 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74  That is Ok, at t
2c3e0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61  his point the pa
2c3f0 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75 61  rent page is gua
2c400 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a  ranteed to.    *
2c410 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  * be marked as d
2c420 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20  irty. Returning 
2c430 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69  an error code wi
2c440 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a  ll cause a.    *
2c450 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f  * rollback, undo
2c460 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ing any changes 
2c470 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72 65  made to the pare
2c480 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
2c490 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2c4a0 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74  CUUM ){.      pt
2c4b0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
2c4c0 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52  oNew, PTRMAP_BTR
2c4d0 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
2c4e0 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  o, &rc);.      i
2c4f0 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e  f( szCell>pNew->
2c500 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  minLocal ){.    
2c510 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
2c520 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c  lPtr(pNew, pCell
2c530 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  , &rc);.      }.
2c540 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2c550 43 72 65 61 74 65 20 61 20 64 69 76 69 64 65 72  Create a divider
2c560 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20   cell to insert 
2c570 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68  into pParent. Th
2c580 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20  e divider cell. 
2c590 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f     ** consists o
2c5a0 66 20 61 20 34 2d 62 79 74 65 20 70 61 67 65 20  f a 4-byte page 
2c5b0 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61 67 65  number (the page
2c5c0 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65   number of pPage
2c5d0 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76  ) and.    ** a v
2c5e0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b  ariable length k
2c5f0 65 79 20 76 61 6c 75 65 20 28 77 68 69 63 68 20  ey value (which 
2c600 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
2c610 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20   value as the.  
2c620 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79    ** largest key
2c630 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20   on pPage)..    
2c640 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e  **.    ** To fin
2c650 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  d the largest ke
2c660 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65  y value on pPage
2c670 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74 68 65  , first find the
2c680 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20   right-most .   
2c690 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67   ** cell on pPag
2c6a0 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 77 6f  e. The first two
2c6b0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20   fields of this 
2c6c0 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20  cell are the .  
2c6d0 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67    ** record-leng
2c6e0 74 68 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c  th (a variable l
2c6f0 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61 74  ength integer at
2c700 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e   most 32-bits in
2c710 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e   size).    ** an
2c720 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20  d the key value 
2c730 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  (a variable leng
2c740 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20  th integer, may 
2c750 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e  have any value).
2c760 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73  .    ** The firs
2c770 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e  t of the while(.
2c780 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20  ..) loops below 
2c790 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20 72  skips over the r
2c7a0 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20  ecord-length.   
2c7b0 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73   ** field. The s
2c7c0 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29  econd while(...)
2c7d0 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65   loop copies the
2c7e0 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20   key value from 
2c7f0 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  the.    ** cell 
2c800 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68  on pPage into th
2c810 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  e pSpace buffer.
2c820 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c  .    */.    pCel
2c830 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
2c840 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge, pPage->nCell
2c850 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d  -1);.    pStop =
2c860 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20   &pCell[9];.    
2c870 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b  while( (*(pCell+
2c880 2b 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  +)&0x80) && pCel
2c890 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70  l<pStop );.    p
2c8a0 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d  Stop = &pCell[9]
2c8b0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a  ;.    while( ((*
2c8c0 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65  (pOut++) = *(pCe
2c8d0 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20  ll++))&0x80) && 
2c8e0 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a  pCell<pStop );..
2c8f0 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
2c900 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
2c910 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  ll into pParent.
2c920 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65   */.    insertCe
2c930 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72  ll(pParent, pPar
2c940 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61  ent->nCell, pSpa
2c950 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d 70  ce, (int)(pOut-p
2c960 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20  Space),.        
2c970 20 20 20 20 20 20 20 30 2c 20 70 50 61 67 65 2d         0, pPage-
2c980 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20  >pgno, &rc);..  
2c990 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67    /* Set the rig
2c9a0 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ht-child pointer
2c9b0 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70   of pParent to p
2c9c0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
2c9d0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74  page. */.    put
2c9e0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
2c9f0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
2ca00 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
2ca10 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  oNew);.  .    /*
2ca20 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   Release the ref
2ca30 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  erence to the ne
2ca40 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72  w page. */.    r
2ca50 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
2ca60 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2ca70 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
2ca80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
2ca90 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66  KBALANCE */..#if
2caa0 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75   0./*.** This fu
2cab0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
2cac0 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68  contribute anyth
2cad0 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ing to the opera
2cae0 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a  tion of SQLite..
2caf0 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d  ** it is sometim
2cb00 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65 6d  es activated tem
2cb10 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64  porarily while d
2cb20 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65  ebugging code re
2cb30 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f  sponsible .** fo
2cb40 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65  r setting pointe
2cb50 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a  r-map entries..*
2cb60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
2cb70 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65  mapCheckPages(Me
2cb80 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20  mPage **apPage, 
2cb90 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  int nPage){.  in
2cba0 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d  t i, j;.  for(i=
2cbb0 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29  0; i<nPage; i++)
2cbc0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20  {.    Pgno n;.  
2cbd0 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50    u8 e;.    MemP
2cbe0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50  age *pPage = apP
2cbf0 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68  age[i];.    BtSh
2cc00 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
2cc10 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  e->pBt;.    asse
2cc20 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2cc30 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  t );..    for(j=
2cc40 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; j<pPage->nCel
2cc50 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43  l; j++){.      C
2cc60 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
2cc70 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20      u8 *z;.     
2cc80 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43  .      z = findC
2cc90 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20  ell(pPage, j);. 
2cca0 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
2ccb0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c  ellPtr(pPage, z,
2ccc0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69   &info);.      i
2ccd0 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
2cce0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  w ){.        Pgn
2ccf0 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
2cd00 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  e(&z[info.iOverf
2cd10 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  low]);.        p
2cd20 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76  trmapGet(pBt, ov
2cd30 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  fl, &e, &n);.   
2cd40 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
2cd50 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
2cd60 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
2cd70 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  W1 );.      }.  
2cd80 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2cd90 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2cda0 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74  Pgno child = get
2cdb0 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20  4byte(z);.      
2cdc0 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
2cdd0 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
2cde0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2cdf0 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
2ce00 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  && e==PTRMAP_BTR
2ce10 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  EE );.      }.  
2ce20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61    }.    if( !pPa
2ce30 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2ce40 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67    Pgno child = g
2ce50 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2ce60 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2ce70 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2ce80 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
2ce90 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
2cea0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2ceb0 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
2cec0 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45   e==PTRMAP_BTREE
2ced0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
2cee0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
2cef0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
2cf00 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
2cf10 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74  to copy the cont
2cf20 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72  ents of the b-tr
2cf30 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a  ee node stored .
2cf40 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d  ** on page pFrom
2cf50 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66   to page pTo. If
2cf60 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20   page pFrom was 
2cf70 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c  not a leaf page,
2cf80 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69   then.** the poi
2cf90 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2cfa0 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20   for each child 
2cfb0 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65 64  page are updated
2cfc0 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
2cfd0 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72  parent page stor
2cfe0 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ed in the pointe
2cff0 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70 54  r map is page pT
2d000 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74  o. If pFrom cont
2d010 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c  ained.** any cel
2d020 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77  ls with overflow
2d030 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20   page pointers, 
2d040 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70  then the corresp
2d050 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a  onding pointer.*
2d060 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72  * map entries ar
2d070 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73  e also updated s
2d080 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65 6e  o that the paren
2d090 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20 70  t page is page p
2d0a0 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72  To..**.** If pFr
2d0b0 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  om is currently 
2d0c0 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65  carrying any ove
2d0d0 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74  rflow cells (ent
2d0e0 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d  ries in the.** M
2d0f0 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61  emPage.aOvfl[] a
2d100 72 72 61 79 29 2c 20 74 68 65 79 20 61 72 65 20  rray), they are 
2d110 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54  not copied to pT
2d120 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  o. .**.** Before
2d130 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65   returning, page
2d140 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61   pTo is reinitia
2d150 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65  lized using btre
2d160 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a  eInitPage()..**.
2d170 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e  ** The performan
2d180 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ce of this funct
2d190 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69  ion is not criti
2d1a0 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20  cal. It is only 
2d1b0 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20  used by .** the 
2d1c0 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65  balance_shallowe
2d1d0 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f  r() and balance_
2d1e0 64 65 65 70 65 72 28 29 20 70 72 6f 63 65 64 75  deeper() procedu
2d1f0 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a  res, neither of.
2d200 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63 61 6c  ** which are cal
2d210 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20  led often under 
2d220 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61  normal circumsta
2d230 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nces..*/.static 
2d240 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e  void copyNodeCon
2d250 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46  tent(MemPage *pF
2d260 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54  rom, MemPage *pT
2d270 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  o, int *pRC){.  
2d280 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
2d290 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53  TE_OK ){.    BtS
2d2a0 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42  hared * const pB
2d2b0 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a  t = pFrom->pBt;.
2d2c0 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61      u8 * const a
2d2d0 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44  From = pFrom->aD
2d2e0 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f  ata;.    u8 * co
2d2f0 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61  nst aTo = pTo->a
2d300 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f  Data;.    int co
2d310 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70  nst iFromHdr = p
2d320 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b  From->hdrOffset;
2d330 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69  .    int const i
2d340 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70  ToHdr = ((pTo->p
2d350 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20  gno==1) ? 100 : 
2d360 30 29 3b 0a 20 20 20 20 54 45 53 54 4f 4e 4c 59  0);.    TESTONLY
2d370 28 69 6e 74 20 72 63 3b 29 0a 20 20 20 20 69 6e  (int rc;).    in
2d380 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20  t iData;.  .  . 
2d390 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2d3a0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
2d3b0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e  assert( pFrom->n
2d3c0 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a  Free>=iToHdr );.
2d3d0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32      assert( get2
2d3e0 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
2d3f0 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75  mHdr+5])<=pBt->u
2d400 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a  sableSize );.  .
2d410 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
2d420 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74  b-tree node cont
2d430 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46  ent from page pF
2d440 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e  rom to page pTo.
2d450 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20   */.    iData = 
2d460 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b  get2byte(&aFrom[
2d470 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20  iFromHdr+5]);.  
2d480 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44    memcpy(&aTo[iD
2d490 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61  ata], &aFrom[iDa
2d4a0 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  ta], pBt->usable
2d4b0 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20  Size-iData);.   
2d4c0 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f   memcpy(&aTo[iTo
2d4d0 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72  Hdr], &aFrom[iFr
2d4e0 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63  omHdr], pFrom->c
2d4f0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46  ellOffset + 2*pF
2d500 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a  rom->nCell);.  .
2d510 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c      /* Reinitial
2d520 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20  ize page pTo so 
2d530 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
2d540 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
2d550 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a   structure.    *
2d560 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  * match the new 
2d570 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61  data. The initia
2d580 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20  lization of pTo 
2d590 22 63 61 6e 6e 6f 74 22 20 66 61 69 6c 2c 20 61  "cannot" fail, a
2d5a0 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  s the.    ** dat
2d5b0 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 70 46  a copied from pF
2d5c0 72 6f 6d 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20  rom is known to 
2d5d0 62 65 20 76 61 6c 69 64 2e 20 20 2a 2f 0a 20 20  be valid.  */.  
2d5e0 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20    pTo->isInit = 
2d5f0 30 3b 0a 20 20 20 20 54 45 53 54 4f 4e 4c 59 28  0;.    TESTONLY(
2d600 72 63 20 3d 20 29 20 62 74 72 65 65 49 6e 69 74  rc = ) btreeInit
2d610 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 61  Page(pTo);.    a
2d620 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2d630 45 5f 4f 4b 20 29 3b 0a 20 20 0a 20 20 20 20 2f  E_OK );.  .    /
2d640 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2d650 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
2d660 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
2d670 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2d680 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ries.    ** for 
2d690 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76  any b-tree or ov
2d6a0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
2d6b0 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69  t pTo now contai
2d6c0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20  ns the pointers 
2d6d0 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  to..    */.    i
2d6e0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2d6f0 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
2d700 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
2d710 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pTo);.    }.  }.
2d720 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2d730 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
2d740 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  tes cells on the
2d750 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20 63   iParentIdx'th c
2d760 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a  hild of pParent.
2d770 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22 74  ** (hereafter "t
2d780 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75 70  he page") and up
2d790 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73   to 2 siblings s
2d7a0 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
2d7b0 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a   have about the.
2d7c0 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f  ** same amount o
2d7d0 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55 73  f free space. Us
2d7e0 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73  ually a single s
2d7f0 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72  ibling on either
2d800 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20   side of the.** 
2d810 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69 6e  page are used in
2d820 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20   the balancing, 
2d830 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c  though both sibl
2d840 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20  ings might come 
2d850 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65  from one.** side
2d860 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
2d870 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73  the first or las
2d880 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70  t child of its p
2d890 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61  arent. If the pa
2d8a0 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72  ge .** has fewer
2d8b0 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73   than 2 siblings
2d8c0 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63   (something whic
2d8d0 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
2d8e0 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a  n if the page.**
2d8f0 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20   is a root page 
2d900 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20  or a child of a 
2d910 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20  root page) then 
2d920 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69  all available si
2d930 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63  blings.** partic
2d940 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
2d950 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ancing..**.** Th
2d960 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  e number of sibl
2d970 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65  ings of the page
2d980 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
2d990 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64  sed or decreased
2d9a0 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74   by .** one or t
2d9b0 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  wo in an effort 
2d9c0 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65  to keep pages ne
2d9d0 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f  arly full but no
2d9e0 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a  t over full. .**
2d9f0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68  .** Note that wh
2da00 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2da10 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20  is called, some 
2da20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
2da30 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68  the page.** migh
2da40 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
2da50 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50  e stored in MemP
2da60 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69  age.aData[]. Thi
2da70 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20  s can happen.** 
2da80 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
2da90 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f  verfull. This ro
2daa0 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
2dab0 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c  at all cells all
2dac0 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  ocated.** to the
2dad0 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
2dae0 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20  blings fit into 
2daf0 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20  MemPage.aData[] 
2db00 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2db10 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
2db20 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69  ourse of balanci
2db30 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  ng the page and 
2db40 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65  its siblings, ce
2db50 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e  lls may be.** in
2db60 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72  serted into or r
2db70 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
2db80 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50 61  parent page (pPa
2db90 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a  rent). Doing so.
2dba0 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ** may cause the
2dbb0 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20   parent page to 
2dbc0 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
2dbd0 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66  or underfull. If
2dbe0 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73   this.** happens
2dbf0 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  , it is the resp
2dc00 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
2dc10 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f  e caller to invo
2dc20 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  ke the correct.*
2dc30 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  * balancing rout
2dc40 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73 20  ine to fix this 
2dc50 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65  problem (see the
2dc60 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69   balance() routi
2dc70 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ne). .**.** If t
2dc80 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
2dc90 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
2dca0 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65  , it might leave
2dcb0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
2dcc0 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20   in a corrupted 
2dcd0 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69  state. So if thi
2dce0 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c  s routine fails,
2dcf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
2dd00 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65  ould.** be rolle
2dd10 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
2dd20 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
2dd30 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2dd40 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69  n, aOvflSpace, i
2dd50 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2dd60 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20 65  .** buffer big e
2dd70 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e  nough to hold on
2dd80 65 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c 65  e page. If while
2dd90 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73   inserting cells
2dda0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
2ddb0 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e  .** page (pParen
2ddc0 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  t) the parent pa
2ddd0 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66  ge becomes overf
2dde0 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72  ull, this buffer
2ddf0 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73   is.** used to s
2de00 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 27  tore the parent'
2de10 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  s overflow cells
2de20 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66  . Because this f
2de30 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a  unction inserts.
2de40 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  ** a maximum of 
2de50 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65 6c  four divider cel
2de60 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
2de70 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65  nt page, and the
2de80 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65   maximum.** size
2de90 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65   of a cell store
2dea0 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65  d within an inte
2deb0 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77  rnal node is alw
2dec0 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f  ays less than 1/
2ded0 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  4.** of the page
2dee0 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c  -size, the aOvfl
2def0 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69  Space[] buffer i
2df00 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2df10 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  be large.** enou
2df20 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66  gh for all overf
2df30 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  low cells..**.**
2df40 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69   If aOvflSpace i
2df50 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20  s set to a null 
2df60 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
2df70 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
2df80 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
2df90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2dfa0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a  alance_nonroot(.
2dfb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
2dfc0 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
2dfd0 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65    /* Parent page
2dfe0 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69   of siblings bei
2dff0 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
2e000 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c   int iParentIdx,
2e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e020 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68   /* Index of "th
2e030 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65  e page" in pPare
2e040 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66  nt */.  u8 *aOvf
2e050 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  lSpace,         
2e060 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d          /* page-
2e070 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  size bytes of sp
2e080 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f  ace for parent o
2e090 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  vfl */.  int isR
2e0a0 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20  oot             
2e0b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2e0c0 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61   if pParent is a
2e0d0 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29 7b   root-page */.){
2e0e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2e0f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e100 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74  /* The whole dat
2e110 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
2e120 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
2e130 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e140 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
2e150 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
2e160 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20  nMaxCells = 0;  
2e170 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
2e180 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70  cated size of ap
2e190 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46  Cell, szCell, aF
2e1a0 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  rom. */.  int nN
2e1b0 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
2e1c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e1d0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e   of pages in apN
2e1e0 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ew[] */.  int nO
2e1f0 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2e200 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e210 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f   of pages in apO
2e220 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ld[] */.  int i,
2e230 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
2e240 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2e250 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
2e260 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20   nxDiv;         
2e270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
2e280 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69  t divider slot i
2e290 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
2e2a0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  [] */.  int rc =
2e2b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2e2c0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
2e2d0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  rn code */.  u16
2e2e0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
2e2f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69            /* 4 i
2e300 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
2e310 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a  f.  0 if not */.
2e320 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20    int leafData; 
2e330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e340 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20  * True if pPage 
2e350 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c  is a leaf of a L
2e360 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a  EAFDATA tree */.
2e370 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63    int usableSpac
2e380 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2e390 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65  * Bytes in pPage
2e3a0 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64   beyond the head
2e3b0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  er */.  int page
2e3c0 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
2e3d0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
2e3e0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
2e3f0 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74   */.  int subtot
2e400 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
2e410 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f     /* Subtotal o
2e420 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73  f bytes in cells
2e430 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a   on one page */.
2e440 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20    int iSpace1 = 
2e450 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2e460 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
2e470 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d  yte of aSpace1[]
2e480 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53   */.  int iOvflS
2e490 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  pace = 0;       
2e4a0 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
2e4b0 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c  ed byte of aOvfl
2e4c0 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Space[] */.  int
2e4d0 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20   szScratch;     
2e4e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2e4f0 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d  e of scratch mem
2e500 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f  ory requested */
2e510 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c  .  MemPage *apOl
2e520 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  d[NB];          
2e530 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
2e540 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20  to two siblings 
2e550 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
2e560 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
2e570 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70    /* Private cop
2e580 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70  ies of apOld[] p
2e590 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ages */.  MemPag
2e5a0 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20  e *apNew[NB+2]; 
2e5b0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
2e5c0 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62  and up to NB sib
2e5d0 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61  lings after bala
2e5e0 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70  ncing */.  u8 *p
2e5f0 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  Right;          
2e600 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
2e610 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66  ion in parent of
2e620 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70   right-sibling p
2e630 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ointer */.  u8 *
2e640 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20  apDiv[NB-1];    
2e650 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
2e660 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
2e670 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
2e680 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
2e690 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2e6a0 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
2e6b0 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
2e6c0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
2e6d0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
2e6e0 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
2e6f0 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
2e700 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
2e710 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
2e720 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
2e730 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
2e740 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
2e750 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
2e760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e770 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
2e780 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
2e790 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
2e7a0 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20   *aSpace1;      
2e7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
2e7c0 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f  ace for copies o
2e7d0 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
2e7e0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
2e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e800 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74     /* Temp var t
2e810 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e  o store a page n
2e820 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70  umber in */..  p
2e830 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42  Bt = pParent->pB
2e840 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
2e850 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2e860 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2e870 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e880 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2e890 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
2e8a0 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54  e) );..#if 0.  T
2e8b0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2e8c0 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68  begin page %d ch
2e8d0 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50  ild of %d\n", pP
2e8e0 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65  age->pgno, pPare
2e8f0 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64  nt->pgno));.#end
2e900 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  if..  /* At this
2e910 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d   point pParent m
2e920 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  ay have at most 
2e930 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  one overflow cel
2e940 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74  l. And if.  ** t
2e950 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  his overflow cel
2e960 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74  l is present, it
2e970 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c   must be the cel
2e980 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64  l with .  ** ind
2e990 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54  ex iParentIdx. T
2e9a0 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d  his scenario com
2e9b0 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68  es about when th
2e9c0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
2e9d0 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69   is called (indi
2e9e0 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c  rectly) from sql
2e9f0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
2ea00 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
2ea10 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  ( pParent->nOver
2ea20 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65  flow==0 || pPare
2ea30 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  nt->nOverflow==1
2ea40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2ea50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2ea60 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
2ea70 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50  aOvfl[0].idx==iP
2ea80 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69  arentIdx );..  i
2ea90 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29  f( !aOvflSpace )
2eaa0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2eab0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
2eac0 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69    /* Find the si
2ead0 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62  bling pages to b
2eae0 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63  alance. Also loc
2eaf0 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e  ate the cells in
2eb00 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74   pParent .  ** t
2eb10 68 61 74 20 64 69 76 69 64 65 20 74 68 65 20 73  hat divide the s
2eb20 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65  iblings. An atte
2eb30 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66  mpt is made to f
2eb40 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  ind NN siblings 
2eb50 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  on .  ** either 
2eb60 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d  side of pPage. M
2eb70 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  ore siblings are
2eb80 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20   taken from one 
2eb90 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a  side, however, .
2eba0 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72    ** if there ar
2ebb0 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20  e fewer than NN 
2ebc0 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20  siblings on the 
2ebd0 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66 20 70  other side. If p
2ebe0 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20  Parent.  ** has 
2ebf0 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c  NB or fewer chil
2ec00 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68  dren then all ch
2ec10 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e  ildren of pParen
2ec20 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20  t are taken.  . 
2ec30 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
2ec40 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68  op also drops th
2ec50 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  e divider cells 
2ec60 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
2ec70 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  page. This.  ** 
2ec80 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64  way, the remaind
2ec90 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  er of the functi
2eca0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  on does not have
2ecb0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e   to deal with an
2ecc0 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20  y.  ** overflow 
2ecd0 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72  cells in the par
2ece0 65 6e 74 20 70 61 67 65 2c 20 73 69 6e 63 65 20  ent page, since 
2ecf0 69 66 20 61 6e 79 20 65 78 69 73 74 65 64 20 74  if any existed t
2ed00 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61  hey will.  ** ha
2ed10 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
2ed20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20  removed..  */.  
2ed30 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  i = pParent->nOv
2ed40 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74  erflow + pParent
2ed50 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69  ->nCell;.  if( i
2ed60 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  <2 ){.    nxDiv 
2ed70 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20  = 0;.    nOld = 
2ed80 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  i+1;.  }else{.  
2ed90 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20 20    nOld = 3;.    
2eda0 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d  if( iParentIdx==
2edb0 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
2edc0 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69       .      nxDi
2edd0 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  v = 0;.    }else
2ede0 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
2edf0 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69  =i ){.      nxDi
2ee00 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65 6c  v = i-2;.    }el
2ee10 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20  se{.      nxDiv 
2ee20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a  = iParentIdx-1;.
2ee30 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 3b      }.    i = 2;
2ee40 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e 78  .  }.  if( (i+nx
2ee50 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
2ee60 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74  erflow)==pParent
2ee70 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
2ee80 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74  Right = &pParent
2ee90 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2eea0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20  >hdrOffset+8];. 
2eeb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67   }else{.    pRig
2eec0 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ht = findCell(pP
2eed0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
2eee0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2eef0 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d  w);.  }.  pgno =
2ef00 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68 74   get4byte(pRight
2ef10 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  );.  while( 1 ){
2ef20 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
2ef30 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
2ef40 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a  no, &apOld[i]);.
2ef50 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2ef60 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
2ef70 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f  , 0, (i+1)*sizeo
2ef80 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20  f(MemPage*));.  
2ef90 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2efa0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a  _cleanup;.    }.
2efb0 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d      nMaxCells +=
2efc0 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65   1+apOld[i]->nCe
2efd0 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76  ll+apOld[i]->nOv
2efe0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20  erflow;.    if( 
2eff0 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b  (i--)==0 ) break
2f000 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78 44  ;..    if( i+nxD
2f010 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 4f 76  iv==pParent->aOv
2f020 66 6c 5b 30 5d 2e 69 64 78 20 26 26 20 70 50 61  fl[0].idx && pPa
2f030 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
2f040 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69  ){.      apDiv[i
2f050 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76  ] = pParent->aOv
2f060 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20  fl[0].pCell;.   
2f070 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
2f080 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  te(apDiv[i]);.  
2f090 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63      szNew[i] = c
2f0a0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
2f0b0 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20  nt, apDiv[i]);. 
2f0c0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f       pParent->nO
2f0d0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
2f0e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70   }else{.      ap
2f0f0 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c  Div[i] = findCel
2f100 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
2f110 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
2f120 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67  rflow);.      pg
2f130 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70  no = get4byte(ap
2f140 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  Div[i]);.      s
2f150 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69  zNew[i] = cellSi
2f160 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61  zePtr(pParent, a
2f170 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20  pDiv[i]);..     
2f180 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c   /* Drop the cel
2f190 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  l from the paren
2f1a0 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d  t page. apDiv[i]
2f1b0 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   still points to
2f1c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65  .      ** the ce
2f1d0 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  ll within the pa
2f1e0 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  rent, even thoug
2f1f0 68 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 72  h it has been dr
2f200 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  opped..      ** 
2f210 54 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63  This is safe bec
2f220 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20  ause dropping a 
2f230 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72  cell only overwr
2f240 69 74 65 73 20 74 68 65 20 66 69 72 73 74 0a 20  ites the first. 
2f250 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74       ** four byt
2f260 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68  es of it, and th
2f270 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
2f280 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69   not need the fi
2f290 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75  rst.      ** fou
2f2a0 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 64  r bytes of the d
2f2b0 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20  ivider cell. So 
2f2c0 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73  the pointer is s
2f2d0 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20  afe to use.     
2f2e0 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a   ** later on.  .
2f2f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2f300 2a 20 55 6e 6c 65 73 73 20 53 51 4c 69 74 65 20  * Unless SQLite 
2f310 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 73  is compiled in s
2f320 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
2f330 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
2f340 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72  .      ** the dr
2f350 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65  opCell() routine
2f360 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20   will overwrite 
2f370 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
2f380 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20  with zeroes..   
2f390 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
2f3a0 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20  se, temporarily 
2f3b0 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e  copy the cell in
2f3c0 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63  to the aOvflSpac
2f3d0 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66  e[].      ** buf
2f3e0 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20  fer. It will be 
2f3f0 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e  copied out again
2f400 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
2f410 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a  aSpace[] buffer.
2f420 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f        ** is allo
2f430 63 61 74 65 64 2e 20 20 2a 2f 0a 23 69 66 64 65  cated.  */.#ifde
2f440 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
2f450 44 45 4c 45 54 45 0a 20 20 20 20 20 20 6d 65 6d  DELETE.      mem
2f460 63 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b  cpy(&aOvflSpace[
2f470 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74  apDiv[i]-pParent
2f480 2d 3e 61 44 61 74 61 5d 2c 20 61 70 44 69 76 5b  ->aData], apDiv[
2f490 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20  i], szNew[i]);. 
2f4a0 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
2f4b0 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69  &aOvflSpace[apDi
2f4c0 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44  v[i]-pParent->aD
2f4d0 61 74 61 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ata];.#endif.   
2f4e0 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72     dropCell(pPar
2f4f0 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
2f500 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c  rent->nOverflow,
2f510 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b   szNew[i], &rc);
2f520 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2f530 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20   Make nMaxCells 
2f540 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20  a multiple of 4 
2f550 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73  in order to pres
2f560 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a  erve 8-byte.  **
2f570 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20   alignment */.  
2f580 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61  nMaxCells = (nMa
2f590 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a  xCells + 3)&~3;.
2f5a0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
2f5b0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
2f5c0 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a  mory structures.
2f5d0 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e    */.  k = pBt->
2f5e0 70 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44  pageSize + ROUND
2f5f0 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
2f600 29 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68 20  ));.  szScratch 
2f610 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c  =.       nMaxCel
2f620 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20  ls*sizeof(u8*)  
2f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f640 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a       /* apCell *
2f650 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c  /.     + nMaxCel
2f660 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20  ls*sizeof(u16)  
2f670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f680 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a       /* szCell *
2f690 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61  /.     + pBt->pa
2f6a0 67 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  geSize          
2f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6c0 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20       /* aSpace1 
2f6d0 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64  */.     + k*nOld
2f6e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f700 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
2f710 70 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f  pies (apCopy) */
2f720 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
2f730 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
2f740 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a  ( szScratch ); .
2f750 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20    if( apCell==0 
2f760 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2f770 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
2f780 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2f790 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c  up;.  }.  szCell
2f7a0 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c   = (u16*)&apCell
2f7b0 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
2f7c0 53 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73  Space1 = (u8*)&s
2f7d0 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  zCell[nMaxCells]
2f7e0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2f7f0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2f800 28 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20  (aSpace1) );..  
2f810 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
2f820 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
2f830 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
2f840 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
2f850 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
2f860 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
2f870 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
2f880 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
2f890 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
2f8a0 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
2f8b0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53  obtained from aS
2f8c0 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f  pace1[] and remo
2f8d0 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64  ve the the divid
2f8e0 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72  er Cells.  ** fr
2f8f0 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a  om pParent..  **
2f900 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62  .  ** If the sib
2f910 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61  lings are on lea
2f920 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68  f pages, then th
2f930 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
2f940 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76   of the.  ** div
2f950 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73  ider cells are s
2f960 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65  tripped from the
2f970 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68   cells before th
2f980 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20  ey are copied.  
2f990 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b  ** into aSpace1[
2f9a0 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  ].  In this way,
2f9b0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
2f9c0 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f  Cell[] are witho
2f9d0 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f  ut.  ** child po
2f9e0 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c  inters.  If sibl
2f9f0 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
2fa00 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65  ves, then all ce
2fa10 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c  ll in.  ** apCel
2fa20 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c  l[] include chil
2fa30 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74  d pointers.  Eit
2fa40 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  her way, all cel
2fa50 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20  ls in apCell[]. 
2fa60 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20   ** are alike.. 
2fa70 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72   **.  ** leafCor
2fa80 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70  rection:  4 if p
2fa90 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
2faa0 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e   0 if pPage is n
2fab0 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20  ot a leaf..  ** 
2fac0 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20        leafData: 
2fad0 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64   1 if pPage hold
2fae0 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70  s key+data and p
2faf0 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c  Parent holds onl
2fb00 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c  y keys..  */.  l
2fb10 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20  eafCorrection = 
2fb20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34  apOld[0]->leaf*4
2fb30 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61  ;.  leafData = a
2fb40 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74 61  pOld[0]->hasData
2fb50 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
2fb60 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Old; i++){.    i
2fb70 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a 20  nt limit;.    . 
2fb80 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69     /* Before doi
2fb90 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
2fba0 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  , take a copy of
2fbb0 20 74 68 65 20 69 27 74 68 20 6f 72 69 67 69 6e   the i'th origin
2fbc0 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a  al sibling.    *
2fbd0 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68  * The rest of th
2fbe0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
2fbf0 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74   use data from t
2fc00 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65 72  he copies rather
2fc10 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
2fc20 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
2fc30 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e  since the origin
2fc40 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  al pages will be
2fc50 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
2fc60 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
2fc70 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
2fc80 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
2fc90 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d  ld = apCopy[i] =
2fca0 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70 61   (MemPage*)&aSpa
2fcb0 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce1[pBt->pageSiz
2fcc0 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65  e + k*i];.    me
2fcd0 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c 64  mcpy(pOld, apOld
2fce0 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50  [i], sizeof(MemP
2fcf0 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64 2d  age));.    pOld-
2fd00 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29  >aData = (void*)
2fd10 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d 65  &pOld[1];.    me
2fd20 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74 61  mcpy(pOld->aData
2fd30 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74  , apOld[i]->aDat
2fd40 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  a, pBt->pageSize
2fd50 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d 20  );..    limit = 
2fd60 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64  pOld->nCell+pOld
2fd70 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
2fd80 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
2fd90 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61  t; j++){.      a
2fda0 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
2fdb0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
2fdc0 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
2fdd0 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
2fde0 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20  (pOld, j);.     
2fdf0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
2fe00 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
2fe10 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
2fe20 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  );.      nCell++
2fe30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2fe40 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61  i<nOld-1 && !lea
2fe50 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75 31  fData){.      u1
2fe60 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65  6 sz = (u16)szNe
2fe70 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a  w[i];.      u8 *
2fe80 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73 73  pTemp;.      ass
2fe90 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
2fea0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73 7a  ells );.      sz
2feb0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a  Cell[nCell] = sz
2fec0 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20  ;.      pTemp = 
2fed0 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65 31  &aSpace1[iSpace1
2fee0 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65 31  ];.      iSpace1
2fef0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73   += sz;.      as
2ff00 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70  sert( sz<=pBt->p
2ff10 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20  ageSize/4 );.   
2ff20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63     assert( iSpac
2ff30 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  e1<=pBt->pageSiz
2ff40 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e );.      memcp
2ff50 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69  y(pTemp, apDiv[i
2ff60 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70  ], sz);.      ap
2ff70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54  Cell[nCell] = pT
2ff80 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69  emp+leafCorrecti
2ff90 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  on;.      assert
2ffa0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
2ffb0 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65  ==0 || leafCorre
2ffc0 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
2ffd0 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
2ffe0 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20  = szCell[nCell] 
2fff0 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  - leafCorrection
30000 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c  ;.      if( !pOl
30010 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  d->leaf ){.     
30020 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
30030 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a  orrection==0 );.
30040 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30050 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d  pOld->hdrOffset=
30060 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 );.        /*
30070 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74   The right point
30080 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
30090 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65  page pOld become
300a0 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20  s the left.     
300b0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66     ** pointer of
300c0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
300d0 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  l */.        mem
300e0 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  cpy(apCell[nCell
300f0 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b  ], &pOld->aData[
30100 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65  8], 4);.      }e
30110 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
30120 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
30130 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
30140 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65    if( szCell[nCe
30150 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ll]<4 ){.       
30160 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
30170 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61  ow any cells sma
30180 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65  ller than 4 byte
30190 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
301a0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
301b0 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
301c0 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c     }.      nCell
301d0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
301e0 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20   /*.  ** Figure 
301f0 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  out the number o
30200 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74  f pages needed t
30210 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c  o hold all nCell
30220 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f   cells..  ** Sto
30230 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69  re this number i
30240 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d  n "k".  Also com
30250 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69  pute szNew[] whi
30260 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a  ch is the total.
30270 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c    ** size of all
30280 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d   cells on the i-
30290 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e  th page and cntN
302a0 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
302b0 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20  e index.  ** in 
302c0 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20  apCell[] of the 
302d0 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65  cell that divide
302e0 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61  s page i from pa
302f0 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63  ge i+1.  .  ** c
30300 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20  ntNew[k] should 
30310 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a  equal nCell..  *
30320 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f  *.  ** Values co
30330 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62  mputed by this b
30340 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lock:.  **.  ** 
30350 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65            k: The
30360 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
30370 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20   sibling pages. 
30380 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a   **    szNew[i]:
30390 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20   Spaced used on 
303a0 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
303b0 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e   page..  **   cn
303c0 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69  tNew[i]: Index i
303d0 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73  n apCell[] and s
303e0 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20  zCell[] for the 
303f0 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20  first cell to.  
30400 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
30410 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
30420 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
30430 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53  ge..  ** usableS
30440 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20  pace: Number of 
30450 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
30460 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68  vailable on each
30470 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a   sibling..  ** .
30480 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61    */.  usableSpa
30490 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ce = pBt->usable
304a0 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66  Size - 12 + leaf
304b0 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f  Correction;.  fo
304c0 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30  r(subtotal=k=i=0
304d0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
304e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e  .    assert( i<n
304f0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
30500 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65  subtotal += szCe
30510 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69  ll[i] + 2;.    i
30520 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73  f( subtotal > us
30530 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20  ableSpace ){.   
30540 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75     szNew[k] = su
30550 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b  btotal - szCell[
30560 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77  i];.      cntNew
30570 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69  [k] = i;.      i
30580 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69  f( leafData ){ i
30590 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74  --; }.      subt
305a0 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
305b0 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  k++;.      if( k
305c0 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51  >NB+1 ){ rc = SQ
305d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 67 6f  LITE_CORRUPT; go
305e0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
305f0 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a  up; }.    }.  }.
30600 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
30610 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b  total;.  cntNew[
30620 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b  k] = nCell;.  k+
30630 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  +;..  /*.  ** Th
30640 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74  e packing comput
30650 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
30660 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73  us block is bias
30670 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69  ed toward the si
30680 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74  blings.  ** on t
30690 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54  he left side.  T
306a0 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73  he left siblings
306b0 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72   are always near
306c0 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74  ly full, while t
306d0 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f  he.  ** right-mo
306e0 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  st sibling might
306f0 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
30700 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .  This block of
30710 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20   code attempts. 
30720 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68   ** to adjust th
30730 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62  e packing of sib
30740 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62  lings to get a b
30750 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20  etter balance.. 
30760 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64   **.  ** This ad
30770 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65  justment is more
30780 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a   than an optimiz
30790 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b  ation.  The pack
307a0 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a  ing above might.
307b0 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f    ** be so out o
307c0 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20  f balance as to 
307d0 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72  be illegal.  For
307e0 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69   example, the ri
307f0 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69  ght-most.  ** si
30800 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63  bling might be c
30810 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
30820 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e    This adjustmen
30830 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61  t is not optiona
30840 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  l..  */.  for(i=
30850 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  k-1; i>0; i--){.
30860 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20      int szRight 
30870 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20  = szNew[i];  /* 
30880 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
30890 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
308a0 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d      int szLeft =
308b0 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20   szNew[i-1]; /* 
308c0 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
308d0 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
308e0 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20     int r;       
308f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
30900 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  of right-most ce
30910 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69  ll in left sibli
30920 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b  ng */.    int d;
30930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30940 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
30950 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74  cell to the left
30960 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e   of right siblin
30970 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e  g */..    r = cn
30980 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
30990 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
309a0 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73  eafData;.    ass
309b0 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73  ert( d<nMaxCells
309c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
309d0 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  r<nMaxCells );. 
309e0 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68     while( szRigh
309f0 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b  t==0 || szRight+
30a00 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c  szCell[d]+2<=szL
30a10 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32  eft-(szCell[r]+2
30a20 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67  ) ){.      szRig
30a30 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20  ht += szCell[d] 
30a40 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66  + 2;.      szLef
30a50 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b  t -= szCell[r] +
30a60 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77   2;.      cntNew
30a70 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72  [i-1]--;.      r
30a80 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
30a90 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20   1;.      d = r 
30aa0 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
30ab0 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b      }.    szNew[
30ac0 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20  i] = szRight;.  
30ad0 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73    szNew[i-1] = s
30ae0 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  zLeft;.  }..  /*
30af0 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64   Either we found
30b00 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c   one or more cel
30b10 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30  ls (cntnew[0])>0
30b20 29 20 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20  ) or pPage is.  
30b30 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  ** a virtual roo
30b40 74 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75  t page.  A virtu
30b50 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  al root page is 
30b60 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f  when the real ro
30b70 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20  ot.  ** page is 
30b80 70 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72  page 1 and we ar
30b90 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64  e the only child
30ba0 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20   of that page.. 
30bb0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e   */.  assert( cn
30bc0 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50  tNew[0]>0 || (pP
30bd0 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26  arent->pgno==1 &
30be0 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  & pParent->nCell
30bf0 3d 3d 30 29 20 29 3b 0a 0a 20 20 54 52 41 43 45  ==0) );..  TRACE
30c00 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a  (("BALANCE: old:
30c10 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20   %d %d %d  ",.  
30c20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f    apOld[0]->pgno
30c30 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f  , .    nOld>=2 ?
30c40 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20   apOld[1]->pgno 
30c50 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33  : 0,.    nOld>=3
30c60 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e   ? apOld[2]->pgn
30c70 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f  o : 0.  ));..  /
30c80 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
30c90 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65  k new pages.  Re
30ca0 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68  use old pages wh
30cb0 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20  ere possible..  
30cc0 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30  */.  if( apOld[0
30cd0 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20  ]->pgno<=1 ){.  
30ce0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
30cf0 52 52 55 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  RRUPT;.    goto 
30d00 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
30d10 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73  .  }.  pageFlags
30d20 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61   = apOld[0]->aDa
30d30 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ta[0];.  for(i=0
30d40 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
30d50 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a   MemPage *pNew;.
30d60 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29      if( i<nOld )
30d70 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61  {.      pNew = a
30d80 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b  pNew[i] = apOld[
30d90 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b  i];.      apOld[
30da0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  i] = 0;.      rc
30db0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
30dc0 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  rite(pNew->pDbPa
30dd0 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  ge);.      nNew+
30de0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  +;.      if( rc 
30df0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
30e00 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73  leanup;.    }els
30e10 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
30e20 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63   i>0 );.      rc
30e30 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
30e40 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
30e50 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20 30 29   &pgno, pgno, 0)
30e60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
30e70 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
30e80 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e  eanup;.      apN
30e90 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20  ew[i] = pNew;.  
30ea0 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20      nNew++;..   
30eb0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f     /* Set the po
30ec0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
30ed0 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c  for the new sibl
30ee0 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ing page. */.   
30ef0 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
30f00 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70  UUM ){.        p
30f10 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e  trmapPut(pBt, pN
30f20 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ew->pgno, PTRMAP
30f30 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
30f40 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
30f50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30f60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30f70 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
30f80 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
30f90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30fa0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  }.  }..  /* Free
30fb0 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74   any old pages t
30fc0 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75  hat were not reu
30fd0 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73  sed as new pages
30fe0 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
30ff0 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72  i<nOld ){.    fr
31000 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c  eePage(apOld[i],
31010 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
31020 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
31030 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65  _cleanup;.    re
31040 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
31050 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69  i]);.    apOld[i
31060 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a  ] = 0;.    i++;.
31070 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50    }..  /*.  ** P
31080 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ut the new pages
31090 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
310a0 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73  der.  This helps
310b0 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e   to.  ** keep en
310c0 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73  tries in the dis
310d0 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  k file in order 
310e0 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20  so that a scan. 
310f0 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
31100 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61   is a linear sca
31110 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69  n through the fi
31120 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69  le.  That.  ** i
31130 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65  n turn helps the
31140 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
31150 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67  m to deliver pag
31160 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  es.  ** from the
31170 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64   disk more rapid
31180 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  ly..  **.  ** An
31190 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f   O(n^2) insertio
311a0 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d  n sort algorithm
311b0 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69   is used, but si
311c0 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65  nce.  ** n is ne
311d0 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42  ver more than NB
311e0 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61   (a small consta
311f0 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64  nt), that should
31200 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70  .  ** not be a p
31210 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  roblem..  **.  *
31220 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68  * When NB==3, th
31230 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74  is one optimizat
31240 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61  ion makes the da
31250 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75  tabase.  ** abou
31260 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72  t 25% faster for
31270 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e   large insertion
31280 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e  s and deletions.
31290 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
312a0 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20   i<k-1; i++){.  
312b0 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e    int minV = apN
312c0 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  ew[i]->pgno;.   
312d0 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20   int minI = i;. 
312e0 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c     for(j=i+1; j<
312f0 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; j++){.      i
31300 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e  f( apNew[j]->pgn
31310 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56  o<(unsigned)minV
31320 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49   ){.        minI
31330 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69   = j;.        mi
31340 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70  nV = apNew[j]->p
31350 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gno;.      }.   
31360 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e   }.    if( minI>
31370 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  i ){.      int t
31380 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  ;.      MemPage 
31390 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 61  *pT;.      t = a
313a0 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20  pNew[i]->pgno;. 
313b0 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b       pT = apNew[
313c0 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  i];.      apNew[
313d0 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d  i] = apNew[minI]
313e0 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69  ;.      apNew[mi
313f0 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a  nI] = pT;.    }.
31400 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65    }.  TRACE(("ne
31410 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29  w: %d(%d) %d(%d)
31420 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
31430 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70  d(%d)\n",.    ap
31440 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a  New[0]->pgno, sz
31450 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77  New[0],.    nNew
31460 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e  >=2 ? apNew[1]->
31470 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
31480 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30  2 ? szNew[1] : 0
31490 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20  ,.    nNew>=3 ? 
314a0 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a  apNew[2]->pgno :
314b0 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a   0, nNew>=3 ? sz
314c0 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20  New[2] : 0,.    
314d0 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b  nNew>=4 ? apNew[
314e0 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e  3]->pgno : 0, nN
314f0 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d  ew>=4 ? szNew[3]
31500 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
31510 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67  5 ? apNew[4]->pg
31520 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20  no : 0, nNew>=5 
31530 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29  ? szNew[4] : 0))
31540 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
31550 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
31560 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
31570 62 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34  bPage) );.  put4
31580 62 79 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e  byte(pRight, apN
31590 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f  ew[nNew-1]->pgno
315a0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76  );..  /*.  ** Ev
315b0 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20  enly distribute 
315c0 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65  the data in apCe
315d0 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20  ll[] across the 
315e0 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20  new pages..  ** 
315f0 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63  Insert divider c
31600 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e  ells into pParen
31610 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  t as necessary..
31620 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20    */.  j = 0;.  
31630 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
31640 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73   i++){.    /* As
31650 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73  semble the new s
31660 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
31670 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
31680 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  w = apNew[i];.  
31690 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
316a0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72  Cells );.    zer
316b0 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65  oPage(pNew, page
316c0 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65  Flags);.    asse
316d0 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63  mblePage(pNew, c
316e0 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43  ntNew[i]-j, &apC
316f0 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b  ell[j], &szCell[
31700 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  j]);.    assert(
31710 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c   pNew->nCell>0 |
31720 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e  | (nNew==1 && cn
31730 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20  tNew[0]==0) );. 
31740 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
31750 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
31760 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77  ..    j = cntNew
31770 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  [i];..    /* If 
31780 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
31790 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65   assembled above
317a0 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67   was not the rig
317b0 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c  ht-most sibling,
317c0 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61  .    ** insert a
317d0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
317e0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
317f0 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ge..    */.    a
31800 73 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20  ssert( i<nNew-1 
31810 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20  || j==nCell );. 
31820 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29     if( j<nCell )
31830 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
31840 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65  l;.      u8 *pTe
31850 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  mp;.      int sz
31860 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
31870 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
31880 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70        pCell = ap
31890 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  Cell[j];.      s
318a0 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20  z = szCell[j] + 
318b0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
318c0 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
318d0 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53  OvflSpace[iOvflS
318e0 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28  pace];.      if(
318f0 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a   !pNew->leaf ){.
31900 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
31910 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  pNew->aData[8], 
31920 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20  pCell, 4);.     
31930 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44   }else if( leafD
31940 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
31950 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73  * If the tree is
31960 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65   a leaf-data tre
31970 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69  e, and the sibli
31980 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20  ngs are leaves, 
31990 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
319a0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76   there is no div
319b0 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43  ider cell in apC
319c0 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20  ell[]. Instead, 
319d0 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20  the divider .   
319e0 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e       ** cell con
319f0 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74  sists of the int
31a00 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65  eger key for the
31a10 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
31a20 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   of .        ** 
31a30 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65  the sibling-page
31a40 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65   assembled above
31a50 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a   only..        *
31a60 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  /.        CellIn
31a70 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
31a80 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 74   j--;.        bt
31a90 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
31aa0 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c  pNew, apCell[j],
31ab0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
31ac0 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
31ad0 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b          sz = 4 +
31ae0 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
31af0 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29  l[4], info.nKey)
31b00 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
31b10 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
31b20 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  {.        pCell 
31b30 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a  -= 4;.        /*
31b40 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f   Obscure case fo
31b50 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20  r non-leaf-data 
31b60 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65  trees: If the ce
31b70 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a  ll at pCell was.
31b80 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
31b90 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20  ously stored on 
31ba0 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64  a leaf node, and
31bb0 20 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69   its reported si
31bc0 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20  ze was 4.       
31bd0 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20   ** bytes, then 
31be0 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20  it may actually 
31bf0 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
31c00 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  this .        **
31c10 20 28 73 65 65 20 62 74 72 65 65 50 61 72 73 65   (see btreeParse
31c20 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74  CellPtr(), 4 byt
31c30 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75  es is the minimu
31c40 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20  m size of.      
31c50 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20    ** any cell). 
31c60 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74  But it is import
31c70 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20  ant to pass the 
31c80 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20  correct size to 
31c90 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65  .        ** inse
31ca0 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70  rtCell(), so rep
31cb0 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f  arse the cell no
31cc0 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  w..        **.  
31cd0 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
31ce0 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65  at this can neve
31cf0 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53  r happen in an S
31d00 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c  QLite data file,
31d10 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20   as all.        
31d20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20  ** cells are at 
31d30 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49  least 4 bytes. I
31d40 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  t only happens i
31d50 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20  n b-trees used. 
31d60 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61         ** to eva
31d70 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43  luate "IN (SELEC
31d80 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69  T ...)" and simi
31d90 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20  lar clauses..   
31da0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31db0 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34  if( szCell[j]==4
31dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
31dd0 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74  sert(leafCorrect
31de0 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20  ion==4);.       
31df0 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65     sz = cellSize
31e00 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65  Ptr(pParent, pCe
31e10 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ll);.        }. 
31e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76       }.      iOv
31e30 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20  flSpace += sz;. 
31e40 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c       assert( sz<
31e50 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34  =pBt->pageSize/4
31e60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
31e70 28 20 69 4f 76 66 6c 53 70 61 63 65 3c 3d 70 42  ( iOvflSpace<=pB
31e80 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
31e90 20 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28       insertCell(
31ea0 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
31eb0 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70  pCell, sz, pTemp
31ec0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72  , pNew->pgno, &r
31ed0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
31ee0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
31ef0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
31f00 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  up;.      assert
31f10 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
31f20 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
31f30 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  t->pDbPage) );..
31f40 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
31f50 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a   nxDiv++;.    }.
31f60 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d    }.  assert( j=
31f70 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  =nCell );.  asse
31f80 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20  rt( nOld>0 );.  
31f90 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29  assert( nNew>0 )
31fa0 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c 61  ;.  if( (pageFla
31fb0 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d  gs & PTF_LEAF)==
31fc0 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68  0 ){.    u8 *zCh
31fd0 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f  ild = &apCopy[nO
31fe0 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b  ld-1]->aData[8];
31ff0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e  .    memcpy(&apN
32000 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74  ew[nNew-1]->aDat
32010 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29  a[8], zChild, 4)
32020 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52  ;.  }..  if( isR
32030 6f 6f 74 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  oot && pParent->
32040 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72  nCell==0 && pPar
32050 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d  ent->hdrOffset<=
32060 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20  apNew[0]->nFree 
32070 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  ){.    /* The ro
32080 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
32090 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69  -tree now contai
320a0 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65  ns no cells. The
320b0 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20   only sibling.  
320c0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65    ** page is the
320d0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
320e0 74 68 65 20 70 61 72 65 6e 74 2e 20 43 6f 70 79  the parent. Copy
320f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
32100 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c   the.    ** chil
32110 64 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  d page into the 
32120 70 61 72 65 6e 74 2c 20 64 65 63 72 65 61 73 69  parent, decreasi
32130 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 68  ng the overall h
32140 65 69 67 68 74 20 6f 66 20 74 68 65 0a 20 20 20  eight of the.   
32150 20 2a 2a 20 62 2d 74 72 65 65 20 73 74 72 75 63   ** b-tree struc
32160 74 75 72 65 20 62 79 20 6f 6e 65 2e 20 54 68 69  ture by one. Thi
32170 73 20 69 73 20 64 65 73 63 72 69 62 65 64 20 61  s is described a
32180 73 20 74 68 65 20 22 62 61 6c 61 6e 63 65 2d 73  s the "balance-s
32190 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a  hallower".    **
321a0 20 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69   sub-algorithm i
321b0 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61  n some documenta
321c0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tion..    **.   
321d0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
321e0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
321f0 74 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c 6c  tabase, the call
32200 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74   to copyNodeCont
32210 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20 73 65  ent() .    ** se
32220 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d  ts all pointer-m
32230 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65  ap entries corre
32240 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 61  sponding to data
32250 62 61 73 65 20 69 6d 61 67 65 20 70 61 67 65 73  base image pages
32260 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 68 69   .    ** for whi
32270 63 68 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69  ch the pointer i
32280 73 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  s stored within 
32290 74 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  the content bein
322a0 67 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a  g copied..    **
322b0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  .    ** The seco
322c0 6e 64 20 61 73 73 65 72 74 20 62 65 6c 6f 77 20  nd assert below 
322d0 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
322e0 65 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20  e child page is 
322f0 64 65 66 72 61 67 6d 65 6e 74 65 64 0a 20 20 20  defragmented.   
32300 20 2a 2a 20 28 69 74 20 6d 75 73 74 20 62 65 2c   ** (it must be,
32310 20 61 73 20 69 74 20 77 61 73 20 6a 75 73 74 20   as it was just 
32320 72 65 63 6f 6e 73 74 72 75 63 74 65 64 20 75 73  reconstructed us
32330 69 6e 67 20 61 73 73 65 6d 62 6c 65 50 61 67 65  ing assemblePage
32340 28 29 29 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a  ()). This.    **
32350 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 66   is important if
32360 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
32370 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 70   happens to be p
32380 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
32390 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61  abase.    ** ima
323a0 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ge.  */.    asse
323b0 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20  rt( nNew==1 );. 
323c0 20 20 20 61 73 73 65 72 74 28 20 61 70 4e 65 77     assert( apNew
323d0 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20  [0]->nFree == . 
323e0 20 20 20 20 20 20 20 28 67 65 74 32 62 79 74 65         (get2byte
323f0 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74  (&apNew[0]->aDat
32400 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e  a[5])-apNew[0]->
32410 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77  cellOffset-apNew
32420 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20  [0]->nCell*2) . 
32430 20 20 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f     );.    copyNo
32440 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b  deContent(apNew[
32450 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26 72 63  0], pParent, &rc
32460 29 3b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28  );.    freePage(
32470 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a  apNew[0], &rc);.
32480 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55    }else if( ISAU
32490 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
324a0 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74  /* Fix the point
324b0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
324c0 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73  or all the cells
324d0 20 74 68 61 74 20 77 65 72 65 20 73 68 69 66 74   that were shift
324e0 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20  ed around. .    
324f0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 76  ** There are sev
32500 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74  eral different t
32510 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d  ypes of pointer-
32520 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68 61 74  map entries that
32530 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20   need to.    ** 
32540 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
32550 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53   this routine. S
32560 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61 76  ome of these hav
32570 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61  e been set alrea
32580 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d  dy, but.    ** m
32590 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68  any have not. Th
325a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
325b0 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a   summary:.    **
325c0 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65  .    **   1) The
325d0 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
325e0 74 65 64 20 77 69 74 68 20 6e 65 77 20 73 69 62  ted with new sib
325f0 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61 74 20  ling pages that 
32600 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  were not.    ** 
32610 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68       siblings wh
32620 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
32630 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65   was called. The
32640 73 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  se have already.
32650 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e      **      been
32660 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e   set. We don't n
32670 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f  eed to worry abo
32680 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20  ut old siblings 
32690 74 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a  that were.    **
326a0 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74        moved to t
326b0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74  he free-list - t
326c0 68 65 20 66 72 65 65 50 61 67 65 28 29 20 63 6f  he freePage() co
326d0 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72  de has taken car
326e0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66  e.    **      of
326f0 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20   those..    **. 
32700 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70     **   2) The p
32710 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
32720 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
32730 74 68 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  th the first ove
32740 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20  rflow.    **    
32750 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76    page in any ov
32760 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73  erflow chains us
32770 65 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65  ed by new divide
32780 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a  r cells. These .
32790 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65      **      have
327a0 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65   also already be
327b0 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66  en taken care of
327c0 20 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65   by the insertCe
327d0 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a  ll() code..    *
327e0 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66  *.    **   3) If
327f0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
32800 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  es are not leave
32810 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
32820 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a  d pages of.    *
32830 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f  *      cells sto
32840 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69  red on the sibli
32850 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65  ng pages may nee
32860 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  d to be updated.
32870 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
32880 20 34 29 20 49 66 20 74 68 65 20 73 69 62 6c 69   4) If the sibli
32890 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  ng pages are not
328a0 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79   internal intkey
328b0 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79   nodes, then any
328c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65  .    **      ove
328d0 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64  rflow pages used
328e0 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20   by these cells 
328f0 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75  may need to be u
32900 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20  pdated.    **   
32910 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74     (internal int
32920 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20  key nodes never 
32930 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
32940 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
32950 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  es)..    **.    
32960 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65 20 73  **   5) If the s
32970 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
32980 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
32990 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
329a0 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e  p.    **      en
329b0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 72 69  tries for the ri
329c0 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20  ght-child pages 
329d0 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20  of each sibling 
329e0 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
329f0 20 20 20 20 20 74 6f 20 62 65 20 75 70 64 61 74       to be updat
32a00 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
32a10 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20 32 20  * Cases 1 and 2 
32a20 61 72 65 20 64 65 61 6c 74 20 77 69 74 68 20 61  are dealt with a
32a30 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f  bove by other co
32a40 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20  de. The next.   
32a50 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20   ** block deals 
32a60 77 69 74 68 20 63 61 73 65 73 20 33 20 61 6e 64  with cases 3 and
32a70 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61   4 and the one a
32a80 66 74 65 72 20 74 68 61 74 2c 20 63 61 73 65 20  fter that, case 
32a90 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20  5. Since.    ** 
32aa0 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65  setting a pointe
32ab0 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61  r map entry is a
32ac0 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65   relatively expe
32ad0 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c  nsive operation,
32ae0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64   this.    ** cod
32af0 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e  e only sets poin
32b00 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
32b10 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65  for child or ove
32b20 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74  rflow pages that
32b30 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74   have.    ** act
32b40 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77  ually moved betw
32b50 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20  een pages.  */. 
32b60 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
32b70 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20   = apNew[0];.   
32b80 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
32b90 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20   apCopy[0];.    
32ba0 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  int nOverflow = 
32bb0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
32bc0 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c  .    int iNextOl
32bd0 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20  d = pOld->nCell 
32be0 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  + nOverflow;.   
32bf0 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d   int iOverflow =
32c00 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f   (nOverflow ? pO
32c10 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ld->aOvfl[0].idx
32c20 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20   : -1);.    j = 
32c30 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
32c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32c50 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20  * Current 'old' 
32c60 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a  sibling page */.
32c70 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20      k = 0;      
32c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c90 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
32ca0 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20  t 'new' sibling 
32cb0 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  page */.    for(
32cc0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
32cd0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73  +){.      int is
32ce0 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20 20  Divider = 0;.   
32cf0 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65     while( i==iNe
32d00 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20  xtOld ){.       
32d10 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68   /* Cell i is th
32d20 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65  e cell immediate
32d30 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
32d40 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c   last cell on ol
32d50 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62  d.        ** sib
32d60 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66 20  ling page j. If 
32d70 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
32d80 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20   not leaf pages 
32d90 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  of an.        **
32da0 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20   intkey b-tree, 
32db0 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73 20  then cell i was 
32dc0 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20  a divider cell. 
32dd0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20  */.        pOld 
32de0 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20  = apCopy[++j];. 
32df0 20 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20         iNextOld 
32e00 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20  = i + !leafData 
32e10 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20  + pOld->nCell + 
32e20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
32e30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c  .        if( pOl
32e40 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  d->nOverflow ){.
32e50 20 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66            nOverf
32e60 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65  low = pOld->nOve
32e70 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20  rflow;.         
32e80 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b   iOverflow = i +
32e90 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c   !leafData + pOl
32ea0 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b  d->aOvfl[0].idx;
32eb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32ec0 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 21     isDivider = !
32ed0 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20  leafData;  .    
32ee0 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
32ef0 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  t(nOverflow>0 ||
32f00 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a   iOverflow<i );.
32f10 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76        assert(nOv
32f20 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64  erflow<2 || pOld
32f30 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
32f40 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69  pOld->aOvfl[1].i
32f50 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73  dx-1);.      ass
32f60 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20  ert(nOverflow<3 
32f70 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31  || pOld->aOvfl[1
32f80 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76  ].idx==pOld->aOv
32f90 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20  fl[2].idx-1);.  
32fa0 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72      if( i==iOver
32fb0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
32fc0 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20  isDivider = 1;. 
32fd0 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f         if( (--nO
32fe0 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20  verflow)>0 ){.  
32ff0 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f          iOverflo
33000 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  w++;.        }. 
33010 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
33020 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29  ( i==cntNew[k] )
33030 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c  {.        /* Cel
33040 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20  l i is the cell 
33050 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
33060 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63  owing the last c
33070 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20  ell on new.     
33080 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61     ** sibling pa
33090 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62  ge k. If the sib
330a0 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
330b0 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20  af pages of an. 
330c0 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79         ** intkey
330d0 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65   b-tree, then ce
330e0 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69 64 65  ll i is a divide
330f0 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20  r cell.  */.    
33100 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77      pNew = apNew
33110 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69  [++k];.        i
33120 66 28 20 21 6c 65 61 66 44 61 74 61 20 29 20 63  f( !leafData ) c
33130 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
33140 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
33150 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61  <nOld );.      a
33160 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b  ssert( k<nNew );
33170 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
33180 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69  e cell was origi
33190 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65  nally divider ce
331a0 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e  ll (and is not n
331b0 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ow) or.      ** 
331c0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  an overflow cell
331d0 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c  , or if the cell
331e0 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20   was located on 
331f0 61 20 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c  a different sibl
33200 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ing.      ** pag
33210 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c  e before the bal
33220 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65  ancing, then the
33230 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
33240 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ries associated.
33250 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e        ** with an
33260 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66  y child or overf
33270 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64 20 74  low pages need t
33280 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a  o be updated.  *
33290 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 44 69  /.      if( isDi
332a0 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70  vider || pOld->p
332b0 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20  gno!=pNew->pgno 
332c0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
332d0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29  leafCorrection )
332e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 6d  {.          ptrm
332f0 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62  apPut(pBt, get4b
33300 79 74 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20  yte(apCell[i]), 
33310 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e  PTRMAP_BTREE, pN
33320 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ew->pgno, &rc);.
33330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33340 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e    if( szCell[i]>
33350 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29  pNew->minLocal )
33360 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 6d  {.          ptrm
33370 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65  apPutOvflPtr(pNe
33380 77 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72  w, apCell[i], &r
33390 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
333a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
333b0 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63   if( !leafCorrec
333c0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f  tion ){.      fo
333d0 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
333e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32  ++){.        u32
333f0 20 6b 65 79 20 3d 20 67 65 74 34 62 79 74 65 28   key = get4byte(
33400 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61  &apNew[i]->aData
33410 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74  [8]);.        pt
33420 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6b 65 79  rmapPut(pBt, key
33430 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
33440 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20  apNew[i]->pgno, 
33450 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &rc);.      }.  
33460 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f    }..#if 0.    /
33470 2a 20 54 68 65 20 70 74 72 6d 61 70 43 68 65 63  * The ptrmapChec
33480 6b 50 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e  kPages() contain
33490 73 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  s assert() state
334a0 6d 65 6e 74 73 20 74 68 61 74 20 76 65 72 69 66  ments that verif
334b0 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c  y that.    ** al
334c0 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  l pointer map pa
334d0 67 65 73 20 61 72 65 20 73 65 74 20 63 6f 72 72  ges are set corr
334e0 65 63 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68  ectly. This is h
334f0 65 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20  elpful while .  
33500 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20    ** debugging. 
33510 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
33520 64 69 73 61 62 6c 65 64 20 62 65 63 61 75 73 65  disabled because
33530 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
33540 61 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63  ase may.    ** c
33550 61 75 73 65 20 61 6e 20 61 73 73 65 72 74 28 29  ause an assert()
33560 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61   statement to fa
33570 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d  il.  */.    ptrm
33580 61 70 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e  apCheckPages(apN
33590 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70  ew, nNew);.    p
335a0 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
335b0 26 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65  &pParent, 1);.#e
335c0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ndif.  }..  asse
335d0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49  rt( pParent->isI
335e0 6e 69 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28  nit );.  TRACE((
335f0 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68  "BALANCE: finish
33600 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25  ed: old=%d new=%
33610 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20  d cells=%d\n",. 
33620 20 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e           nOld, n
33630 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20  New, nCell));.. 
33640 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70   /*.  ** Cleanup
33650 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
33660 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f  g..  */.balance_
33670 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
33680 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70  e3ScratchFree(ap
33690 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Cell);.  for(i=0
336a0 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
336b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
336c0 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apOld[i]);.  }. 
336d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
336e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
336f0 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d  asePage(apNew[i]
33700 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
33710 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
33720 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
33730 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
33740 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
33750 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
33760 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28  is.** overfull (
33770 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  has one or more 
33780 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e  overflow pages).
33790 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69  .**.** A new chi
337a0 6c 64 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63  ld page is alloc
337b0 61 74 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e  ated and the con
337c0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72  tents of the cur
337d0 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67  rent root.** pag
337e0 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65  e, including ove
337f0 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65  rflow cells, are
33800 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
33810 20 63 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74   child. The root
33820 0a 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 6e  .** page is then
33830 20 6f 76 65 72 77 72 69 74 74 65 6e 20 74 6f 20   overwritten to 
33840 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d 70 74 79  make it an empty
33850 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20 72   page with the r
33860 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70  ight-child .** p
33870 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20  ointer pointing 
33880 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
33890 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
338a0 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69  turning, all poi
338b0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
338c0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
338d0 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74 68 61 74  o pages .** that
338e0 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 2d 70   the new child-p
338f0 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73  age now contains
33900 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 65   pointers to are
33910 20 75 70 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a   updated. The.**
33920 20 65 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e   entry correspon
33930 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20  ding to the new 
33940 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e  right-child poin
33950 74 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a  ter of the root.
33960 2a 2a 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20  ** page is also 
33970 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  updated..**.** I
33980 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
33990 70 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f  pChild is set to
339a0 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72   contain a refer
339b0 65 6e 63 65 20 74 6f 20 74 68 65 20 63 68 69 6c  ence to the chil
339c0 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20 53  d .** page and S
339d0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
339e0 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
339f0 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  se the caller is
33a00 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
33a10 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
33a20 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65  () on *ppChild e
33a30 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20  xactly once. If 
33a40 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
33a50 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
33a60 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
33a70 64 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65  d *ppChild is se
33a80 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  t to 0..*/.stati
33a90 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65  c int balance_de
33aa0 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52  eper(MemPage *pR
33ab0 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70  oot, MemPage **p
33ac0 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72  pChild){.  int r
33ad0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
33ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
33af0 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73  urn value from s
33b00 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
33b10 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
33b20 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
33b30 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
33b40 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
33b50 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  */.  Pgno pgnoCh
33b60 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
33b70 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
33b80 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68  er of the new ch
33b90 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74  ild page */.  Bt
33ba0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52  Shared *pBt = pR
33bb0 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20  oot->pBt;    /* 
33bc0 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20  The BTree */..  
33bd0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e  assert( pRoot->n
33be0 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20  Overflow>0 );.  
33bf0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
33c00 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
33c10 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
33c20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65 20  Make pRoot, the 
33c30 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
33c40 20 62 2d 74 72 65 65 2c 20 77 72 69 74 61 62 6c   b-tree, writabl
33c50 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  e. Allocate a ne
33c60 77 20 0a 20 20 2a 2a 20 70 61 67 65 20 74 68 61  w .  ** page tha
33c70 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
33c80 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c  e new right-chil
33c90 64 20 6f 66 20 70 50 61 67 65 2e 20 43 6f 70 79  d of pPage. Copy
33ca0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
33cb0 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 73  ** of the node s
33cc0 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69  tored on pRoot i
33cd0 6e 74 6f 20 74 68 65 20 6e 65 77 20 63 68 69 6c  nto the new chil
33ce0 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72  d page..  */.  r
33cf0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
33d00 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
33d10 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Page);.  if( rc=
33d20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33d30 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
33d40 74 72 65 65 50 61 67 65 28 70 42 74 2c 26 70 43  treePage(pBt,&pC
33d50 68 69 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c  hild,&pgnoChild,
33d60 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a  pRoot->pgno,0);.
33d70 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74      copyNodeCont
33d80 65 6e 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c  ent(pRoot, pChil
33d90 64 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  d, &rc);.    if(
33da0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
33db0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
33dc0 28 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c  (pBt, pgnoChild,
33dd0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
33de0 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  Root->pgno, &rc)
33df0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
33e00 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 70 43  ( rc ){.    *ppC
33e10 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72 65  hild = 0;.    re
33e20 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64  leasePage(pChild
33e30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
33e40 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
33e50 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
33e60 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e  iteable(pChild->
33e70 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
33e80 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
33e90 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 52  erIswriteable(pR
33ea0 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  oot->pDbPage) );
33eb0 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c  .  assert( pChil
33ec0 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d  d->nCell==pRoot-
33ed0 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41  >nCell );..  TRA
33ee0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f  CE(("BALANCE: co
33ef0 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20  py root %d into 
33f00 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67  %d\n", pRoot->pg
33f10 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  no, pChild->pgno
33f20 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74  ));..  /* Copy t
33f30 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
33f40 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20  s from pRoot to 
33f50 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63  pChild */.  memc
33f60 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c  py(pChild->aOvfl
33f70 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20  , pRoot->aOvfl, 
33f80 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pRoot->nOverflow
33f90 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e 61  *sizeof(pRoot->a
33fa0 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68  Ovfl[0]));.  pCh
33fb0 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ild->nOverflow =
33fc0 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f   pRoot->nOverflo
33fd0 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68  w;..  /* Zero th
33fe0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 52  e contents of pR
33ff0 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73 74 61 6c  oot. Then instal
34000 6c 20 70 43 68 69 6c 64 20 61 73 20 74 68 65 20  l pChild as the 
34010 72 69 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a  right-child. */.
34020 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74    zeroPage(pRoot
34030 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b  , pChild->aData[
34040 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b  0] & ~PTF_LEAF);
34050 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 52 6f  .  put4byte(&pRo
34060 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
34070 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
34080 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a 70  gnoChild);..  *p
34090 70 43 68 69 6c 64 20 3d 20 70 43 68 69 6c 64 3b  pChild = pChild;
340a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
340b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
340c0 65 20 70 61 67 65 20 74 68 61 74 20 70 43 75 72  e page that pCur
340d0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
340e0 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65  s to has just be
340f0 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a  en modified in.*
34100 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73  * some way. This
34110 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65   function figure
34120 73 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f  s out if this mo
34130 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73  dification means
34140 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65   the.** tree nee
34150 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65  ds to be balance
34160 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c  d, and if so cal
34170 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ls the appropria
34180 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a  te balancing .**
34190 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e 63   routine. Balanc
341a0 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ing routines are
341b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e 63  :.**.**   balanc
341c0 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20 62  e_quick().**   b
341d0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 0a  alance_deeper().
341e0 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  **   balance_non
341f0 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61 74 69 63  root().*/.static
34200 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43   int balance(BtC
34210 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
34220 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
34230 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  OK;.  const int 
34240 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42 74  nMin = pCur->pBt
34250 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2a 20 32  ->usableSize * 2
34260 20 2f 20 33 3b 0a 20 20 75 38 20 61 42 61 6c 61   / 3;.  u8 aBala
34270 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 31 33  nceQuickSpace[13
34280 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d  ];.  u8 *pFree =
34290 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59 28   0;..  TESTONLY(
342a0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69   int balance_qui
342b0 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b  ck_called = 0 );
342c0 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74  .  TESTONLY( int
342d0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f   balance_deeper_
342e0 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a 20  called = 0 );.. 
342f0 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69 50   do {.    int iP
34300 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
34310 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  e;.    MemPage *
34320 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
34330 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20 20  Page[iPage];..  
34340 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29    if( iPage==0 )
34350 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
34360 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  e->nOverflow ){.
34370 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
34380 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
34390 62 2d 74 72 65 65 20 69 73 20 6f 76 65 72 66 75  b-tree is overfu
343a0 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ll. In this case
343b0 20 63 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 20   call the.      
343c0 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65 65    ** balance_dee
343d0 70 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  per() function t
343e0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 63  o create a new c
343f0 68 69 6c 64 20 66 6f 72 20 74 68 65 20 72 6f 6f  hild for the roo
34400 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  t-page.        *
34410 2a 20 61 6e 64 20 63 6f 70 79 20 74 68 65 20 63  * and copy the c
34420 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
34430 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  of the root-page
34440 20 74 6f 20 69 74 2e 20 54 68 65 0a 20 20 20 20   to it. The.    
34450 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72      ** next iter
34460 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
34470 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63  loop will balanc
34480 65 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  e the child page
34490 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20  ..        */ .  
344a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 62        assert( (b
344b0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61  alance_deeper_ca
344c0 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20  lled++)==0 );.  
344d0 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
344e0 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65 2c  ce_deeper(pPage,
344f0 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31   &pCur->apPage[1
34500 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
34510 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34520 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
34530 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20  >iPage = 1;.    
34540 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
34550 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  x[0] = 0;.      
34560 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
34570 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  1] = 0;.        
34580 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
34590 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72  apPage[1]->nOver
345a0 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20 20 20 20  flow );.        
345b0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
345c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
345d0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
345e0 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
345f0 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65  flow==0 && pPage
34600 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b  ->nFree<=nMin ){
34610 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
34620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d    }else{.      M
34630 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73 74 20 70  emPage * const p
34640 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61  Parent = pCur->a
34650 70 50 61 67 65 5b 69 50 61 67 65 2d 31 5d 3b 0a  pPage[iPage-1];.
34660 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20        int const 
34670 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49  iIdx = pCur->aiI
34680 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a 20 20  dx[iPage-1];..  
34690 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
346a0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72 65  PagerWrite(pPare
346b0 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
346c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
346d0 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64 65 66  TE_OK ){.#ifndef
346e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
346f0 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20 20 20 20  CKBALANCE.      
34700 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
34710 44 61 74 61 0a 20 20 20 20 20 20 20 20 20 26 26  Data.         &&
34720 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
34730 77 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26  w==1.         &&
34740 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d   pPage->aOvfl[0]
34750 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  .idx==pPage->nCe
34760 6c 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ll.         && p
34770 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a  Parent->pgno!=1.
34780 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72           && pPar
34790 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78  ent->nCell==iIdx
347a0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
347b0 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 62 61        /* Call ba
347c0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 74 6f  lance_quick() to
347d0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 73 69   create a new si
347e0 62 6c 69 6e 67 20 6f 66 20 70 50 61 67 65 20 6f  bling of pPage o
347f0 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
34800 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68    ** to store th
34810 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e  e overflow cell.
34820 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
34830 20 69 6e 73 65 72 74 73 20 61 20 6e 65 77 20 63   inserts a new c
34840 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ell.          **
34850 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2c 20 77   into pParent, w
34860 68 69 63 68 20 6d 61 79 20 63 61 75 73 65 20 70  hich may cause p
34870 50 61 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 2e  Parent overflow.
34880 20 49 66 20 74 68 69 73 0a 20 20 20 20 20 20 20   If this.       
34890 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74     ** happens, t
348a0 68 65 20 6e 65 78 74 20 69 6e 74 65 72 61 74 69  he next interati
348b0 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f  on of the do-loo
348c0 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 70  p will balance p
348d0 50 61 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20  Parent .        
348e0 20 20 2a 2a 20 75 73 65 20 65 69 74 68 65 72 20    ** use either 
348f0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
34900 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f 64 65 65  ) or balance_dee
34910 70 65 72 28 29 2e 20 55 6e 74 69 6c 20 74 68 69  per(). Until thi
34920 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  s.          ** h
34930 61 70 70 65 6e 73 2c 20 74 68 65 20 6f 76 65 72  appens, the over
34940 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 73 74 6f  flow cell is sto
34950 72 65 64 20 69 6e 20 74 68 65 20 61 42 61 6c 61  red in the aBala
34960 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 0a  nceQuickSpace[].
34970 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
34980 66 65 72 2e 20 0a 20 20 20 20 20 20 20 20 20 20  fer. .          
34990 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
349a0 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74  The purpose of t
349b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
349c0 65 72 74 28 29 20 69 73 20 74 6f 20 63 68 65 63  ert() is to chec
349d0 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61 0a 20 20  k that only a.  
349e0 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c          ** singl
349f0 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63  e call to balanc
34a00 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 61 64  e_quick() is mad
34a10 65 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20  e for each call 
34a20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  to this.        
34a30 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 49    ** function. I
34a40 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f 74 20  f this were not 
34a50 76 65 72 69 66 69 65 64 2c 20 61 20 73 75 62 74  verified, a subt
34a60 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76 69 6e 67  le bug involving
34a70 20 72 65 75 73 65 0a 20 20 20 20 20 20 20 20 20   reuse.         
34a80 20 2a 2a 20 6f 66 20 74 68 65 20 61 42 61 6c 61   ** of the aBala
34a90 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 20  nceQuickSpace[] 
34aa0 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 2e 0a  might sneak in..
34ab0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
34ac0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
34ad0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61  balance_quick_ca
34ae0 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20  lled++)==0 );.  
34af0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
34b00 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 72 65  ance_quick(pPare
34b10 6e 74 2c 20 70 50 61 67 65 2c 20 61 42 61 6c 61  nt, pPage, aBala
34b20 6e 63 65 51 75 69 63 6b 53 70 61 63 65 29 3b 0a  nceQuickSpace);.
34b30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
34b40 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
34b50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74           /* In t
34b60 68 69 73 20 63 61 73 65 2c 20 63 61 6c 6c 20 62  his case, call b
34b70 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
34b80 20 74 6f 20 72 65 64 69 73 74 72 69 62 75 74 65   to redistribute
34b90 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20   cells.         
34ba0 20 2a 2a 20 62 65 74 77 65 65 6e 20 70 50 61 67   ** between pPag
34bb0 65 20 61 6e 64 20 75 70 20 74 6f 20 32 20 6f 66  e and up to 2 of
34bc0 20 69 74 73 20 73 69 62 6c 69 6e 67 20 70 61 67   its sibling pag
34bd0 65 73 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76 65  es. This involve
34be0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d  s.          ** m
34bf0 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
34c00 74 65 6e 74 73 20 6f 66 20 70 50 61 72 65 6e 74  tents of pParent
34c10 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75 73  , which may caus
34c20 65 20 70 50 61 72 65 6e 74 20 74 6f 0a 20 20 20  e pParent to.   
34c30 20 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65         ** become
34c40 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64   overfull or und
34c50 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e 65 78 74  erfull. The next
34c60 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
34c70 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20 20  e do-loop.      
34c80 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 61 6c 61      ** will bala
34c90 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  nce the parent p
34ca0 61 67 65 20 74 6f 20 63 6f 72 72 65 63 74 20 74  age to correct t
34cb0 68 69 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  his..          *
34cc0 2a 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  * .          ** 
34cd0 49 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  If the parent pa
34ce0 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66  ge becomes overf
34cf0 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f  ull, the overflo
34d00 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a  w cell or cells.
34d10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65            ** are
34d20 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70   stored in the p
34d30 53 70 61 63 65 20 62 75 66 66 65 72 20 61 6c 6c  Space buffer all
34d40 6f 63 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65  ocated immediate
34d50 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20 20 20 20  ly below. .     
34d60 20 20 20 20 20 2a 2a 20 41 20 73 75 62 73 65 71       ** A subseq
34d70 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  uent iteration o
34d80 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69  f the do-loop wi
34d90 6c 6c 20 64 65 61 6c 20 77 69 74 68 20 74 68 69  ll deal with thi
34da0 73 20 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a  s by.          *
34db0 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c 61 6e 63  * calling balanc
34dc0 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28 62 61 6c  e_nonroot() (bal
34dd0 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 6d 61  ance_deeper() ma
34de0 79 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73  y be called firs
34df0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t,.          ** 
34e00 62 75 74 20 69 74 20 64 6f 65 73 6e 27 74 20 64  but it doesn't d
34e10 65 61 6c 20 77 69 74 68 20 6f 76 65 72 66 6c 6f  eal with overflo
34e20 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73 74 20 6d  w cells - just m
34e30 6f 76 65 73 20 74 68 65 6d 20 74 6f 20 61 0a 20  oves them to a. 
34e40 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 66 66           ** diff
34e50 65 72 65 6e 74 20 70 61 67 65 29 2e 20 4f 6e 63  erent page). Onc
34e60 65 20 74 68 69 73 20 73 75 62 73 65 71 75 65 6e  e this subsequen
34e70 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63  t call to balanc
34e80 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20 20 20  e_nonroot() .   
34e90 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 63 6f         ** has co
34ea0 6d 70 6c 65 74 65 64 2c 20 69 74 20 69 73 20 73  mpleted, it is s
34eb0 61 66 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74  afe to release t
34ec0 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
34ed0 20 75 73 65 64 20 62 79 0a 20 20 20 20 20 20 20   used by.       
34ee0 20 20 20 2a 2a 20 74 68 65 20 70 72 65 76 69 6f     ** the previo
34ef0 75 73 20 63 61 6c 6c 2c 20 61 73 20 74 68 65 20  us call, as the 
34f00 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 64 61  overflow cell da
34f10 74 61 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ta will have bee
34f20 6e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  n .          ** 
34f30 63 6f 70 69 65 64 20 65 69 74 68 65 72 20 69 6e  copied either in
34f40 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  to the body of a
34f50 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6f   database page o
34f60 72 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  r into the new. 
34f70 20 20 20 20 20 20 20 20 20 2a 2a 20 70 53 70 61           ** pSpa
34f80 63 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ce buffer passed
34f90 20 74 6f 20 74 68 65 20 6c 61 74 74 65 72 20 63   to the latter c
34fa0 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e  all to balance_n
34fb0 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20 20 20 20  onroot()..      
34fc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
34fd0 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 73 71   u8 *pSpace = sq
34fe0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
34ff0 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53  pCur->pBt->pageS
35000 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
35010 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  rc = balance_non
35020 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c 20 69 49  root(pParent, iI
35030 64 78 2c 20 70 53 70 61 63 65 2c 20 69 50 61 67  dx, pSpace, iPag
35040 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20 20 20 20  e==1);.         
35050 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20   if( pFree ){.  
35060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
35070 70 46 72 65 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pFree is not NUL
35080 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  L, it points to 
35090 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
350a0 72 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  r used .        
350b0 20 20 20 20 2a 2a 20 62 79 20 61 20 70 72 65 76      ** by a prev
350c0 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62 61 6c  ious call to bal
350d0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 20  ance_nonroot(). 
350e0 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  Its contents are
350f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
35100 6e 6f 77 20 73 74 6f 72 65 64 20 65 69 74 68 65  now stored eithe
35110 72 20 6f 6e 20 72 65 61 6c 20 64 61 74 61 62 61  r on real databa
35120 73 65 20 70 61 67 65 73 20 6f 72 20 77 69 74 68  se pages or with
35130 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  in the .        
35140 20 20 20 20 2a 2a 20 6e 65 77 20 70 53 70 61 63      ** new pSpac
35150 65 20 62 75 66 66 65 72 2c 20 73 6f 20 69 74 20  e buffer, so it 
35160 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20 66 72  may be safely fr
35170 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  eed here. */.   
35180 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
35190 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29 3b  PageFree(pFree);
351a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
351b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
351c0 53 70 61 63 65 20 62 75 66 66 65 72 20 77 69 6c  Space buffer wil
351d0 6c 20 62 65 20 66 72 65 65 64 20 61 66 74 65 72  l be freed after
351e0 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
351f0 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  o.          ** b
35200 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
35210 2c 20 6f 72 20 6a 75 73 74 20 62 65 66 6f 72 65  , or just before
35220 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
35230 65 74 75 72 6e 73 2c 20 77 68 69 63 68 65 76 65  eturns, whicheve
35240 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
35250 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a 2f 0a 20  omes first. */. 
35260 20 20 20 20 20 20 20 20 20 70 46 72 65 65 20 3d           pFree =
35270 20 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20   pSpace;.       
35280 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
35290 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
352a0 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  ow = 0;..      /
352b0 2a 20 54 68 65 20 6e 65 78 74 20 69 74 65 72 61  * The next itera
352c0 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
352d0 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20 74 68 65  oop balances the
352e0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f   parent page. */
352f0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
35300 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
35310 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
35320 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
35330 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
35340 0a 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b  ..  if( pFree ){
35350 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
35360 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 7d  Free(pFree);.  }
35370 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
35380 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
35390 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
353a0 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65   the BTree.  The
353b0 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79   key is given by
353c0 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20   (pKey,nKey).** 
353d0 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20  and the data is 
353e0 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c  given by (pData,
353f0 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72  nData).  The cur
35400 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  sor is used only
35410 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68   to.** define wh
35420 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63  at table the rec
35430 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ord should be in
35440 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68  serted into.  Th
35450 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
35460 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
35470 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f  a random locatio
35480 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  n..**.** For an 
35490 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e  INTKEY table, on
354a0 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75  ly the nKey valu
354b0 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20  e of the key is 
354c0 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a  used.  pKey is.*
354d0 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20  * ignored.  For 
354e0 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65  a ZERODATA table
354f0 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20  , the pData and 
35500 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69  nData are both i
35510 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
35520 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20   the seekResult 
35530 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
35540 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 75  -zero, then a su
35550 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f  ccessful call to
35560 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  .** MovetoUnpack
35570 65 64 28 29 20 74 6f 20 73 65 65 6b 20 63 75 72  ed() to seek cur
35580 73 6f 72 20 70 43 75 72 20 74 6f 20 28 70 4b 65  sor pCur to (pKe
35590 79 2c 20 6e 4b 65 79 29 20 68 61 73 20 61 6c 72  y, nKey) has alr
355a0 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65 72  eady.** been per
355b0 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65 73 75  formed. seekResu
355c0 6c 74 20 69 73 20 74 68 65 20 73 65 61 72 63 68  lt is the search
355d0 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64   result returned
355e0 20 28 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20   (a negative.** 
355f0 6e 75 6d 62 65 72 20 69 66 20 70 43 75 72 20 70  number if pCur p
35600 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 6e 74 72  oints at an entr
35610 79 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 65  y that is smalle
35620 72 20 74 68 61 6e 20 28 70 4b 65 79 2c 20 6e 4b  r than (pKey, nK
35630 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f 73  ey), or.** a pos
35640 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 70  itive value if p
35650 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
35660 20 65 74 72 79 20 74 68 61 74 20 69 73 20 6c 61   etry that is la
35670 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20 28 70  rger than .** (p
35680 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a  Key, nKey)). .**
35690 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52  .** If the seekR
356a0 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20  esult parameter 
356b0 69 73 20 30 2c 20 74 68 65 6e 20 63 75 72 73 6f  is 0, then curso
356c0 72 20 70 43 75 72 20 6d 61 79 20 70 6f 69 6e 74  r pCur may point
356d0 20 74 6f 20 61 6e 79 20 0a 2a 2a 20 65 6e 74 72   to any .** entr
356e0 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74 72 79  y or to no entry
356f0 20 61 74 20 61 6c 6c 2e 20 49 6e 20 74 68 69 73   at all. In this
35700 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74   case this funct
35710 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 65 6b 0a  ion has to seek.
35720 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  ** the cursor be
35730 66 6f 72 65 20 74 68 65 20 6e 65 77 20 6b 65 79  fore the new key
35740 20 63 61 6e 20 62 65 20 69 6e 73 65 72 74 65 64   can be inserted
35750 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
35760 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42  BtreeInsert(.  B
35770 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
35780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35790 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74   Insert data int
357a0 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74  o the table of t
357b0 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  his cursor */.  
357c0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
357d0 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
357e0 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65  * The key of the
357f0 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
35800 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
35810 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20  ta, int nData,  
35820 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20 74  /* The data of t
35830 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
35840 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
35850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35860 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
35870 78 74 72 61 20 30 20 62 79 74 65 73 20 74 6f 20  xtra 0 bytes to 
35880 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a  append to data *
35890 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69  /.  int appendBi
358a0 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  as,             
358b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
358c0 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20  is is likely an 
358d0 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  append */.  int 
358e0 73 65 65 6b 52 65 73 75 6c 74 20 20 20 20 20 20  seekResult      
358f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
35900 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 4d 6f  sult of prior Mo
35910 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 63  vetoUnpacked() c
35920 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  all */.){.  int 
35930 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20 3d 20  rc;.  int loc = 
35940 73 65 65 6b 52 65 73 75 6c 74 3b 0a 20 20 69 6e  seekResult;.  in
35950 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t szNew;.  int i
35960 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
35970 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70  Page;.  Btree *p
35980 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
35990 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
359a0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73   = p->pBt;.  uns
359b0 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43  igned char *oldC
359c0 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ell;.  unsigned 
359d0 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20  char *newCell = 
359e0 30 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  0;..  if( pCur->
359f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
35a00 41 55 4c 54 20 29 7b 0a 20 20 20 20 61 73 73 65  AULT ){.    asse
35a10 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
35a20 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
35a30 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
35a40 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
35a50 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
35a60 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
35a70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
35a80 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70  Cur->wrFlag && p
35a90 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
35aa0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
35ab0 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  & !pBt->readOnly
35ac0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 61   );.  assert( ha
35ad0 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
35ae0 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70  eLock(p, pCur->p
35af0 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70  gnoRoot, pCur->p
35b00 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29  KeyInfo!=0, 2) )
35b10 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
35b20 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
35b30 61 73 20 62 65 65 6e 20 63 6f 6e 73 69 73 74 65  as been consiste
35b40 6e 74 2e 20 49 66 20 74 68 69 73 20 63 75 72 73  nt. If this curs
35b50 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 0a 20 20  or was opened.  
35b60 2a 2a 20 65 78 70 65 63 74 69 6e 67 20 61 6e 20  ** expecting an 
35b70 69 6e 64 65 78 20 62 2d 74 72 65 65 2c 20 74 68  index b-tree, th
35b80 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 73 68  en the caller sh
35b90 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 69 6e  ould be insertin
35ba0 67 20 62 6c 6f 62 0a 20 20 2a 2a 20 6b 65 79 73  g blob.  ** keys
35bb0 20 77 69 74 68 20 6e 6f 20 61 73 73 6f 63 69 61   with no associa
35bc0 74 65 64 20 64 61 74 61 2e 20 49 66 20 74 68 65  ted data. If the
35bd0 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
35be0 65 64 20 65 78 70 65 63 74 69 6e 67 20 61 6e 0a  ed expecting an.
35bf0 20 20 2a 2a 20 69 6e 74 6b 65 79 20 74 61 62 6c    ** intkey tabl
35c00 65 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 73 68  e, the caller sh
35c10 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 69 6e  ould be insertin
35c20 67 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20 77  g integer keys w
35c30 69 74 68 20 61 0a 20 20 2a 2a 20 62 6c 6f 62 20  ith a.  ** blob 
35c40 6f 66 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  of associated da
35c50 74 61 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ta.  */.  assert
35c60 28 20 28 70 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  ( (pKey==0)==(pC
35c70 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
35c80 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
35c90 73 20 69 73 20 61 6e 20 69 6e 73 65 72 74 20 69  s is an insert i
35ca0 6e 74 6f 20 61 20 74 61 62 6c 65 20 62 2d 74 72  nto a table b-tr
35cb0 65 65 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61  ee, invalidate a
35cc0 6e 79 20 69 6e 63 72 62 6c 6f 62 20 0a 20 20 2a  ny incrblob .  *
35cd0 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  * cursors open o
35ce0 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20  n the row being 
35cf0 72 65 70 6c 61 63 65 64 20 28 61 73 73 75 6d 69  replaced (assumi
35d00 6e 67 20 74 68 69 73 20 69 73 20 61 20 72 65 70  ng this is a rep
35d10 6c 61 63 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  lace.  ** operat
35d20 69 6f 6e 20 2d 20 69 66 20 69 74 20 69 73 20 6e  ion - if it is n
35d30 6f 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ot, the followin
35d40 67 20 69 73 20 61 20 6e 6f 2d 6f 70 29 2e 20 20  g is a no-op).  
35d50 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  */.  if( pCur->p
35d60 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  KeyInfo==0 ){.  
35d70 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72    invalidateIncr
35d80 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c 20 70  blobCursors(p, p
35d90 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e  Cur->pgnoRoot, n
35da0 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  Key, 0);.  }..  
35db0 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  /* Save the posi
35dc0 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68  tions of any oth
35dd0 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  er cursors open 
35de0 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 0a 20  on this table.. 
35df0 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d 65   **.  ** In some
35e00 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c   cases, the call
35e10 20 74 6f 20 62 74 72 65 65 4d 6f 76 65 74 6f 28   to btreeMoveto(
35e20 29 20 62 65 6c 6f 77 20 69 73 20 61 20 6e 6f 2d  ) below is a no-
35e30 6f 70 2e 20 46 6f 72 0a 20 20 2a 2a 20 65 78 61  op. For.  ** exa
35e40 6d 70 6c 65 2c 20 77 68 65 6e 20 69 6e 73 65 72  mple, when inser
35e50 74 69 6e 67 20 64 61 74 61 20 69 6e 74 6f 20 61  ting data into a
35e60 20 74 61 62 6c 65 20 77 69 74 68 20 61 75 74 6f   table with auto
35e70 2d 67 65 6e 65 72 61 74 65 64 20 69 6e 74 65 67  -generated integ
35e80 65 72 0a 20 20 2a 2a 20 6b 65 79 73 2c 20 74 68  er.  ** keys, th
35e90 65 20 56 44 42 45 20 6c 61 79 65 72 20 69 6e 76  e VDBE layer inv
35ea0 6f 6b 65 73 20 73 71 6c 69 74 65 33 42 74 72 65  okes sqlite3Btre
35eb0 65 4c 61 73 74 28 29 20 74 6f 20 66 69 67 75 72  eLast() to figur
35ec0 65 20 6f 75 74 20 74 68 65 20 0a 20 20 2a 2a 20  e out the .  ** 
35ed0 69 6e 74 65 67 65 72 20 6b 65 79 20 74 6f 20 75  integer key to u
35ee0 73 65 2e 20 49 74 20 74 68 65 6e 20 63 61 6c 6c  se. It then call
35ef0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
35f00 74 6f 20 61 63 74 75 61 6c 6c 79 20 69 6e 73 65  to actually inse
35f10 72 74 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74  rt the .  ** dat
35f20 61 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 6b 65  a into the intke
35f30 79 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69  y B-Tree. In thi
35f40 73 20 63 61 73 65 20 62 74 72 65 65 4d 6f 76 65  s case btreeMove
35f50 74 6f 28 29 20 72 65 63 6f 67 6e 69 7a 65 73 0a  to() recognizes.
35f60 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75    ** that the cu
35f70 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
35f80 77 68 65 72 65 20 69 74 20 6e 65 65 64 73 20 74  where it needs t
35f90 6f 20 62 65 20 61 6e 64 20 72 65 74 75 72 6e 73  o be and returns
35fa0 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 64 6f   without.  ** do
35fb0 69 6e 67 20 61 6e 79 20 77 6f 72 6b 2e 20 54 6f  ing any work. To
35fc0 20 61 76 6f 69 64 20 74 68 77 61 72 74 69 6e 67   avoid thwarting
35fd0 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74   these optimizat
35fe0 69 6f 6e 73 2c 20 69 74 20 69 73 20 69 6d 70 6f  ions, it is impo
35ff0 72 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20 74  rtant.  ** not t
36000 6f 20 63 6c 65 61 72 20 74 68 65 20 63 75 72 73  o clear the curs
36010 6f 72 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  or here..  */.  
36020 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
36030 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
36040 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 3b 0a  gnoRoot, pCur);.
36050 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
36060 6e 20 72 63 3b 0a 20 20 69 66 28 20 21 6c 6f 63  n rc;.  if( !loc
36070 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
36080 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
36090 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e  Key, nKey, appen
360a0 64 42 69 61 73 2c 20 26 6c 6f 63 29 3b 0a 20 20  dBias, &loc);.  
360b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
360c0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
360d0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
360e0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
360f0 7c 20 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  | (pCur->eState=
36100 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
36110 26 26 20 6c 6f 63 29 20 29 3b 0a 0a 20 20 70 50  && loc) );..  pP
36120 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
36130 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
36140 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36150 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79  ->intKey || nKey
36160 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
36170 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20   pPage->leaf || 
36180 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  !pPage->intKey )
36190 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53  ;..  TRACE(("INS
361a0 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b  ERT: table=%d nk
361b0 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64  ey=%lld ndata=%d
361c0 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a   page=%d %s\n",.
361d0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
361e0 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20  pgnoRoot, nKey, 
361f0 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67  nData, pPage->pg
36200 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f  no,.          lo
36210 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74  c==0 ? "overwrit
36220 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22  e" : "new entry"
36230 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
36240 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
36250 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
36260 63 65 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65  ce(pBt);.  newCe
36270 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70  ll = pBt->pTmpSp
36280 61 63 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65  ace;.  if( newCe
36290 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
362a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72  QLITE_NOMEM;.  r
362b0 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70  c = fillInCell(p
362c0 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70  Page, newCell, p
362d0 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61  Key, nKey, pData
362e0 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20  , nData, nZero, 
362f0 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72  &szNew);.  if( r
36300 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
36310 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ert;.  assert( s
36320 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  zNew==cellSizePt
36330 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c  r(pPage, newCell
36340 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
36350 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49  zNew<=MX_CELL_SI
36360 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 64 78  ZE(pBt) );.  idx
36370 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
36380 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
36390 66 28 20 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20  f( loc==0 ){.   
363a0 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20   u16 szOld;.    
363b0 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61 67  assert( idx<pPag
363c0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
363d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
363e0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
363f0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
36400 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  rc ){.      goto
36410 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
36420 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d   }.    oldCell =
36430 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
36440 20 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21   idx);.    if( !
36450 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
36460 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43       memcpy(newC
36470 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29  ell, oldCell, 4)
36480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c  ;.    }.    szOl
36490 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  d = cellSizePtr(
364a0 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
364b0 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43  .    rc = clearC
364c0 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65  ell(pPage, oldCe
364d0 6c 6c 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  ll);.    dropCel
364e0 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 73 7a  l(pPage, idx, sz
364f0 4f 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  Old, &rc);.    i
36500 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
36510 5f 69 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65  _insert;.  }else
36520 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50   if( loc<0 && pP
36530 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  age->nCell>0 ){.
36540 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
36550 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 69  e->leaf );.    i
36560 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
36570 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
36580 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
36590 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
365a0 66 20 29 3b 0a 20 20 7d 0a 20 20 69 6e 73 65 72  f );.  }.  inser
365b0 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  tCell(pPage, idx
365c0 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77  , newCell, szNew
365d0 2c 20 30 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  , 0, 0, &rc);.  
365e0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
365f0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 2d 3e  TE_OK || pPage->
36600 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50 61 67 65  nCell>0 || pPage
36610 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b  ->nOverflow>0 );
36620 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 72 72  ..  /* If no err
36630 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 61  or has occured a
36640 6e 64 20 70 50 61 67 65 20 68 61 73 20 61 6e 20  nd pPage has an 
36650 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 63  overflow cell, c
36660 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29 20 0a 20  all balance() . 
36670 20 2a 2a 20 74 6f 20 72 65 64 69 73 74 72 69 62   ** to redistrib
36680 75 74 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69  ute the cells wi
36690 74 68 69 6e 20 74 68 65 20 74 72 65 65 2e 20 53  thin the tree. S
366a0 69 6e 63 65 20 62 61 6c 61 6e 63 65 28 29 20 6d  ince balance() m
366b0 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65  ay move.  ** the
366c0 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f 20 74 68   cursor, zero th
366d0 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 2e  e BtCursor.info.
366e0 6e 53 69 7a 65 20 61 6e 64 20 42 74 43 75 72 73  nSize and BtCurs
366f0 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a 20 20 2a  or.validNKey.  *
36700 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a  * variables..  *
36710 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f 75 73 20  *.  ** Previous 
36720 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
36730 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76 65 54 6f  te called moveTo
36740 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76 65 20 74  Root() to move t
36750 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 62  he cursor.  ** b
36760 61 63 6b 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  ack to the root 
36770 70 61 67 65 20 61 73 20 62 61 6c 61 6e 63 65 28  page as balance(
36780 29 20 75 73 65 64 20 74 6f 20 69 6e 76 61 6c 69  ) used to invali
36790 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  date the content
367a0 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43 75 72 73  s.  ** of BtCurs
367b0 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  or.apPage[] and 
367c0 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 5b 5d  BtCursor.aiIdx[]
367d0 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 6f 69  . Instead of doi
367e0 6e 67 20 74 68 61 74 2c 0a 20 20 2a 2a 20 73 65  ng that,.  ** se
367f0 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  t the cursor sta
36800 74 65 20 74 6f 20 22 69 6e 76 61 6c 69 64 22 2e  te to "invalid".
36810 20 54 68 69 73 20 6d 61 6b 65 73 20 63 6f 6d 6d   This makes comm
36820 6f 6e 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  on insert operat
36830 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c 69 67 68 74  ions.  ** slight
36840 6c 79 20 66 61 73 74 65 72 2e 0a 20 20 2a 2a 0a  ly faster..  **.
36850 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
36860 73 75 62 74 6c 65 20 62 75 74 20 69 6d 70 6f 72  subtle but impor
36870 74 61 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tant optimizatio
36880 6e 20 68 65 72 65 20 74 6f 6f 2e 20 57 68 65 6e  n here too. When
36890 20 69 6e 73 65 72 74 69 6e 67 0a 20 20 2a 2a 20   inserting.  ** 
368a0 6d 75 6c 74 69 70 6c 65 20 72 65 63 6f 72 64 73  multiple records
368b0 20 69 6e 74 6f 20 61 6e 20 69 6e 74 6b 65 79 20   into an intkey 
368c0 62 2d 74 72 65 65 20 75 73 69 6e 67 20 61 20 73  b-tree using a s
368d0 69 6e 67 6c 65 20 63 75 72 73 6f 72 20 28 61 73  ingle cursor (as
368e0 20 63 61 6e 0a 20 20 2a 2a 20 68 61 70 70 65 6e   can.  ** happen
368f0 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e   while processin
36900 67 20 61 6e 20 22 49 4e 53 45 52 54 20 49 4e 54  g an "INSERT INT
36910 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 22 20 73 74  O ... SELECT" st
36920 61 74 65 6d 65 6e 74 29 2c 20 69 74 0a 20 20 2a  atement), it.  *
36930 2a 20 69 73 20 61 64 76 61 6e 74 61 67 65 6f 75  * is advantageou
36940 73 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 63  s to leave the c
36950 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
36960 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
36970 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74   in.  ** the b-t
36980 72 65 65 20 69 66 20 70 6f 73 73 69 62 6c 65 2e  ree if possible.
36990 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
369a0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
369b0 74 6f 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a  to the last.  **
369c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
369d0 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 6e 65 78  ble, and the nex
369e0 74 20 72 6f 77 20 69 6e 73 65 72 74 65 64 20 68  t row inserted h
369f0 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6b 65  as an integer ke
36a00 79 0a 20 20 2a 2a 20 6c 61 72 67 65 72 20 74 68  y.  ** larger th
36a10 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  an the largest e
36a20 78 69 73 74 69 6e 67 20 6b 65 79 2c 20 69 74 20  xisting key, it 
36a30 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 69  is possible to i
36a40 6e 73 65 72 74 20 74 68 65 0a 20 20 2a 2a 20 72  nsert the.  ** r
36a50 6f 77 20 77 69 74 68 6f 75 74 20 73 65 65 6b 69  ow without seeki
36a60 6e 67 20 74 68 65 20 63 75 72 73 6f 72 2e 20 54  ng the cursor. T
36a70 68 69 73 20 63 61 6e 20 62 65 20 61 20 62 69 67  his can be a big
36a80 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f   performance boo
36a90 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d  st..  */.  pCur-
36aa0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
36ab0 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
36ac0 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  ey = 0;.  if( rc
36ad0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
36ae0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
36af0 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61  ){.    rc = bala
36b00 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20 20 20 20  nce(pCur);..    
36b10 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73 75 72  /* Must make sur
36b20 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 72  e nOverflow is r
36b30 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65 76 65  eset to zero eve
36b40 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e 63 65  n if the balance
36b50 28 29 0a 20 20 20 20 2a 2a 20 66 61 69 6c 73 2e  ().    ** fails.
36b60 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73   Internal data s
36b70 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70 74  tructure corrupt
36b80 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  ion will result 
36b90 6f 74 68 65 72 77 69 73 65 2e 20 0a 20 20 20 20  otherwise. .    
36ba0 2a 2a 20 41 6c 73 6f 2c 20 73 65 74 20 74 68 65  ** Also, set the
36bb0 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 74 6f   cursor state to
36bc0 20 69 6e 76 61 6c 69 64 2e 20 54 68 69 73 20 73   invalid. This s
36bd0 74 6f 70 73 20 73 61 76 65 43 75 72 73 6f 72 50  tops saveCursorP
36be0 6f 73 69 74 69 6f 6e 28 29 0a 20 20 20 20 2a 2a  osition().    **
36bf0 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
36c00 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  save the current
36c10 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65   position of the
36c20 20 63 75 72 73 6f 72 2e 20 20 2a 2f 0a 20 20 20   cursor.  */.   
36c30 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
36c40 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65  ur->iPage]->nOve
36c50 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70  rflow = 0;.    p
36c60 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
36c70 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
36c80 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
36c90 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
36ca0 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Page]->nOverflow
36cb0 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69 6e 73 65  ==0 );..end_inse
36cc0 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  rt:.  return rc;
36cd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
36ce0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
36cf0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
36d00 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
36d10 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66  cursor.** is lef
36d20 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
36d30 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61 74 69  arbitrary locati
36d40 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
36d50 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 42 74  e3BtreeDelete(Bt
36d60 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
36d70 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
36d80 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
36d90 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
36da0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
36db0 20 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20   .  int rc;     
36dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
36de0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d  rn code */.  Mem
36df0 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
36e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e10 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 64 65 6c    /* Page to del
36e20 65 74 65 20 63 65 6c 6c 20 66 72 6f 6d 20 2a 2f  ete cell from */
36e30 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
36e40 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
36e50 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
36e60 65 72 20 74 6f 20 63 65 6c 6c 20 74 6f 20 64 65  er to cell to de
36e70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  lete */.  int iC
36e80 65 6c 6c 49 64 78 3b 20 20 20 20 20 20 20 20 20  ellIdx;         
36e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36ea0 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c 20  * Index of cell 
36eb0 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
36ec0 6e 74 20 69 43 65 6c 6c 44 65 70 74 68 3b 20 20  nt iCellDepth;  
36ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ee0 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f 66 20      /* Depth of 
36ef0 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  node containing 
36f00 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20 20 61 73 73  pCell */ ..  ass
36f10 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
36f20 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
36f30 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
36f40 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
36f50 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
36f60 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
36f70 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72 74  Only );.  assert
36f80 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29  ( pCur->wrFlag )
36f90 3b 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53  ;.  assert( hasS
36fa0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
36fb0 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e  ock(p, pCur->pgn
36fc0 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65  oRoot, pCur->pKe
36fd0 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a  yInfo!=0, 2) );.
36fe0 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
36ff0 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 70  adConflicts(p, p
37000 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29 20 29  Cur->pgnoRoot) )
37010 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  ;..  if( NEVER(p
37020 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
37030 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d 3e 61  >iPage]>=pCur->a
37040 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
37050 65 5d 2d 3e 6e 43 65 6c 6c 29 20 0a 20 20 20 7c  e]->nCell) .   |
37060 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53  | NEVER(pCur->eS
37070 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
37080 49 44 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ID).  ){.    ret
37090 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
370a0 3b 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20  ;  /* Something 
370b0 68 61 73 20 67 6f 6e 65 20 61 77 72 79 2e 20 2a  has gone awry. *
370c0 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  /.  }..  /* If t
370d0 68 69 73 20 69 73 20 61 20 64 65 6c 65 74 65 20  his is a delete 
370e0 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 72 65 6d  operation to rem
370f0 6f 76 65 20 61 20 72 6f 77 20 66 72 6f 6d 20 61  ove a row from a
37100 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 0a 20   table b-tree,. 
37110 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 20 61   ** invalidate a
37120 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ny incrblob curs
37130 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
37140 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65 74 65  row being delete
37150 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  d.  */.  if( pCu
37160 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29  r->pKeyInfo==0 )
37170 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
37180 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
37190 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  p, pCur->pgnoRoo
371a0 74 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  t, pCur->info.nK
371b0 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69  ey, 0);.  }..  i
371c0 43 65 6c 6c 44 65 70 74 68 20 3d 20 70 43 75 72  CellDepth = pCur
371d0 2d 3e 69 50 61 67 65 3b 0a 20 20 69 43 65 6c 6c  ->iPage;.  iCell
371e0 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  Idx = pCur->aiId
371f0 78 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a 20  x[iCellDepth];. 
37200 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
37210 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70 74 68  pPage[iCellDepth
37220 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  ];.  pCell = fin
37230 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
37240 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  llIdx);..  /* If
37250 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
37260 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20 74  ning the entry t
37270 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20  o delete is not 
37280 61 20 6c 65 61 66 20 70 61 67 65 2c 20 6d 6f 76  a leaf page, mov
37290 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  e.  ** the curso
372a0 72 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74  r to the largest
372b0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
372c0 65 65 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  ee that is small
372d0 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 74 68 65  er than.  ** the
372e0 20 65 6e 74 72 79 20 62 65 69 6e 67 20 64 65 6c   entry being del
372f0 65 74 65 64 2e 20 54 68 69 73 20 63 65 6c 6c 20  eted. This cell 
37300 77 69 6c 6c 20 72 65 70 6c 61 63 65 20 74 68 65  will replace the
37310 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
37320 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ted.  ** from th
37330 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e  e internal node.
37340 20 54 68 65 20 27 70 72 65 76 69 6f 75 73 27 20   The 'previous' 
37350 65 6e 74 72 79 20 69 73 20 75 73 65 64 20 66 6f  entry is used fo
37360 72 20 74 68 69 73 20 69 6e 73 74 65 61 64 0a 20  r this instead. 
37370 20 2a 2a 20 6f 66 20 74 68 65 20 27 6e 65 78 74   ** of the 'next
37380 27 20 65 6e 74 72 79 2c 20 61 73 20 74 68 65 20  ' entry, as the 
37390 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
373a0 73 20 61 6c 77 61 79 73 20 61 20 70 61 72 74 20  s always a part 
373b0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 2d  of the.  ** sub-
373c0 74 72 65 65 20 68 65 61 64 65 64 20 62 79 20 74  tree headed by t
373d0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66  he child page of
373e0 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67 20   the cell being 
373f0 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20 6d 61  deleted. This ma
37400 6b 65 73 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69  kes.  ** balanci
37410 6e 67 20 74 68 65 20 74 72 65 65 20 66 6f 6c 6c  ng the tree foll
37420 6f 77 69 6e 67 20 74 68 65 20 64 65 6c 65 74 65  owing the delete
37430 20 6f 70 65 72 61 74 69 6f 6e 20 65 61 73 69 65   operation easie
37440 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  r.  */.  if( !pP
37450 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
37460 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20   int notUsed;.  
37470 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
37480 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
37490 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
374a0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
374b0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
374c0 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
374d0 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63  s of any other c
374e0 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
374f0 68 69 73 20 74 61 62 6c 65 20 62 65 66 6f 72 65  his table before
37500 0a 20 20 2a 2a 20 6d 61 6b 69 6e 67 20 61 6e 79  .  ** making any
37510 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 2e 20   modifications. 
37520 4d 61 6b 65 20 74 68 65 20 70 61 67 65 20 63 6f  Make the page co
37530 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74  ntaining the ent
37540 72 79 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 64  ry to be .  ** d
37550 65 6c 65 74 65 64 20 77 72 69 74 61 62 6c 65 2e  eleted writable.
37560 20 54 68 65 6e 20 66 72 65 65 20 61 6e 79 20 6f   Then free any o
37570 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
37580 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
37590 65 20 0a 20 20 2a 2a 20 65 6e 74 72 79 20 61 6e  e .  ** entry an
375a0 64 20 66 69 6e 61 6c 6c 79 20 72 65 6d 6f 76 65  d finally remove
375b0 20 74 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66   the cell itself
375c0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
375d0 20 70 61 67 65 2e 20 20 0a 20 20 2a 2f 0a 20 20   page.  .  */.  
375e0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
375f0 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
37600 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 3b 0a  gnoRoot, pCur);.
37610 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
37620 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
37630 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
37640 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
37650 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
37660 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 63 6c 65  n rc;.  rc = cle
37670 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  arCell(pPage, pC
37680 65 6c 6c 29 3b 0a 20 20 64 72 6f 70 43 65 6c 6c  ell);.  dropCell
37690 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64 78  (pPage, iCellIdx
376a0 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  , cellSizePtr(pP
376b0 61 67 65 2c 20 70 43 65 6c 6c 29 2c 20 26 72 63  age, pCell), &rc
376c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
376d0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49  turn rc;..  /* I
376e0 66 20 74 68 65 20 63 65 6c 6c 20 64 65 6c 65 74  f the cell delet
376f0 65 64 20 77 61 73 20 6e 6f 74 20 6c 6f 63 61 74  ed was not locat
37700 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 70 61 67  ed on a leaf pag
37710 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  e, then the curs
37720 6f 72 0a 20 20 2a 2a 20 69 73 20 63 75 72 72 65  or.  ** is curre
37730 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
37740 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74   the largest ent
37750 72 79 20 69 6e 20 74 68 65 20 73 75 62 2d 74 72  ry in the sub-tr
37760 65 65 20 68 65 61 64 65 64 0a 20 20 2a 2a 20 62  ee headed.  ** b
37770 79 20 74 68 65 20 63 68 69 6c 64 2d 70 61 67 65  y the child-page
37780 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61   of the cell tha
37790 74 20 77 61 73 20 6a 75 73 74 20 64 65 6c 65 74  t was just delet
377a0 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e 74 65 72  ed from an inter
377b0 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65 2e 20 54  nal.  ** node. T
377c0 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65  he cell from the
377d0 20 6c 65 61 66 20 6e 6f 64 65 20 6e 65 65 64 73   leaf node needs
377e0 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 74 6f 20   to be moved to 
377f0 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a  the internal.  *
37800 2a 20 6e 6f 64 65 20 74 6f 20 72 65 70 6c 61 63  * node to replac
37810 65 20 74 68 65 20 64 65 6c 65 74 65 64 20 63 65  e the deleted ce
37820 6c 6c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  ll.  */.  if( !p
37830 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
37840 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66    MemPage *pLeaf
37850 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
37860 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
37870 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20    int nCell;.   
37880 20 50 67 6e 6f 20 6e 20 3d 20 70 43 75 72 2d 3e   Pgno n = pCur->
37890 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70 74  apPage[iCellDept
378a0 68 2b 31 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  h+1]->pgno;.    
378b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
378c0 54 6d 70 3b 0a 0a 20 20 20 20 70 43 65 6c 6c 20  Tmp;..    pCell 
378d0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61 66  = findCell(pLeaf
378e0 2c 20 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31  , pLeaf->nCell-1
378f0 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 63  );.    nCell = c
37900 65 6c 6c 53 69 7a 65 50 74 72 28 70 4c 65 61 66  ellSizePtr(pLeaf
37910 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 61 73  , pCell);.    as
37920 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49  sert( MX_CELL_SI
37930 5a 45 28 70 42 74 29 3e 3d 6e 43 65 6c 6c 20 29  ZE(pBt)>=nCell )
37940 3b 0a 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54  ;..    allocateT
37950 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
37960 20 20 20 70 54 6d 70 20 3d 20 70 42 74 2d 3e 70     pTmp = pBt->p
37970 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 20 20 72  TmpSpace;..    r
37980 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
37990 57 72 69 74 65 28 70 4c 65 61 66 2d 3e 70 44 62  Write(pLeaf->pDb
379a0 50 61 67 65 29 3b 0a 20 20 20 20 69 6e 73 65 72  Page);.    inser
379b0 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  tCell(pPage, iCe
379c0 6c 6c 49 64 78 2c 20 70 43 65 6c 6c 2d 34 2c 20  llIdx, pCell-4, 
379d0 6e 43 65 6c 6c 2b 34 2c 20 70 54 6d 70 2c 20 6e  nCell+4, pTmp, n
379e0 2c 20 26 72 63 29 3b 0a 20 20 20 20 64 72 6f 70  , &rc);.    drop
379f0 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61  Cell(pLeaf, pLea
37a00 66 2d 3e 6e 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c  f->nCell-1, nCel
37a10 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  l, &rc);.    if(
37a20 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
37a30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 61 6c 61 6e  .  }..  /* Balan
37a40 63 65 20 74 68 65 20 74 72 65 65 2e 20 49 66 20  ce the tree. If 
37a50 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74 65  the entry delete
37a60 64 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e  d was located on
37a70 20 61 20 6c 65 61 66 20 70 61 67 65 2c 0a 20 20   a leaf page,.  
37a80 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  ** then the curs
37a90 6f 72 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20  or still points 
37aa0 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 49 6e  to that page. In
37ab0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66   this case the f
37ac0 69 72 73 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74  irst.  ** call t
37ad0 6f 20 62 61 6c 61 6e 63 65 28 29 20 72 65 70 61  o balance() repa
37ae0 69 72 73 20 74 68 65 20 74 72 65 65 2c 20 61 6e  irs the tree, an
37af0 64 20 74 68 65 20 69 66 28 2e 2e 2e 29 20 63 6f  d the if(...) co
37b00 6e 64 69 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  ndition is.  ** 
37b10 6e 65 76 65 72 20 74 72 75 65 2e 0a 20 20 2a 2a  never true..  **
37b20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
37b30 20 69 66 20 74 68 65 20 65 6e 74 72 79 20 64 65   if the entry de
37b40 6c 65 74 65 64 20 77 61 73 20 6f 6e 20 61 6e 20  leted was on an 
37b50 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 70 61  internal node pa
37b60 67 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 70 43  ge, then.  ** pC
37b70 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  ur is pointing t
37b80 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  o the leaf page 
37b90 66 72 6f 6d 20 77 68 69 63 68 20 61 20 63 65 6c  from which a cel
37ba0 6c 20 77 61 73 20 72 65 6d 6f 76 65 64 20 74 6f  l was removed to
37bb0 0a 20 20 2a 2a 20 72 65 70 6c 61 63 65 20 74 68  .  ** replace th
37bc0 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20 66  e cell deleted f
37bd0 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  rom the internal
37be0 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73   node. This is s
37bf0 6c 69 67 68 74 6c 79 0a 20 20 2a 2a 20 74 72 69  lightly.  ** tri
37c00 63 6b 79 20 61 73 20 74 68 65 20 6c 65 61 66 20  cky as the leaf 
37c10 6e 6f 64 65 20 6d 61 79 20 62 65 20 75 6e 64 65  node may be unde
37c20 72 66 75 6c 6c 2c 20 61 6e 64 20 74 68 65 20 69  rfull, and the i
37c30 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 6d 61 79  nternal node may
37c40 0a 20 20 2a 2a 20 62 65 20 65 69 74 68 65 72 20  .  ** be either 
37c50 75 6e 64 65 72 20 6f 72 20 6f 76 65 72 66 75 6c  under or overful
37c60 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  l. In this case 
37c70 72 75 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e  run the balancin
37c80 67 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20 2a 2a  g algorithm.  **
37c90 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64   on the leaf nod
37ca0 65 20 66 69 72 73 74 2e 20 49 66 20 74 68 65 20  e first. If the 
37cb0 62 61 6c 61 6e 63 65 20 70 72 6f 63 65 65 64 73  balance proceeds
37cc0 20 66 61 72 20 65 6e 6f 75 67 68 20 75 70 20 74   far enough up t
37cd0 68 65 0a 20 20 2a 2a 20 74 72 65 65 20 74 68 61  he.  ** tree tha
37ce0 74 20 77 65 20 63 61 6e 20 62 65 20 73 75 72 65  t we can be sure
37cf0 20 74 68 61 74 20 61 6e 79 20 70 72 6f 62 6c 65   that any proble
37d00 6d 20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  m in the interna
37d10 6c 20 6e 6f 64 65 20 68 61 73 0a 20 20 2a 2a 20  l node has.  ** 
37d20 62 65 65 6e 20 63 6f 72 72 65 63 74 65 64 2c 20  been corrected, 
37d30 73 6f 20 62 65 20 69 74 2e 20 4f 74 68 65 72 77  so be it. Otherw
37d40 69 73 65 2c 20 61 66 74 65 72 20 62 61 6c 61 6e  ise, after balan
37d50 63 69 6e 67 20 74 68 65 20 6c 65 61 66 20 6e 6f  cing the leaf no
37d60 64 65 2c 0a 20 20 2a 2a 20 77 61 6c 6b 20 74 68  de,.  ** walk th
37d70 65 20 63 75 72 73 6f 72 20 75 70 20 74 68 65 20  e cursor up the 
37d80 74 72 65 65 20 74 6f 20 74 68 65 20 69 6e 74 65  tree to the inte
37d90 72 6e 61 6c 20 6e 6f 64 65 20 61 6e 64 20 62 61  rnal node and ba
37da0 6c 61 6e 63 65 20 69 74 20 61 73 20 0a 20 20 2a  lance it as .  *
37db0 2a 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 72 63  * well.  */.  rc
37dc0 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29   = balance(pCur)
37dd0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
37de0 54 45 5f 4f 4b 20 26 26 20 70 43 75 72 2d 3e 69  TE_OK && pCur->i
37df0 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74 68 20  Page>iCellDepth 
37e00 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  ){.    while( pC
37e10 75 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44  ur->iPage>iCellD
37e20 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 72 65  epth ){.      re
37e30 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
37e40 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
37e50 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge--]);.    }.  
37e60 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
37e70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
37e80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37e90 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74  {.    moveToRoot
37ea0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65  (pCur);.  }.  re
37eb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37ec0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 42  * Create a new B
37ed0 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69  Tree table.  Wri
37ee0 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65  te into *piTable
37ef0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
37f00 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  ber for the root
37f10 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77   page of the new
37f20 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
37f30 65 20 74 79 70 65 20 6f 66 20 74 79 70 65 20 69  e type of type i
37f40 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
37f50 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
37f60 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a  ter.  Only the.*
37f70 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75  * following valu
37f80 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20  es of flags are 
37f90 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
37fa0 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20  .  Other values 
37fb0 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67  for.** flags mig
37fc0 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a  ht not work:.**.
37fd0 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54  **     BTREE_INT
37fe0 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41  KEY|BTREE_LEAFDA
37ff0 54 41 20 20 20 20 20 55 73 65 64 20 66 6f 72 20  TA     Used for 
38000 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20  SQL tables with 
38010 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20  rowid keys.**   
38020 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41    BTREE_ZERODATA
38030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38040 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69    Used for SQL i
38050 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63  ndices.*/.static
38060 20 69 6e 74 20 62 74 72 65 65 43 72 65 61 74 65   int btreeCreate
38070 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
38080 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e  int *piTable, in
38090 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68  t flags){.  BtSh
380a0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
380b0 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
380c0 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Root;.  Pgno pgn
380d0 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b  oRoot;.  int rc;
380e0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
380f0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
38100 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
38110 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
38120 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
38130 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
38140 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
38150 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
38160 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
38170 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
38180 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
38190 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74  pRoot, &pgnoRoot
381a0 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 1, 0);.  if( r
381b0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
381c0 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  rc;.  }.#else.  
381d0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
381e0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
381f0 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f  pgnoMove;      /
38200 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65  * Move a page he
38210 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  re to make room 
38220 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
38230 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  e */.    MemPage
38240 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20   *pPageMove; /* 
38250 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  The page to move
38260 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   to. */..    /* 
38270 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74  Creating a new t
38280 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c  able may probabl
38290 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
382a0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74   an existing dat
382b0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20  abase.    ** to 
382c0 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
382d0 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f  e new tables roo
382e0 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20  t page. In case 
382f0 74 68 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a  this page turns.
38300 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65      ** out to be
38310 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
38320 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76  e, delete all ov
38330 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20  erflow page-map 
38340 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65  caches.    ** he
38350 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f  ld by open curso
38360 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rs..    */.    i
38370 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
38380 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
38390 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
383a0 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33   value of meta[3
383b0 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  ] from the datab
383c0 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ase to determine
383d0 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a   where the.    *
383e0 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * root page of t
383f0 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f  he new table sho
38400 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20  uld go. meta[3] 
38410 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  is the largest r
38420 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
38430 63 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20  created so far, 
38440 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d  so the new root-
38450 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d  page is (meta[3]
38460 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  +1)..    */.    
38470 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
38480 65 74 61 28 70 2c 20 42 54 52 45 45 5f 4c 41 52  eta(p, BTREE_LAR
38490 47 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20  GEST_ROOT_PAGE, 
384a0 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20  &pgnoRoot);.    
384b0 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a