/ Hex Artifact Content
Login

Artifact 48825008514537420283ee9e51e0456263a39d2c:


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 38 33 20 32 30 30 39 2f 30  c,v 1.683 2009/0
0190: 37 2f 31 33 20 30 37 3a 33 30 3a 35 33 20 64 61  7/13 07:30:53 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 3b 0a 20 20 20 20 72 63 20 3d 20 73  Page;.    rc = s
4400: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
4410: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
4420: 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
4430: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4440: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
4450: 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c  HasContent = sql
4460: 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
4470: 28 28 75 33 32 29 6e 50 61 67 65 29 3b 0a 20 20  ((u32)nPage);.  
4480: 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48      if( !pBt->pH
4490: 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  asContent ){.   
44a0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
44b0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
44c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
44d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
44e0: 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69   pgno<=sqlite3Bi
44f0: 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48  tvecSize(pBt->pH
4500: 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20  asContent) ){.  
4510: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
4520: 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61  tvecSet(pBt->pHa
4530: 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b  sContent, pgno);
4540: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4550: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79  ;.}../*.** Query
4560: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
4570: 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72  asContent vector
4580: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
4590: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
45a0: 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  when a free-list
45b0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
45c0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  moved from the.*
45d0: 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20  * free-list for 
45e0: 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e  reuse. It return
45f0: 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  s false if it is
4600: 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65 76   safe to retriev
4610: 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72  e the.** page fr
4620: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  om the pager lay
4630: 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d  er with the 'no-
4640: 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65  content' flag se
4650: 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69 73  t. True otherwis
4660: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4670: 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74   btreeGetHasCont
4680: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4690: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
46a0: 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74   Bitvec *p = pBt
46b0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20  ->pHasContent;. 
46c0: 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70   return (p && (p
46d0: 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65  gno>sqlite3Bitve
46e0: 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69  cSize(p) || sqli
46f0: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2c  te3BitvecTest(p,
4700: 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a   pgno)));.}../*.
4710: 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f  ** Clear (destro
4720: 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  y) the BtShared.
4730: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4740: 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  ec. This should 
4750: 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74  be.** invoked at
4760: 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
4770: 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74 72  of each write-tr
4780: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
4790: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 43  atic void btreeC
47a0: 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42  learHasContent(B
47b0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
47c0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
47d0: 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43  stroy(pBt->pHasC
47e0: 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e  ontent);.  pBt->
47f0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b  pHasContent = 0;
4800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  .}../*.** Save t
4810: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
4820: 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68  r position in th
4830: 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75  e variables BtCu
4840: 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e  rsor.nKey .** an
4850: 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e  d BtCursor.pKey.
4860: 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74   The cursor's st
4870: 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55  ate is set to CU
4880: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
4890: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48a0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
48b0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
48c0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
48d0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
48e0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
48f0: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
4900: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
4910: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
4920: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
4930: 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
4940: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
4950: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
4960: 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Key);..  /* If t
4970: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
4980: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
4990: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
49a0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
49b0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
49c0: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
49d0: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
49e0: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
49f0: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
4a00: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
4a10: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
4a20: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
4a30: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
4a40: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
4a50: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
4a60: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
4a70: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
4a80: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
4a90: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
4aa0: 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43  LITE_OK && 0==pC
4ab0: 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
4ac0: 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69 64  ntKey){.    void
4ad0: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
4ae0: 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70 43 75  Malloc( (int)pCu
4af0: 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69  r->nKey );.    i
4b00: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( pKey ){.     
4b10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4b20: 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 28  eeKey(pCur, 0, (
4b30: 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20  int)pCur->nKey, 
4b40: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28  pKey);.      if(
4b50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4b60: 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
4b70: 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pKey = pKey;.   
4b80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4b90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
4ba0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Key);.      }.  
4bb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
4bc0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
4bd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
4be0: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70 50  sert( !pCur->apP
4bf0: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
4c00: 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  | !pCur->pKey );
4c10: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
4c20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
4c30: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
4c40: 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
4c50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
4c60: 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
4c70: 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
4c80: 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d   pCur->apPage[i]
4c90: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
4ca0: 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31  pCur->iPage = -1
4cb0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
4cc0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
4cd0: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
4ce0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4cf0: 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
4d00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4d10: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f  *.** Save the po
4d20: 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63  sitions of all c
4d30: 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 70 45  ursors except pE
4d40: 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68  xcept open on th
4d50: 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68  e table .** with
4d60: 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74   root-page iRoot
4d70: 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20  . Usually, this 
4d80: 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62  is called just b
4d90: 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20  efore cursor.** 
4da0: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
4db0: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61  to modify the ta
4dc0: 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65  ble (BtreeDelete
4dd0: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
4de0: 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  t())..*/.static 
4df0: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
4e00: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
4e10: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
4e20: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
4e30: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
4e40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4e50: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
4e60: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
4e70: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
4e80: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
4e90: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
4ea0: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
4eb0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
4ec0: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
4ed0: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
4ee0: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
4ef0: 69 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20  iRoot) && .     
4f00: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55     p->eState==CU
4f10: 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
4f20: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76      int rc = sav
4f30: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
4f40: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  p);.      if( SQ
4f50: 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
4f60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
4f70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4f80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
4f90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
4fa0: 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65   Clear the curre
4fb0: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
4fc0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
4fd0: 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
4fe0: 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
4ff0: 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
5000: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5010: 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74  pCur) );.  sqlit
5020: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
5030: 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65  ey);.  pCur->pKe
5040: 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65  y = 0;.  pCur->e
5050: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
5060: 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NVALID;.}../*.**
5070: 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e   In this version
5080: 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c   of BtreeMoveto,
5090: 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65   pKey is a packe
50a0: 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a  d index record.*
50b0: 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e  * such as is gen
50c0: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  erated by the OP
50d0: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
50e0: 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a  de.  Unpack the.
50f0: 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68  ** record and th
5100: 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76  en call BtreeMov
5110: 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f  etoUnpacked() to
5120: 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f   do the work..*/
5130: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
5140: 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72  eMoveto(.  BtCur
5150: 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f  sor *pCur,     /
5160: 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e  * Cursor open on
5170: 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65   the btree to be
5180: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63   searched */.  c
5190: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
51a0: 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79     /* Packed key
51b0: 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73   if the btree is
51c0: 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   an index */.  i
51d0: 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  64 nKey,        
51e0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65     /* Integer ke
51f0: 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53  y for tables.  S
5200: 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20  ize of pKey for 
5210: 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
5220: 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20   bias,          
5230: 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20   /* Bias search 
5240: 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
5250: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
5260: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
5270: 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
5280: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
5290: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
52a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
52b0: 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70  us code */.  Unp
52c0: 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
52d0: 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63  xKey;   /* Unpac
52e0: 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
52f0: 0a 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 31  .  char aSpace[1
5300: 35 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  50];          /*
5310: 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20   Temp space for 
5320: 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f  pIdxKey - to avo
5330: 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a  id a malloc */..
5340: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
5350: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d    assert( nKey==
5360: 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29  (i64)(int)nKey )
5370: 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  ;.    pIdxKey = 
5380: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
5390: 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b  dUnpack(pCur->pK
53a0: 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65  eyInfo, (int)nKe
53b0: 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20  y, pKey,.       
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
53e0: 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53  Space, sizeof(aS
53f0: 70 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20  pace));.    if( 
5400: 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74  pIdxKey==0 ) ret
5410: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
5420: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
5430: 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
5440: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5450: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5460: 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
5470: 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
5480: 73 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 20 29  s);.  if( pKey )
5490: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
54a0: 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
54b0: 65 63 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a  ecord(pIdxKey);.
54c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
54d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
54e0: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
54f0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
5500: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
5510: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
5520: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
5530: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
5540: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
5550: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
5560: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
5570: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
5580: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
5590: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
55a0: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
55b0: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
55c0: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
55d0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
55e0: 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72  ion() call after
55f0: 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75   each .** saveCu
5600: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a  rsorPosition()..
5610: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5620: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5630: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
5640: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
5650: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  rc;.  assert( cu
5660: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
5670: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
5680: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
5690: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
56a0: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
56b0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
56c0: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
56d0: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b  turn pCur->skip;
56e0: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74  .  }.  pCur->eSt
56f0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
5700: 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72  ALID;.  rc = btr
5710: 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
5720: 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d  Cur->pKey, pCur-
5730: 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d  >nKey, 0, &pCur-
5740: 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63  >skip);.  if( rc
5750: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5760: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5770: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20  pCur->pKey);.   
5780: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
5790: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
57a0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
57b0: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
57c0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
57d0: 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20  INVALID );.  }. 
57e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
57f0: 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75  define restoreCu
5800: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
5810: 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d  \.  (p->eState>=
5820: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5830: 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20  EK ? \.         
5840: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
5850: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20  orPosition(p) : 
5860: 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  \.         SQLIT
5870: 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  E_OK)../*.** Det
5880: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
5890: 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68  r not a cursor h
58a0: 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68  as moved from th
58b0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a  e position it.**
58c0: 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64   was last placed
58d0: 20 61 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61   at.  Cursors ca
58e0: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
58f0: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
5900: 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64  nting.** at is d
5910: 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
5920: 75 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  under them..**.*
5930: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
5940: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
5950: 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e  code if somethin
5960: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54  g goes wrong.  T
5970: 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70  he.** integer *p
5980: 48 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20  HasMoved is set 
5990: 74 6f 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75  to one if the cu
59a0: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61  rsor has moved a
59b0: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  nd 0 if not..*/.
59c0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
59d0: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42  CursorHasMoved(B
59e0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
59f0: 6e 74 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a  nt *pHasMoved){.
5a00: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
5a10: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
5a20: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
5a30: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
5a40: 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20  pHasMoved = 1;. 
5a50: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
5a60: 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
5a70: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
5a80: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70  ID || pCur->skip
5a90: 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48 61 73  !=0 ){.    *pHas
5aa0: 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  Moved = 1;.  }el
5ab0: 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76  se{.    *pHasMov
5ac0: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ed = 0;.  }.  re
5ad0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5ae0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
5af0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
5b00: 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  M./*.** Given a 
5b10: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
5b20: 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61 73   regular databas
5b30: 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74  e page, return t
5b40: 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  he page.** numbe
5b50: 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65  r for the pointe
5b60: 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74 20  r-map page that 
5b70: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74  contains the ent
5b80: 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e  ry for the.** in
5b90: 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  put page number.
5ba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
5bb0: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53  ptrmapPageno(BtS
5bc0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5bd0: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50   pgno){.  int nP
5be0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
5bf0: 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20    Pgno iPtrMap, 
5c00: 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ret;.  assert( s
5c10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5c20: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
5c30: 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  .  nPagesPerMapP
5c40: 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  age = (pBt->usab
5c50: 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69  leSize/5)+1;.  i
5c60: 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32  PtrMap = (pgno-2
5c70: 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  )/nPagesPerMapPa
5c80: 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74  ge;.  ret = (iPt
5c90: 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61  rMap*nPagesPerMa
5ca0: 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69  pPage) + 2; .  i
5cb0: 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f  f( ret==PENDING_
5cc0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
5cd0: 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d  {.    ret++;.  }
5ce0: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
5cf0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
5d00: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
5d10: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
5d20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5d30: 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e  updates the poin
5d40: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
5d50: 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b  r page number 'k
5d60: 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  ey'.** so that i
5d70: 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27  t maps to type '
5d80: 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e  eType' and paren
5d90: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70  t page number 'p
5da0: 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  gno'..** An erro
5db0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
5dc0: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
5dd0: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
5de0: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
5df0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
5e00: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
5e10: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
5e20: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
5e30: 20 70 61 72 65 6e 74 29 7b 0a 20 20 44 62 50 61   parent){.  DbPa
5e40: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a  ge *pDbPage;  /*
5e50: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
5e60: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
5e70: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20  Ptrmap;      /* 
5e80: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
5e90: 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  data */.  Pgno i
5ea0: 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54  Ptrmap;     /* T
5eb0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
5ec0: 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
5ed0: 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20  int offset;     
5ee0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70    /* Offset in p
5ef0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
5f00: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
5f10: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5f20: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
5f30: 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54  mutex) );.  /* T
5f40: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
5f50: 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75  l page number mu
5f60: 73 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  st never be used
5f70: 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61   as a pointer ma
5f80: 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65  p page */.  asse
5f90: 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53  rt( 0==PTRMAP_IS
5fa0: 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e  PAGE(pBt, PENDIN
5fb0: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
5fc0: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
5fd0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
5fe0: 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20  );.  if( key==0 
5ff0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6000: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
6010: 54 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70  T;.  }.  iPtrmap
6020: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
6030: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
6040: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
6050: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
6060: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
6070: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
6080: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
6090: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
60a0: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
60b0: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
60c0: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
60d0: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 72  ffset<0 ){.    r
60e0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
60f0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
6100: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
6110: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
6120: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
6130: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
6140: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
6150: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
6160: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
6170: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6180: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
6190: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
61a0: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
61b0: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
61c0: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
61d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
61e0: 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
61f0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
6200: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6210: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
6220: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
6230: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
6240: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
6250: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
6260: 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20  .ptrmap_exit:.  
6270: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
6280: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65  f(pDbPage);.  re
6290: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
62a0: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
62b0: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
62c0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
62d0: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
62e0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
62f0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6300: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
6310: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
6320: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6330: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
6340: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
6350: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
6360: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
6370: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
6380: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
6390: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
63a0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
63b0: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
63c0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
63d0: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
63e0: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
63f0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
6400: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6410: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6420: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
6430: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
6440: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
6450: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6460: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
6470: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
6480: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
6490: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
64a0: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
64b0: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
64c0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
64d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
64e0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
64f0: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
6500: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
6510: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
6520: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
6530: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
6540: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
6550: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
6560: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
6570: 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  }.  pPtrmap = (u
6580: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
6590: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
65a0: 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54  ;..  offset = PT
65b0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
65c0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
65d0: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
65e0: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
65f0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
6600: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
6610: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
6620: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
6630: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
6640: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
6650: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
6660: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
6670: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
6680: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6690: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
66a0: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  _OK;.}..#else /*
66b0: 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49   if defined SQLI
66c0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
66d0: 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  UM */.  #define 
66e0: 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c  ptrmapPut(w,x,y,
66f0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
6700: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74  define ptrmapGet
6710: 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45  (w,x,y,z) SQLITE
6720: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74  _OK.  #define pt
6730: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78  rmapPutOvflPtr(x
6740: 2c 20 79 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  , y) SQLITE_OK.#
6750: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
6760: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
6770: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
6780: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
6790: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
67a0: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
67b0: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
67c0: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
67d0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
67e0: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
67f0: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  content..**.** T
6800: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
6810: 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73  s only for pages
6820: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e   that do not con
6830: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
6840: 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lls..*/.#define 
6850: 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a  findCell(P,I) \.
6860: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20    ((P)->aData + 
6870: 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26  ((P)->maskPage &
6880: 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e   get2byte(&(P)->
6890: 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f  aData[(P)->cellO
68a0: 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29 29 0a  ffset+2*(I)]))).
68b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f  ./*.** This a mo
68c0: 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69  re complex versi
68d0: 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29  on of findCell()
68e0: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
68f0: 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  ** pages that do
6900: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
6910: 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  w cells..*/.stat
6920: 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66  ic u8 *findOverf
6930: 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  lowCell(MemPage 
6940: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
6950: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  l){.  int i;.  a
6960: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6970: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
6980: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
6990: 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e    for(i=pPage->n
69a0: 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30  Overflow-1; i>=0
69b0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
69c0: 6b 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f  k;.    struct _O
69d0: 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a  vflCell *pOvfl;.
69e0: 20 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61      pOvfl = &pPa
69f0: 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20  ge->aOvfl[i];.  
6a00: 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78    k = pOvfl->idx
6a10: 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65  ;.    if( k<=iCe
6a20: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
6a30: 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k==iCell ){.    
6a40: 20 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c      return pOvfl
6a50: 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d  ->pCell;.      }
6a60: 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a  .      iCell--;.
6a70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6a80: 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  rn findCell(pPag
6a90: 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a  e, iCell);.}../*
6aa0: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
6ab0: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
6ac0: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
6ad0: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
6ae0: 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65  e.  There.** are
6af0: 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   two versions of
6b00: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
6b10: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
6b20: 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65  ) takes a .** ce
6b30: 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20  ll index as the 
6b40: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
6b50: 61 6e 64 20 62 74 72 65 65 50 61 72 73 65 43 65  and btreeParseCe
6b60: 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65  llPtr() .** take
6b70: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
6b80: 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63  he body of the c
6b90: 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e  ell as its secon
6ba0: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
6bb0: 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66 69  * Within this fi
6bc0: 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c  le, the parseCel
6bd0: 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65  l() macro can be
6be0: 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20   called instead 
6bf0: 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  of.** btreeParse
6c00: 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67  CellPtr(). Using
6c10: 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c   some compilers,
6c20: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61   this will be fa
6c30: 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ster..*/.static 
6c40: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
6c50: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
6c60: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
6c70: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
6c80: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
6c90: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
6ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
6cb0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
6cc0: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
6cd0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
6ce0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
6cf0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
6d00: 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20  /.){.  u16 n;   
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6d20: 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69  * Number bytes i
6d30: 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  n cell content h
6d40: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
6d50: 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20  Payload;        
6d60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6d70: 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61  bytes of cell pa
6d80: 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65  yload */..  asse
6d90: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6da0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
6db0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
6dc0: 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70  pInfo->pCell = p
6dd0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
6de0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
6df0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
6e00: 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d   );.  n = pPage-
6e10: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
6e20: 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a   assert( n==4-4*
6e30: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
6e40: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
6e50: 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  ey ){.    if( pP
6e60: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
6e70: 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61        n += getVa
6e80: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
6e90: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
6ea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
6eb0: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20  ayload = 0;.    
6ec0: 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  }.    n += getVa
6ed0: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  rint(&pCell[n], 
6ee0: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
6ef0: 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  ey);.    pInfo->
6f00: 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64  nData = nPayload
6f10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6f20: 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b  Info->nData = 0;
6f30: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
6f40: 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c  int32(&pCell[n],
6f50: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
6f60: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50  pInfo->nKey = nP
6f70: 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49  ayload;.  }.  pI
6f80: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
6f90: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
6fa0: 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a  o->nHeader = n;.
6fb0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
6fc0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
6fd0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
6fe0: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
6ff0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
7000: 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79   );.  if( likely
7010: 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65  (nPayload<=pPage
7020: 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20  ->maxLocal) ){. 
7030: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
7040: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
7050: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
7060: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
7070: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
7080: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
7090: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
70a0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
70b0: 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20    int nSize;    
70c0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
70d0: 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  ize of cell cont
70e0: 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ent in bytes */.
70f0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79      nSize = nPay
7100: 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49  load + n;.    pI
7110: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7120: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20  16)nPayload;.   
7130: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7140: 77 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28  w = 0;.    if( (
7150: 6e 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29  nSize & ~3)==0 )
7160: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
7170: 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e  4;        /* Min
7180: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
7190: 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  s 4 */.    }.   
71a0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
71b0: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d 65  (u16)nSize;.  }e
71c0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
71d0: 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20  he payload will 
71e0: 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65  not fit complete
71f0: 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ly on the local 
7200: 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20  page, we have.  
7210: 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68    ** to decide h
7220: 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65  ow much to store
7230: 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77   locally and how
7240: 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f   much to spill o
7250: 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66  nto.    ** overf
7260: 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20  low pages.  The 
7270: 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d  strategy is to m
7280: 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75  inimize the amou
7290: 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20  nt of unused.   
72a0: 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65   ** space on ove
72b0: 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c  rflow pages whil
72c0: 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d  e keeping the am
72d0: 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74  ount of local st
72e0: 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20  orage.    ** in 
72f0: 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c  between minLocal
7300: 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20   and maxLocal.. 
7310: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72     **.    ** War
7320: 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20  ning:  changing 
7330: 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77  the way overflow
7340: 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74   payload is dist
7350: 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20  ributed in any. 
7360: 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72     ** way will r
7370: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
7380: 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f  mpatible file fo
7390: 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rmat..    */.   
73a0: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20   int minLocal;  
73b0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e  /* Minimum amoun
73c0: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
73d0: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20  d locally */.   
73e0: 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20   int maxLocal;  
73f0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  /* Maximum amoun
7400: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
7410: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20  d locally */.   
7420: 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20   int surplus;   
7430: 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c  /* Overflow payl
7440: 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  oad available fo
7450: 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20  r local storage 
7460: 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c  */..    minLocal
7470: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
7480: 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c  al;.    maxLocal
7490: 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   = pPage->maxLoc
74a0: 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20  al;.    surplus 
74b0: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50  = minLocal + (nP
74c0: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
74d0: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
74e0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
74f0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73  .    testcase( s
7500: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
7510: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7520: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
7530: 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  cal+1 );.    if(
7540: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
7550: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49  ocal ){.      pI
7560: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7570: 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20  16)surplus;.    
7580: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e  }else{.      pIn
7590: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
75a0: 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  6)minLocal;.    
75b0: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  }.    pInfo->iOv
75c0: 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70  erflow = (u16)(p
75d0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e  Info->nLocal + n
75e0: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  );.    pInfo->nS
75f0: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
7600: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
7610: 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43  }.#define parseC
7620: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
7630: 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74 72  , pInfo) \.  btr
7640: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28  eeParseCellPtr((
7650: 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c  pPage), findCell
7660: 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c  ((pPage), (iCell
7670: 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74 61  )), (pInfo)).sta
7680: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
7690: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
76a0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
76b0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
76c0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
76d0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
76f0: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
7700: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
7710: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
7720: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
7730: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
7740: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
7750: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
7760: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d  iCell, pInfo);.}
7770: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
7780: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
7790: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61   of bytes that a
77a0: 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74   Cell needs in t
77b0: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
77c0: 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65  area of the btre
77d0: 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74  e-page.  The ret
77e0: 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75  urn number inclu
77f0: 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20  des the cell.** 
7800: 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20  data header and 
7810: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
7820: 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  d, but not any o
7830: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a  verflow page or.
7840: 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65  ** the space use
7850: 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f  d by the cell po
7860: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
7870: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
7880: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7890: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
78a0: 38 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c  8 *pIter = &pCel
78b0: 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  l[pPage->childPt
78c0: 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53  rSize];.  u32 nS
78d0: 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ize;..#ifdef SQL
78e0: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
78f0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
7900: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
7910: 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  on should always
7920: 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a   be the same as.
7930: 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e    ** the (CellIn
7940: 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20  fo.nSize) value 
7950: 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61  found by doing a
7960: 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74   full parse of t
7970: 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66  he.  ** cell. If
7980: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73   SQLITE_DEBUG is
7990: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
79a0: 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74  ert() at the bot
79b0: 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  tom of.  ** this
79c0: 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69   function verifi
79d0: 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76  es that this inv
79e0: 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69  ariant is not vi
79f0: 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c  olated. */.  Cel
7a00: 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b  lInfo debuginfo;
7a10: 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
7a20: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
7a30: 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a  l, &debuginfo);.
7a40: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50  #endif..  if( pP
7a50: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
7a60: 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20 20     u8 *pEnd;.   
7a70: 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
7a80: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ata ){.      pIt
7a90: 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  er += getVarint3
7aa0: 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b  2(pIter, nSize);
7ab0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7ac0: 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20    nSize = 0;.   
7ad0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65 72   }..    /* pIter
7ae0: 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74   now points at t
7af0: 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  he 64-bit intege
7b00: 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76  r key value, a v
7b10: 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a  ariable length .
7b20: 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
7b30: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
7b40: 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20  ock moves pIter 
7b50: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
7b60: 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a  first byte.    *
7b70: 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
7b80: 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e  f the key value.
7b90: 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26   */.    pEnd = &
7ba0: 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68  pIter[9];.    wh
7bb0: 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26  ile( (*pIter++)&
7bc0: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
7bd0: 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nd );.  }else{. 
7be0: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
7bf0: 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e  arint32(pIter, n
7c00: 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74 65  Size);.  }..  te
7c10: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
7c20: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
7c30: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53  ;.  testcase( nS
7c40: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
7c50: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
7c60: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
7c70: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
7c80: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
7c90: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
7ca0: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
7cb0: 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e  l + (nSize - min
7cc0: 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d  Local) % (pPage-
7cd0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
7ce0: 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63   - 4);.    testc
7cf0: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
7d00: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
7d10: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69     testcase( nSi
7d20: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
7d30: 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  cal+1 );.    if(
7d40: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
7d50: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
7d60: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
7d70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a  ;.    }.    nSiz
7d80: 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e 53  e += 4;.  }.  nS
7d90: 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74  ize += (u32)(pIt
7da0: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20  er - pCell);..  
7db0: 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73  /* The minimum s
7dc0: 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20  ize of any cell 
7dd0: 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  is 4 bytes. */. 
7de0: 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a   if( nSize<4 ){.
7df0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20      nSize = 4;. 
7e00: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53   }..  assert( nS
7e10: 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e  ize==debuginfo.n
7e20: 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72 6e  Size );.  return
7e30: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 23   (u16)nSize;.}.#
7e40: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
7e50: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
7e60: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
7e70: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
7e80: 72 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50  return cellSizeP
7e90: 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  tr(pPage, findCe
7ea0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
7eb0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
7ec0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7ed0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
7ee0: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
7ef0: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
7f00: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
7f10: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
7f20: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
7f30: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
7f40: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
7f50: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
7f60: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
7f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7f80: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
7f90: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7fa0: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43   u8 *pCell){.  C
7fb0: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
7fc0: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
7fd0: 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
7fe0: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
7ff0: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
8000: 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44  assert( (info.nD
8010: 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
8020: 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
8030: 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
8040: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
8050: 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50  verflow ){.    P
8060: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
8070: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
8080: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
8090: 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
80a0: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
80b0: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
80c0: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
80d0: 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
80e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
80f0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
8100: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
8110: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
8120: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
8130: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
8140: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
8150: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
8160: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
8170: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
8180: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
8190: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
81a0: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
81b0: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
81c0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
81d0: 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  area..*/.static 
81e0: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
81f0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
8200: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8230: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
8260: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
8270: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
8280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
8290: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
82a0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
82b0: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
82c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
82d0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
82e0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
82f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8300: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
8310: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
8320: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
8330: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
8340: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
8350: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
8360: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8380: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8390: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
83a0: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
83b0: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
83c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
83d0: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
83e0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
83f0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
8400: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
8410: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
8420: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
8430: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
8440: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
8450: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
8460: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
8470: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
8480: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
8490: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
84a0: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
84b0: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
84c0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
84d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
84e0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
84f0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
8500: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
8510: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
8520: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8530: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8540: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
8550: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
8560: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
8570: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
8580: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8590: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
85a0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
85b0: 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74  ;.  temp = sqlit
85c0: 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
85d0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
85e0: 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  ger);.  data = p
85f0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
8600: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
8610: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
8620: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
8630: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
8640: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
8650: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
8660: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
8670: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
8680: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
8690: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
86a0: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32  e;.  cbrk = get2
86b0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
86c0: 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65  ]);.  memcpy(&te
86d0: 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  mp[cbrk], &data[
86e0: 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  cbrk], usableSiz
86f0: 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72  e - cbrk);.  cbr
8700: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
8710: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
8720: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
8730: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
8740: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
8750: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
8760: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
8770: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
8780: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
8790: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
87a0: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
87b0: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
87c0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
87d0: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
87e0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
87f0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
8800: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
8810: 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64  llLast );.#if !d
8820: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
8830: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
8840: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a  LL_CHECK).    /*
8850: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
8860: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
8870: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
8880: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
8890: 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45      ** if SQLITE
88a0: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
88b0: 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64  _CELL_CHECK is d
88c0: 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20  efined .    */. 
88d0: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
88e0: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
88f0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
8900: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8910: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
8920: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
8930: 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73  t( pc>=iCellFirs
8940: 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61  t && pc<=iCellLa
8950: 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  st );.    size =
8960: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
8970: 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a  ge, &temp[pc]);.
8980: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
8990: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
89a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
89b0: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
89c0: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
89d0: 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ellFirst ){.    
89e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
89f0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8a00: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
8a10: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
8a20: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
8a30: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
8a40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8a50: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8a60: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73   }.#endif.    as
8a70: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
8a80: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
8a90: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
8aa0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8ab0: 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62   cbrk+size==usab
8ac0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65  leSize );.    te
8ad0: 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d  stcase( pc+size=
8ae0: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
8af0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
8b00: 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  cbrk], &temp[pc]
8b10: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
8b20: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
8b30: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
8b40: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
8b50: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
8b60: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
8b70: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
8b80: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
8b90: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
8ba0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
8bb0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43   memset(&data[iC
8bc0: 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62  ellFirst], 0, cb
8bd0: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a  rk-iCellFirst);.
8be0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8bf0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
8c00: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
8c10: 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d  ) );.  if( cbrk-
8c20: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
8c30: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
8c40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8c50: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
8c60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8c70: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
8c80: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
8c90: 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20  s of space from 
8ca0: 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65  within the B-Tre
8cb0: 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a  e page passed.**
8cc0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
8cd0: 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e  gument. Write in
8ce0: 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64  to *pIdx the ind
8cf0: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
8d00: 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65  Data[].** of the
8d10: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
8d20: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
8d30: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
8d40: 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e  LITE_OK or.** an
8d50: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75   error code (usu
8d60: 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52  ally SQLITE_CORR
8d70: 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  UPT)..**.** The 
8d80: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
8d90: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
8da0: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
8db0: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
8dc0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69  allocation.  Thi
8dd0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
8de0: 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65  need to defragme
8df0: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  nt in order to b
8e00: 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20  ring.** all the 
8e10: 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20  space together, 
8e20: 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72  however.  This r
8e30: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69  outine will avoi
8e40: 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  d using.** the f
8e50: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70  irst two bytes p
8e60: 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  ast the cell poi
8e70: 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20  nter area since 
8e80: 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a  presumably this.
8e90: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ** allocation is
8ea0: 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f   being made in o
8eb0: 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61  rder to insert a
8ec0: 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65   new cell, so we
8ed0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e   will.** also en
8ee0: 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e  d up needing a n
8ef0: 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  ew cell pointer.
8f00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
8f10: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
8f20: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
8f30: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64   nByte, int *pId
8f40: 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  x){.  const int 
8f50: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
8f60: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
8f70: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
8f80: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
8f90: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
8fa0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
8fb0: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
8fc0: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
8fd0: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
8fe0: 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20  nFrag;          
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   /* Number of fr
9010: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f  agmented bytes o
9020: 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  n pPage */.  int
9030: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
9040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9050: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9060: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
9070: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61  area */.  int ga
9080: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  p;        /* Fir
9090: 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62  st byte of gap b
90a0: 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e  etween cell poin
90b0: 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f  ters and cell co
90c0: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ntent */.  int r
90d0: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  c;         /* In
90e0: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
90f0: 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74  e */.  .  assert
9100: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
9110: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
9120: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
9130: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
9140: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t );.  assert( s
9150: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9160: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
9170: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
9180: 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f  ( nByte>=0 );  /
9190: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
91a0: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73  ize is 4 */.  as
91b0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
91c0: 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61  ee>=nByte );.  a
91d0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
91e0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20  verflow==0 );.. 
91f0: 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64   nFrag = data[hd
9200: 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  r+7];.  assert( 
9210: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
9220: 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  t == hdr + 12 - 
9230: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
9240: 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e  .  gap = pPage->
9250: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
9260: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74  Page->nCell;.  t
9270: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
9280: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
9290: 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74  f( gap>top ) ret
92a0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
92b0: 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63  PT_BKPT;.  testc
92c0: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
92d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
92e0: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
92f0: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
9300: 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61  p );..  if( nFra
9310: 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  g>=60 ){.    /* 
9320: 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e  Always defragmen
9330: 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e  t highly fragmen
9340: 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20  ted pages */.   
9350: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
9360: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
9370: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
9380: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
9390: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
93a0: 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69  r+5]);.  }else i
93b0: 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b  f( gap+2<=top ){
93c0: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74  .    /* Search t
93d0: 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  he freelist look
93e0: 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73  ing for a free s
93f0: 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74  lot big enough t
9400: 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20 20 2a  o satisfy .    *
9410: 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e 20 54  * the request. T
9420: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  he allocation is
9430: 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20 66   made from the f
9440: 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20 69  irst free slot i
9450: 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 69  n .    ** the li
9460: 73 74 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  st that is large
9470: 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d   enough to accom
9480: 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f  adate it..    */
9490: 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64  .    int pc, add
94a0: 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d  r;.    for(addr=
94b0: 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74  hdr+1; (pc = get
94c0: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
94d0: 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b  ]))>0; addr=pc){
94e0: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
94f0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9500: 5b 70 63 2b 32 5d 29 3b 20 20 20 20 20 2f 2a 20  [pc+2]);     /* 
9510: 53 69 7a 65 20 6f 66 20 66 72 65 65 20 73 6c 6f  Size of free slo
9520: 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  t */.      if( s
9530: 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20  ize>=nByte ){.  
9540: 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69        int x = si
9550: 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze - nByte;.    
9560: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
9570: 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =4 );.        te
9580: 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a  stcase( x==3 );.
9590: 20 20 20 20 20 20 20 20 69 66 28 20 78 3c 34 20          if( x<4 
95a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
95b0: 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20  Remove the slot 
95c0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
95d0: 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e  st. Update the n
95e0: 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20  umber of.       
95f0: 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64     ** fragmented
9600: 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68   bytes within th
9610: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  e page. */.     
9620: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74       memcpy(&dat
9630: 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70  a[addr], &data[p
9640: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
9650: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
9660: 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b  (u8)(nFrag + x);
9670: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
9680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9690: 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e   slot remains on
96a0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
96b0: 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20  Reduce its size 
96c0: 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20  to account.     
96d0: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
96e0: 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20  portion used by 
96f0: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
9700: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  on. */.         
9710: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
9720: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
9730: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49     }.        *pI
9740: 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20  dx = pc + x;.   
9750: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9760: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
9770: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
9780: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
9790: 65 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  e there is enoug
97a0: 68 20 73 70 61 63 65 20 69 6e 20 74 68 65 20 67  h space in the g
97b0: 61 70 20 74 6f 20 73 61 74 69 73 66 79 0a 20 20  ap to satisfy.  
97c0: 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  ** the allocatio
97d0: 6e 2e 20 20 49 66 20 6e 6f 74 2c 20 64 65 66 72  n.  If not, defr
97e0: 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74  agment..  */.  t
97f0: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e  estcase( gap+2+n
9800: 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69  Byte==top );.  i
9810: 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74  f( gap+2+nByte>t
9820: 6f 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64  op ){.    rc = d
9830: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
9840: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
9850: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
9860: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
9870: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
9880: 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b      assert( gap+
9890: 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20  nByte<=top );.  
98a0: 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  }...  /* Allocat
98b0: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
98c0: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
98d0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
98e0: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
98f0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
9900: 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74  t area..  */.  t
9910: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70  op -= nByte;.  p
9920: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
9930: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 2a 70  r+5], top);.  *p
9940: 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74  Idx = top;.  ret
9950: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9960: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
9970: 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20   section of the 
9980: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20  pPage->aData to 
9990: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
99a0: 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
99b0: 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20  of the new free 
99c0: 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e  block is pPage->
99d0: 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20  aDisk[start].** 
99e0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
99f0: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69  the block is "si
9a00: 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ze" bytes..**.**
9a10: 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66   Most of the eff
9a20: 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f  ort here is invo
9a30: 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e  lved in coalesin
9a40: 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72  g adjacent.** fr
9a50: 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61  ee blocks into a
9a60: 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65   single big free
9a70: 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69   block..*/.stati
9a80: 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28  c int freeSpace(
9a90: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9aa0: 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73  int start, int s
9ab0: 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ize){.  int addr
9ac0: 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20  , pbegin, hdr;. 
9ad0: 20 69 6e 74 20 69 4c 61 73 74 3b 20 20 20 20 20   int iLast;     
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9af0: 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f     /* Largest po
9b00: 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b  ssible freeblock
9b10: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e 73   offset */.  uns
9b20: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
9b30: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
9b40: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
9b50: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
9b60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
9b70: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
9b80: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
9b90: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72  ;.  assert( star
9ba0: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
9bb0: 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65  set+6+(pPage->le
9bc0: 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73 73  af?0:4) );.  ass
9bd0: 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69  ert( (start + si
9be0: 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  ze)<=pPage->pBt-
9bf0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
9c00: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9c10: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
9c20: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
9c30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
9c40: 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=0 );   /* Mini
9c50: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
9c60: 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51   4 */..#ifdef SQ
9c70: 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
9c80: 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  TE.  /* Overwrit
9c90: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
9ca0: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
9cb0: 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52 45   when the SECURE
9cc0: 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70  _DELETE .  ** op
9cd0: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
9ce0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
9cf0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  */.  memset(&dat
9d00: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
9d10: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
9d20: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
9d30: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
9d40: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
9d50: 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68  blocks.  Note th
9d60: 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f  at.  ** even tho
9d70: 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63  ugh the freebloc
9d80: 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b  k list was check
9d90: 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50  ed by btreeInitP
9da0: 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65  age(),.  ** btre
9db0: 65 49 6e 69 74 50 61 67 65 28 29 20 64 69 64 20  eInitPage() did 
9dc0: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
9dd0: 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a  apping cells or.
9de0: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20    ** freeblocks 
9df0: 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65 64 20  that overlapped 
9e00: 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65  cells.   Nor doe
9e10: 73 20 69 74 20 64 65 74 65 63 74 20 77 68 65 6e  s it detect when
9e20: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63   the.  ** cell c
9e30: 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78 63 65  ontent area exce
9e40: 65 64 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e  eds the value in
9e50: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
9e60: 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20 2a 2a  .  If these.  **
9e70: 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72 69 73   situations aris
9e80: 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
9e90: 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  nt insert operat
9ea0: 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72 72 75  ions might corru
9eb0: 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65  pt.  ** the free
9ec0: 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64 6f 20  list.  So we do 
9ed0: 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f  need to check fo
9ee0: 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 68 69  r corruption whi
9ef0: 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a  le scanning.  **
9f00: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
9f10: 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
9f20: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
9f30: 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  addr = hdr + 1;.
9f40: 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d    iLast = pPage-
9f50: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
9f60: 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74 28 20   - 4;.  assert( 
9f70: 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  start<=iLast );.
9f80: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
9f90: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9fa0: 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20  a[addr]))<start 
9fb0: 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20  && pbegin>0 ){. 
9fc0: 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c 61 64     if( pbegin<ad
9fd0: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 72 65  dr+4 ){.      re
9fe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9ff0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
a000: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
a010: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 62 65  n;.  }.  if( pbe
a020: 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20  gin>iLast ){.   
a030: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a040: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
a050: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
a060: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
a070: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
a080: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
a090: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
a0a0: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
a0b0: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
a0c0: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
a0d0: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
a0e0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67  ge->nFree = pPag
a0f0: 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31 36 29  e->nFree + (u16)
a100: 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c  size;..  /* Coal
a110: 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72  esce adjacent fr
a120: 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61  ee blocks */.  a
a130: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
a140: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
a150: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a160: 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20  [addr]))>0 ){.  
a170: 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69    int pnext, psi
a180: 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72  ze, x;.    asser
a190: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
a1a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
a1b0: 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74  egin<=pPage->pBt
a1c0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
a1d0: 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65  ;.    pnext = ge
a1e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
a1f0: 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65  gin]);.    psize
a200: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a210: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
a220: 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70    if( pbegin + p
a230: 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78  size + 3 >= pnex
a240: 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a  t && pnext>0 ){.
a250: 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d        int frag =
a260: 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e   pnext - (pbegin
a270: 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  +psize);.      i
a280: 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28  f( (frag<0) || (
a290: 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 68  frag>(int)data[h
a2a0: 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20  dr+7]) ){.      
a2b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a2c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a2d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61      }.      data
a2e0: 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38 29 66  [hdr+7] -= (u8)f
a2f0: 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67  rag;.      x = g
a300: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
a310: 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74  ext]);.      put
a320: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
a330: 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78  in], x);.      x
a340: 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62   = pnext + get2b
a350: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b  yte(&data[pnext+
a360: 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20  2]) - pbegin;.  
a370: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
a380: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29  ta[pbegin+2], x)
a390: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a3a0: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
a3b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
a3c0: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
a3d0: 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e  ntent area begin
a3e0: 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f  s with a freeblo
a3f0: 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a  ck, remove it. *
a400: 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72  /.  if( data[hdr
a410: 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d  +1]==data[hdr+5]
a420: 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d   && data[hdr+2]=
a430: 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a  =data[hdr+6] ){.
a440: 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20      int top;.   
a450: 20 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 68 64 72 2b 31 5d 29  te(&data[hdr+1])
a470: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
a480: 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61  ta[hdr+1], &data
a490: 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20  [pbegin], 2);.  
a4a0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
a4b0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b  (&data[hdr+5]) +
a4c0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a4d0: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
a4e0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
a4f0: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d  dr+5], top);.  }
a500: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a510: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
a520: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
a530: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
a540: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a550: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
a560: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
a570: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
a580: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
a590: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
a5a0: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
a5b0: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
a5c0: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
a5d0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
a5e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
a5f0: 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70  nations are supp
a600: 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67  orted.  Anything
a610: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e   different.** in
a620: 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70  dicates a corrup
a630: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
a640: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
a650: 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20  PTF_ZERODATA.** 
a660: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
a670: 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a  DATA | PTF_LEAF.
a680: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
a690: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
a6a0: 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20  TKEY.**         
a6b0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
a6c0: 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f  TF_INTKEY | PTF_
a6d0: 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAF.*/.static i
a6e0: 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  nt decodeFlags(M
a6f0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
a700: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
a710: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
a720: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
a730: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
a740: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a750: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
a760: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
a770: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
a780: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a790: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a7a0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
a7b0: 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29  age->leaf = (u8)
a7c0: 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20  (flagByte>>3);  
a7d0: 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
a7e0: 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
a7f0: 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
a800: 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
a810: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
a820: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
a830: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
a840: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
a850: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
a860: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
a870: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
a880: 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ey = 1;.    pPag
a890: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61  e->hasData = pPa
a8a0: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50  ge->leaf;.    pP
a8b0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
a8c0: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
a8d0: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
a8e0: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
a8f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
a900: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
a910: 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67  DATA ){.    pPag
a920: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20  e->intKey = 0;. 
a930: 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74     pPage->hasDat
a940: 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  a = 0;.    pPage
a950: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
a960: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
a970: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
a980: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
a990: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
a9a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a9b0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
a9c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a9d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
a9e0: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
a9f0: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
aa00: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
aa10: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
aa20: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
aa30: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
aa40: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
aa50: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
aa60: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
aa70: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
aa80: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
aa90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
aaa0: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
aab0: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
aac0: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
aad0: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
aae0: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
aaf0: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
ab00: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
ab10: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
ab20: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
ab30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
ab40: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
ab50: 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61  ge *pPage){..  a
ab60: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
ab70: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
ab80: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
ab90: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
aba0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
abb0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
abc0: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
abd0: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
abe0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
abf0: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
ac00: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
ac10: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
ac20: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
ac30: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
ac40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
ac50: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
ac60: 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  age) );..  if( !
ac70: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
ac80: 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20  .    u16 pc;    
ac90: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
aca0: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
acb0: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
acc0: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
acd0: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
ace0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
acf0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
ad00: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
ad10: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
ad20: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
ad30: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
ad40: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
ad50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
ad60: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
ad70: 75 72 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 75  ure */.    u16 u
ad80: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
ad90: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
ada0: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
adb0: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
adc0: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
add0: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
ade0: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
adf0: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
ae00: 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e 46 72  r */.    u16 nFr
ae10: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
ae20: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
ae30: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
ae40: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 74 6f 70  e */.    u16 top
ae50: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
ae60: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
ae70: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
ae80: 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ea */.    int iC
ae90: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
aea0: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
aeb0: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
aec0: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  k offset */.    
aed0: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
aee0: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
aef0: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
af00: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
af10: 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65  .    pBt = pPage
af20: 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20  ->pBt;..    hdr 
af30: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
af40: 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  et;.    data = p
af50: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
af60: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
af70: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
af80: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
af90: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
afa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
afb0: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
afc0: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
afd0: 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 20 20 70  <=32768 );.    p
afe0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
aff0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
b000: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   1;.    pPage->n
b010: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
b020: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
b030: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
b040: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
b050: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
b060: 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  et = hdr + 12 - 
b070: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
b080: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
b090: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
b0a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
b0b0: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
b0c0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
b0d0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
b0e0: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
b0f0: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
b100: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
b110: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
b120: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
b130: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
b140: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b150: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b160: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
b170: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
b180: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  ELL(pBt) );..   
b190: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
b1a0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
b1b0: 67 68 74 20 63 61 75 73 65 20 75 73 65 20 74 6f  ght cause use to
b1c0: 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65   read past the e
b1d0: 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67  nd.    ** of pag
b1e0: 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61  e when parsing a
b1f0: 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a   cell.  .    **.
b200: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
b210: 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  wing block of co
b220: 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20  de checks early 
b230: 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c  to see if a cell
b240: 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20   extends.    ** 
b250: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
b260: 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20  a page boundary 
b270: 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54  and causes SQLIT
b280: 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20  E_CORRUPT to be 
b290: 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64  .    ** returned
b2a0: 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20   if it does..   
b2b0: 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72   */.    iCellFir
b2c0: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
b2d0: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
b2e0: 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20  ;.    iCellLast 
b2f0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
b300: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
b310: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
b320: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
b330: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74  .    {.      int
b340: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
b350: 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  * Index into the
b360: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
b370: 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ray */.      int
b380: 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f   sz;           /
b390: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
b3a0: 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21   */..      if( !
b3b0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
b3c0: 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20  ellLast--;.     
b3d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
b3e0: 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
b3f0: 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74          pc = get
b400: 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
b410: 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20  Offset+i*2]);.  
b420: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b430: 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  pc==iCellFirst )
b440: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
b450: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
b460: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
b470: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
b480: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
b490: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
b4a0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b4b0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
b4c0: 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63  }.        sz = c
b4d0: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
b4e0: 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
b4f0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b500: 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a  pc+sz==usableSiz
b510: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
b520: 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
b530: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
b540: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b550: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
b560: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
b570: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
b580: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b  eaf ) iCellLast+
b590: 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69  +;.    }  .#endi
b5a0: 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  f..    /* Comput
b5b0: 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65  e the total free
b5c0: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
b5d0: 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67  ge */.    pc = g
b5e0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
b5f0: 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65  r+1]);.    nFree
b600: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
b610: 20 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28   top;.    while(
b620: 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75   pc>0 ){.      u
b630: 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  16 next, size;. 
b640: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
b650: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
b660: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
b670: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20    /* Free block 
b680: 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20  is off the page 
b690: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
b6a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b6b0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
b6c0: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
b6d0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
b6e0: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
b6f0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
b700: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
b710: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
b720: 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20  pc+size+3 ){.   
b730: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
b740: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
b750: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a  scending order *
b760: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
b770: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b780: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
b790: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
b7a0: 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
b7b0: 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20   pc = next;.    
b7c0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
b7d0: 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63  s point, nFree c
b7e0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20  ontains the sum 
b7f0: 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  of the offset to
b800: 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a   the start.    *
b810: 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  * of the cell-co
b820: 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20  ntent area plus 
b830: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
b840: 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a  ee bytes within.
b850: 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d      ** the cell-
b860: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66  content area. If
b870: 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72   this is greater
b880: 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65   than the usable
b890: 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20  -size.    ** of 
b8a0: 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
b8b0: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
b8c0: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
b8d0: 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a  check also.    *
b8e0: 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
b8f0: 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
b900: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
b910: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
b920: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c  ent.    ** area,
b930: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
b940: 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c  e page header, l
b950: 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  ies within the p
b960: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
b970: 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
b980: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
b990: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b9a0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
b9b0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
b9c0: 65 20 3d 20 6e 46 72 65 65 20 2d 20 69 43 65 6c  e = nFree - iCel
b9d0: 6c 46 69 72 73 74 3b 0a 20 20 20 20 70 50 61 67  lFirst;.    pPag
b9e0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
b9f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
ba00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
ba10: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
ba20: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
ba30: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
ba40: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
ba50: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
ba60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
ba70: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
ba80: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
ba90: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
baa0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
bab0: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
bac0: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
bad0: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
bae0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
baf0: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
bb00: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
bb10: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
bb20: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
bb30: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
bb40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
bb50: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
bb60: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
bb70: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
bb80: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
bb90: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
bba0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
bbb0: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
bbc0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
bbd0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
bbe0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
bbf0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
bc00: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
bc10: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
bc20: 20 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74 61 5b   /*memset(&data[
bc30: 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73  hdr], 0, pBt->us
bc40: 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b  ableSize - hdr);
bc50: 2a 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d  */.  data[hdr] =
bc60: 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20   (char)flags;.  
bc70: 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20  first = hdr + 8 
bc80: 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f  + 4*((flags&PTF_
bc90: 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a  LEAF)==0 ?1:0);.
bca0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
bcb0: 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
bcc0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
bcd0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
bce0: 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75  a[hdr+5], pBt->u
bcf0: 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  sableSize);.  pP
bd00: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74  age->nFree = pBt
bd10: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
bd20: 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c  irst;.  decodeFl
bd30: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
bd40: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  );.  pPage->hdrO
bd50: 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70  ffset = hdr;.  p
bd60: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
bd70: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
bd80: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
bd90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
bda0: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
bdb0: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
bdc0: 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67  =32768 );.  pPag
bdd0: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42  e->maskPage = pB
bde0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b  t->pageSize - 1;
bdf0: 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
be00: 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  = 0;.  pPage->is
be10: 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  Init = 1;.}.../*
be20: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62  .** Convert a Db
be30: 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72  Page obtained fr
be40: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74  om the pager int
be50: 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64  o a MemPage used
be60: 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   by.** the btree
be70: 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   layer..*/.stati
be80: 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
be90: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44  PageFromDbPage(D
bea0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  bPage *pDbPage, 
beb0: 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61  Pgno pgno, BtSha
bec0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
bed0: 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d  Page *pPage = (M
bee0: 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
bef0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
bf00: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
bf10: 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50  aData = sqlite3P
bf20: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
bf30: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70  age);.  pPage->p
bf40: 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
bf50: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d  ;.  pPage->pBt =
bf60: 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70   pBt;.  pPage->p
bf70: 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50  gno = pgno;.  pP
bf80: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d  age->hdrOffset =
bf90: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20   pPage->pgno==1 
bfa0: 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74  ? 100 : 0;.  ret
bfb0: 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f  urn pPage; .}../
bfc0: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
bfd0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20  from the pager. 
bfe0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
bff0: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
c000: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
c010: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
c020: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ded..**.** If th
c030: 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67  e noContent flag
c040: 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e   is set, it mean
c050: 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
c060: 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74   care about.** t
c070: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
c080: 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
c090: 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20  ime.  So do not 
c0a0: 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a  go to the disk.*
c0b0: 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63  * to fetch the c
c0c0: 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69  ontent.  Just fi
c0d0: 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ll in the conten
c0e0: 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72  t with zeros for
c0f0: 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74   now..** If in t
c100: 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c  he future we cal
c110: 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
c120: 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61  ite() on this pa
c130: 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e  ge, that.** mean
c140: 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65  s we have starte
c150: 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65  d to be concerne
c160: 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20  d about content 
c170: 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20  and the disk.** 
c180: 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
c190: 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
c1a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
c1b0: 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42  treeGetPage(.  B
c1c0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
c1d0: 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
c1e0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
c1f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c200: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
c210: 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
c220: 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
c230: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
c240: 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
c250: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
c260: 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
c270: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61     /* Do not loa
c280: 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  d page content i
c290: 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69  f true */.){.  i
c2a0: 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
c2b0: 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
c2c0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c2d0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
c2e0: 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
c2f0: 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
c300: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
c310: 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
c320: 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65  pDbPage, noConte
c330: 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  nt);.  if( rc ) 
c340: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70  return rc;.  *pp
c350: 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
c360: 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
c370: 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
c380: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c390: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
c3a0: 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f  rieve a page fro
c3b0: 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
c3c0: 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  e. If the reques
c3d0: 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a  ted page is not.
c3e0: 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
c3f0: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65  e pager cache re
c400: 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69  turn NULL. Initi
c410: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
c420: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
c430: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
c440: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
c450: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
c460: 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75   *btreePageLooku
c470: 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
c480: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44   Pgno pgno){.  D
c490: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
c4a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c4b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
c4c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44  ->mutex) );.  pD
c4d0: 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  bPage = sqlite3P
c4e0: 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e  agerLookup(pBt->
c4f0: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
c500: 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a   if( pDbPage ){.
c510: 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
c520: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
c530: 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
c540: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
c550: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
c560: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
c570: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
c580: 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74  e in pages. If t
c590: 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
c5a0: 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65   of.** error, re
c5b0: 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20  turn ((unsigned 
c5c0: 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74  int)-1)..*/.stat
c5d0: 69 63 20 50 67 6e 6f 20 70 61 67 65 72 50 61 67  ic Pgno pagerPag
c5e0: 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20  ecount(BtShared 
c5f0: 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50 61  *pBt){.  int nPa
c600: 67 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72  ge = -1;.  int r
c610: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  c;.  assert( pBt
c620: 2d 3e 70 50 61 67 65 31 20 29 3b 0a 20 20 72 63  ->pPage1 );.  rc
c630: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
c640: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
c650: 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
c660: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
c670: 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d  ITE_OK || nPage=
c680: 3d 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  =-1 );.  return 
c690: 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a  (Pgno)nPage;.}..
c6a0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
c6b0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
c6c0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
c6d0: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
c6e0: 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f  .** is just a co
c6f0: 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65  nvenience wrappe
c700: 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74  r around separat
c710: 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 62 74  e calls to.** bt
c720: 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64  reeGetPage() and
c730: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
c740: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c750: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
c760: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
c770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c780: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
c790: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
c7a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c7b0: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
c7c0: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
c7d0: 67 65 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20  ge **ppPage     
c7e0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
c7f0: 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
c800: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
c810: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
c820: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c830: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
c840: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
c850: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
c860: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c870: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c880: 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20    }..  /* It is 
c890: 6f 66 74 65 6e 20 74 68 65 20 63 61 73 65 20 74  often the case t
c8a0: 68 61 74 20 74 68 65 20 70 61 67 65 20 77 65 20  hat the page we 
c8b0: 77 61 6e 74 20 69 73 20 61 6c 72 65 61 64 79 20  want is already 
c8c0: 69 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49  in cache..  ** I
c8d0: 66 20 73 6f 2c 20 67 65 74 20 69 74 20 64 69 72  f so, get it dir
c8e0: 65 63 74 6c 79 2e 20 20 54 68 69 73 20 73 61 76  ectly.  This sav
c8f0: 65 73 20 75 73 20 66 72 6f 6d 20 68 61 76 69 6e  es us from havin
c900: 67 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70  g to call.  ** p
c910: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20  agerPagecount() 
c920: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 70 67 6e  to make sure pgn
c930: 6f 20 69 73 20 77 69 74 68 69 6e 20 6c 69 6d 69  o is within limi
c940: 74 73 2c 20 77 68 69 63 68 20 72 65 73 75 6c 74  ts, which result
c950: 73 0a 20 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73  s.  ** in a meas
c960: 75 72 65 61 62 6c 65 20 70 65 72 66 6f 72 6d 61  ureable performa
c970: 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73  nce improvements
c980: 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  ..  */.  *ppPage
c990: 20 3d 20 70 50 61 67 65 20 3d 20 62 74 72 65 65   = pPage = btree
c9a0: 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
c9b0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61  pgno);.  if( pPa
c9c0: 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67  ge ){.    /* Pag
c9d0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
c9e0: 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 72 63 20  cache */.    rc 
c9f0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
ca00: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67  else{.    /* Pag
ca10: 65 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  e not in cache. 
ca20: 20 41 63 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a   Acquire it. */.
ca30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 67      testcase( pg
ca40: 6e 6f 3d 3d 70 61 67 65 72 50 61 67 65 63 6f 75  no==pagerPagecou
ca50: 6e 74 28 70 42 74 29 20 29 3b 0a 20 20 20 20 69  nt(pBt) );.    i
ca60: 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67  f( pgno>pagerPag
ca70: 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
ca80: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ca90: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
caa0: 20 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d   .    }.    rc =
cab0: 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
cac0: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
cad0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
cae0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
caf0: 20 70 50 61 67 65 20 3d 20 2a 70 70 50 61 67 65   pPage = *ppPage
cb00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
cb10: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
cb20: 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
cb30: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
cb40: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
cb50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65  E_OK ){.    rele
cb60: 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
cb70: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
cb80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
cb90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
cba0: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
cbb0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
cbc0: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
cbd0: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
cbe0: 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
cbf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
cc00: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
cc10: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
cc20: 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
cc30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
cc40: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
cc50: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
cc60: 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e  Refcount(pPage->
cc70: 70 44 62 50 61 67 65 29 3e 31 20 29 3b 0a 20 20  pDbPage)>1 );.  
cc80: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
cc90: 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
cca0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
ccb0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ccc0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
ccd0: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
cce0: 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
ccf0: 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Page );.    asse
cd00: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
cd10: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
cd20: 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
cd30: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
cd40: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
cd50: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
cd60: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
cd70: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
cd80: 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ref(pPage->pDbPa
cd90: 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ge);.  }.}../*.*
cda0: 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  * During a rollb
cdb0: 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61  ack, when the pa
cdc0: 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f  ger reloads info
cdd0: 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  rmation into the
cde0: 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61   cache.** so tha
cdf0: 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72  t the cache is r
ce00: 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
ce10: 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74  riginal state at
ce20: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
ce30: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
ce40: 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  , for each page 
ce50: 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f  restored this ro
ce60: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
ce70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ce80: 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73  ine needs to res
ce90: 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74  et the extra dat
cea0: 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65  a section at the
ceb0: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70   end of the.** p
cec0: 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74  age to agree wit
ced0: 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64  h the restored d
cee0: 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
cef0: 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44  oid pageReinit(D
cf00: 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20  bPage *pData){. 
cf10: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
cf20: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
cf30: 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
cf40: 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
cf50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
cf60: 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
cf70: 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29  count(pData)>0 )
cf80: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
cf90: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73  sInit ){.    ass
cfa0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
cfb0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
cfc0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
cfd0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
cfe0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
cff0: 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
d000: 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29  count(pData)>1 )
d010: 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  {.      /* pPage
d020: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20   might not be a 
d030: 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20  btree page;  it 
d040: 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72  might be an over
d050: 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20  flow page.      
d060: 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67  ** or ptrmap pag
d070: 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65  e or a free page
d080: 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65  .  In those case
d090: 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  s, the following
d0a0: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74  .      ** call t
d0b0: 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  o btreeInitPage(
d0c0: 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  ) will likely re
d0d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d0e0: 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75  UPT..      ** Bu
d0f0: 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e  t no harm is don
d100: 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20  e by this.  And 
d110: 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72  it is very impor
d120: 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20  tant that.      
d130: 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
d140: 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  () be called on 
d150: 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65  every btree page
d160: 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20   so we make.    
d170: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f    ** the call fo
d180: 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  r every page tha
d190: 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72  t comes in for r
d1a0: 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  e-initing. */.  
d1b0: 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67      btreeInitPag
d1c0: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  e(pPage);.    }.
d1d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
d1e0: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
d1f0: 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65  dler for a btree
d200: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d210: 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
d220: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72  andler(void *pAr
d230: 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
d240: 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a  pBt = (BtShared*
d250: 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28  )pArg;.  assert(
d260: 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73   pBt->db );.  as
d270: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d280: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62  tex_held(pBt->db
d290: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
d2a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f  turn sqlite3Invo
d2b0: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70  keBusyHandler(&p
d2c0: 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64  Bt->db->busyHand
d2d0: 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ler);.}../*.** O
d2e0: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
d2f0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c  ile..** .** zFil
d300: 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  ename is the nam
d310: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
d320: 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c  e file.  If zFil
d330: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a  ename is NULL.**
d340: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
d350: 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61  with a random na
d360: 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  me is created.  
d370: 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61  This randomly na
d380: 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  med.** database 
d390: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
d3a0: 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65  eted when sqlite
d3b0: 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
d3c0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a   called..** If z
d3d0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
d3e0: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69  mory:" then an i
d3f0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
d400: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
d410: 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
d420: 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20  cally destroyed 
d430: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
d440: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
d450: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
d460: 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68  ady opened in th
d470: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
d480: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e  connection.** an
d490: 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72  d we are in shar
d4a0: 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed cache mode, t
d4b0: 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c  hen the open wil
d4c0: 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a  l fail with an.*
d4d0: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
d4e0: 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63  INT error.  We c
d4f0: 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20  annot allow two 
d500: 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64  or more BtShared
d510: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  .** objects in t
d520: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
d530: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63   connection sinc
d540: 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20  e doing so will 
d550: 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c  lead.** to probl
d560: 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ems with locking
d570: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d580: 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e  BtreeOpen(.  con
d590: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
d5a0: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
d5b0: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
d5c0: 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61  ing the BTree da
d5d0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69  tabase */.  sqli
d5e0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
d5f0: 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65      /* Associate
d600: 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
d610: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70  e */.  Btree **p
d620: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f  pBtree,        /
d630: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
d640: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72   Btree object wr
d650: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20  itten here */.  
d660: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
d670: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f          /* Optio
d680: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  ns */.  int vfsF
d690: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
d6a0: 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
d6b0: 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
d6c0: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
d6d0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
d6e0: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20  fs *pVfs;       
d6f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
d700: 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73   to use for this
d710: 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68   btree */.  BtSh
d720: 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
d730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
d740: 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
d750: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
d760: 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
d790: 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
d7a0: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
d7b0: 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
d7c0: 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
d7d0: 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
d7e0: 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
d7f0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
d800: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
d810: 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
d820: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
d830: 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d850: 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
d860: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
d870: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
d880: 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
d890: 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
d8a0: 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
d8b0: 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74 20 74  t */..  /* Set t
d8c0: 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65  he variable isMe
d8d0: 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20  mdb to true for 
d8e0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
d8f0: 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20  abase, or .  ** 
d900: 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65  false for a file
d910: 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e  -based database.
d920: 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 20   This symbol is 
d930: 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66  only required if
d940: 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 66 20  .  ** either of 
d950: 74 68 65 20 73 68 61 72 65 64 2d 64 61 74 61 20  the shared-data 
d960: 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20 66 65  or autovacuum fe
d970: 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d 70 69  atures are compi
d980: 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20 74  led .  ** into t
d990: 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a 2f  he library..  */
d9a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
d9b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
d9c0: 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65 66 69  _CACHE) || !defi
d9d0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d9e0: 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20 23 69  AUTOVACUUM).  #i
d9f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
da00: 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 63 6f  _MEMORYDB.    co
da10: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
da20: 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20  = 0;.  #else.   
da30: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
da40: 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20 26  db = zFilename &
da50: 26 20 21 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  & !strcmp(zFilen
da60: 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29  ame, ":memory:")
da70: 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e 64 69  ;.  #endif.#endi
da80: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  f..  assert( db!
da90: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
daa0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
dab0: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
dac0: 0a 0a 20 20 70 56 66 73 20 3d 20 64 62 2d 3e 70  ..  pVfs = db->p
dad0: 56 66 73 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  Vfs;.  p = sqlit
dae0: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
daf0: 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69  eof(Btree));.  i
db00: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
db10: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
db20: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61  ;.  }.  p->inTra
db30: 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
db40: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23  .  p->db = db;.#
db50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
db60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
db70: 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65    p->lock.pBtree
db80: 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e   = p;.  p->lock.
db90: 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64  iTable = 1;.#end
dba0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
dbb0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
dbc0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
dbd0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
dbe0: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
dbf0: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
dc00: 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
dc10: 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
dc20: 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
dc30: 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
dc40: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
dc50: 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
dc60: 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
dc70: 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20 26 26  f( isMemdb==0 &&
dc80: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
dc90: 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
dca0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
dcb0: 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64  balConfig.shared
dcc0: 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a  CacheEnabled ){.
dcd0: 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
dce0: 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
dcf0: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
dd00: 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
dd10: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
dd20: 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74  3Malloc(nFullPat
dd30: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  hname);.      sq
dd40: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
dd50: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
dd60: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
dd70: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
dd80: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65   |= SQLITE_Share
dd90: 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66  dCache;.      if
dda0: 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
ddb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ddc0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
ddd0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
dde0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
ddf0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  }.      sqlite3O
de00: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
de10: 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
de20: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
de30: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
de40: 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20      mutexOpen = 
de50: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
de60: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
de70: 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20  TATIC_OPEN);.   
de80: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
de90: 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e  _enter(mutexOpen
dea0: 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  );.      mutexSh
deb0: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
dec0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
ded0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
dee0: 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TER);.      sqli
def0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
df00: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
df10: 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42      for(pBt=GLOB
df20: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
df30: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
df40: 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70  ist); pBt; pBt=p
df50: 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
df60: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
df70: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
df80: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
df90: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
dfa0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
dfb0: 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
dfc0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
dfd0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
dfe0: 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67  gerVfs(pBt->pPag
dff0: 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20  er)==pVfs ){.   
e000: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
e010: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44            for(iD
e020: 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62  b=db->nDb-1; iDb
e030: 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20  >=0; iDb--){.   
e040: 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a           Btree *
e050: 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e  pExisting = db->
e060: 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
e070: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
e080: 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73  xisting && pExis
e090: 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29  ting->pBt==pBt )
e0a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
e0b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
e0c0: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
e0d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
e0e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
e0f0: 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e110: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
e120: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
e130: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e140: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
e150: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e160: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
e170: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
e180: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e190: 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70        p->pBt = p
e1a0: 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42  Bt;.          pB
e1b0: 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  t->nRef++;.     
e1c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e1e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
e1f0: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
e200: 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  red);.      sqli
e210: 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
e220: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  thname);.    }.#
e230: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
e240: 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
e250: 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d     /* In debug m
e260: 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c  ode, we mark all
e270: 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61   persistent data
e280: 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c  bases as sharabl
e290: 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20  e.      ** even 
e2a0: 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f  when they are no
e2b0: 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73  t.  This exercis
e2c0: 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  es the locking c
e2d0: 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ode and.      **
e2e0: 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f   gives more oppo
e2f0: 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65  rtunity for asse
e300: 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  rts(sqlite3_mute
e310: 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20  x_held()).      
e320: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  ** statements to
e330: 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72   find locking pr
e340: 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f  oblems..      */
e350: 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
e360: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  le = 1;.    }.#e
e370: 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
e380: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
e390: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
e3a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
e3b0: 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68  rts make sure th
e3c0: 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73  at structures us
e3d0: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
e3e0: 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  are.    ** the r
e3f0: 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73  ight size.  This
e400: 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61   is to guard aga
e410: 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65  inst size change
e420: 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20  s that result.  
e430: 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c    ** when compil
e440: 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ing on a differe
e450: 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  nt architecture.
e460: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
e470: 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d  rt( sizeof(i64)=
e480: 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34  =8 || sizeof(i64
e490: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
e4a0: 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d  rt( sizeof(u64)=
e4b0: 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34  =8 || sizeof(u64
e4c0: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
e4d0: 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
e4e0: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
e4f0: 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
e500: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e510: 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
e520: 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
e530: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
e540: 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
e550: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
e560: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
e570: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e580: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
e590: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
e5a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
e5b0: 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
e5c0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
e5d0: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
e5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5f0: 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c    EXTRA_SIZE, fl
e600: 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a  ags, vfsFlags);.
e610: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e620: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
e630: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
e640: 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70  ReadFileheader(p
e650: 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f  Bt->pPager,sizeo
e660: 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62  f(zDbHeader),zDb
e670: 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Header);.    }. 
e680: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e690: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
e6a0: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
e6b0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  t;.    }.    pBt
e6c0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73  ->db = db;.    s
e6d0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
e6e0: 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syhandler(pBt->p
e6f0: 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f  Pager, btreeInvo
e700: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  keBusyHandler, p
e710: 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20  Bt);.    p->pBt 
e720: 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71  = pBt;.  .    sq
e730: 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
e740: 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65  niter(pBt->pPage
e750: 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  r, pageReinit);.
e760: 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
e770: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70   = 0;.    pBt->p
e780: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70  Page1 = 0;.    p
e790: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73  Bt->readOnly = s
e7a0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
e7b0: 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
e7c0: 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67  r);.    pBt->pag
e7d0: 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
e7e0: 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29  (&zDbHeader[16])
e7f0: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
e800: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
e810: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
e820: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
e830: 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
e840: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
e850: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
e860: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
e870: 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23  >pageSize = 0;.#
e880: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e890: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
e8a0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
e8b0: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
e8c0: 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
e8d0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
e8e0: 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
e8f0: 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
e900: 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
e910: 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
e920: 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
e930: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
e940: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
e950: 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
e960: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
e970: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
e980: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
e990: 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
e9a0: 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
e9b0: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
e9c0: 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
e9d0: 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
e9e0: 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
e9f0: 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
ea00: 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
ea10: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
ea20: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
ea30: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
ea40: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
ea50: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
ea60: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
ea70: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
ea80: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
ea90: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
eaa0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
eab0: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
eac0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
ead0: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
eae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
eaf0: 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
eb00: 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
eb10: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
eb20: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
eb30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
eb40: 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
eb50: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
eb60: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
eb70: 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
eb80: 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
eb90: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
eba0: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
ebb0: 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
ebc0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
ebd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
ebe0: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
ebf0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
ec00: 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
ec10: 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
ec20: 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
ec30: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
ec40: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
ec50: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
ec60: 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
ec70: 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
ec80: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
ec90: 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
eca0: 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
ecb0: 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
ecc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ecd0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
ece0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
ecf0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
ed00: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
ed10: 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
ed20: 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
ed30: 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
ed40: 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
ed50: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
ed60: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
ed70: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
ed80: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
ed90: 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
eda0: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
edb0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
edc0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
edd0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
ede0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
edf0: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
ee00: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
ee10: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
ee20: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
ee30: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
ee40: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
ee50: 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
ee60: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
ee70: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
ee80: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ee90: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
eea0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
eeb0: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
eec0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
eed0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
eee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
eef0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
ef00: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
ef10: 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
ef20: 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
ef30: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
ef40: 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
ef50: 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
ef60: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
ef70: 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
ef80: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
ef90: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
efa0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
efb0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
efc0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
efd0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
efe0: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
eff0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
f000: 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
f010: 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
f020: 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
f030: 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
f040: 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
f050: 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
f060: 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
f070: 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
f080: 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
f090: 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
f0a0: 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
f0b0: 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
f0c0: 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
f0d0: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
f0e0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
f0f0: 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
f100: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
f110: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
f120: 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64     if( (pSib = d
f130: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d  b->aDb[i].pBt)!=
f140: 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61  0 && pSib->shara
f150: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ble ){.        w
f160: 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65  hile( pSib->pPre
f170: 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62  v ){ pSib = pSib
f180: 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20  ->pPrev; }.     
f190: 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53     if( p->pBt<pS
f1a0: 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  ib->pBt ){.     
f1b0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
f1c0: 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
f1d0: 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
f1e0: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50          pSib->pP
f1f0: 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
f200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f210: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
f220: 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e  Next && pSib->pN
f230: 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20  ext->pBt<p->pBt 
f240: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
f250: 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  Sib = pSib->pNex
f260: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
f270: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
f280: 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  t = pSib->pNext;
f290: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
f2a0: 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  rev = pSib;.    
f2b0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65        if( p->pNe
f2c0: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
f2d0: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
f2e0: 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  v = p;.         
f2f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69   }.          pSi
f300: 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  b->pNext = p;.  
f310: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f320: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
f330: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
f340: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
f350: 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a  .btree_open_out:
f360: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
f370: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
f380: 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
f390: 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
f3a0: 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
f3b0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
f3c0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
f3d0: 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ee(pBt);.    sql
f3e0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
f3f0: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
f400: 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
f410: 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
f420: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
f430: 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
f440: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
f450: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
f460: 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  xOpen);.  }.  re
f470: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f480: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
f490: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
f4a0: 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
f4b0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
f4c0: 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
f4d0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
f4e0: 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
f4f0: 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
f500: 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
f510: 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
f520: 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
f530: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
f540: 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
f550: 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
f560: 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
f570: 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
f580: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
f590: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f5a0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
f5b0: 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  E.  sqlite3_mute
f5c0: 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42 74  x *pMaster;.  Bt
f5d0: 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
f5e0: 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
f5f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
f600: 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
f610: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
f620: 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71  ;.  pMaster = sq
f630: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
f640: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
f650: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73  TIC_MASTER);.  s
f660: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f670: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70  er(pMaster);.  p
f680: 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
f690: 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pBt->nRef<=0 )
f6a0: 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c  {.    if( GLOBAL
f6b0: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
f6c0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
f6d0: 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  t)==pBt ){.     
f6e0: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
f6f0: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
f700: 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d  acheList) = pBt-
f710: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
f720: 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
f730: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
f740: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
f750: 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
f760: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
f770: 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e  List) && pList->
f780: 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20  pNext!=pBt ){.  
f790: 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73        pList=pLis
f7a0: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
f7b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
f7c0: 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  YS(pList) ){.   
f7d0: 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78       pList->pNex
f7e0: 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
f7f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f800: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
f810: 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
f820: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
f830: 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b  ree(pBt->mutex);
f840: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76  .    }.    remov
f850: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  ed = 1;.  }.  sq
f860: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
f870: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
f880: 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65  turn removed;.#e
f890: 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  lse.  return 1;.
f8a0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
f8b0: 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70  Make sure pBt->p
f8c0: 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20  TmpSpace points 
f8d0: 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  to an allocation
f8e0: 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f   of .** MX_CELL_
f8f0: 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e  SIZE(pBt) bytes.
f900: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f910: 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
f920: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
f930: 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54  {.  if( !pBt->pT
f940: 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
f950: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
f960: 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
f970: 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  c( pBt->pageSize
f980: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   );.  }.}../*.**
f990: 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
f9a0: 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
f9b0: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
f9c0: 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
f9d0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
f9e0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
f9f0: 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ee( pBt->pTmpSpa
fa00: 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70  ce);.  pBt->pTmp
fa10: 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Space = 0;.}../*
fa20: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
fa30: 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
fa40: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
fa50: 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
fa60: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
fa70: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
fa80: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
fa90: 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
faa0: 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
fab0: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
fac0: 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
fad0: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
fae0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
faf0: 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
fb00: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
fb10: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
fb20: 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
fb30: 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
fb40: 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
fb50: 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
fb60: 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
fb70: 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
fb80: 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
fb90: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
fba0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
fbb0: 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
fbc0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
fbd0: 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
fbe0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
fbf0: 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
fc00: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
fc10: 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
fc20: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
fc30: 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
fc40: 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
fc50: 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
fc60: 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
fc70: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
fc80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
fc90: 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
fca0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
fcb0: 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
fcc0: 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
fcd0: 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
fce0: 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
fcf0: 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
fd00: 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
fd10: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
fd20: 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
fd30: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
fd40: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
fd50: 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
fd60: 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
fd70: 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
fd80: 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
fd90: 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
fda0: 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
fdb0: 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
fdc0: 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
fdd0: 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
fde0: 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
fdf0: 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
fe00: 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
fe10: 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
fe20: 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
fe30: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
fe40: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
fe50: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
fe60: 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
fe70: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
fe80: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
fe90: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
fea0: 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
feb0: 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
fec0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
fed0: 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
fee0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
fef0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ff00: 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
ff10: 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
ff20: 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
ff30: 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
ff40: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
ff50: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
ff60: 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70  ACHE.  assert( p
ff70: 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
ff80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
ff90: 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
ffa0: 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d  f( p->pPrev ) p-
ffb0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
ffc0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  p->pNext;.  if( 
ffd0: 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e  p->pNext ) p->pN
ffe0: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
fff0: 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20  pPrev;.#endif.. 
10000 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
10010 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10020 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
10030 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
10040 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
10050 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69   pages allowed i
10060 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  n the cache..**.
10070 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
10080 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
10090 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74  ages is set to t
100a0 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76  he absolute.** v
100b0 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20  alue of mxPage. 
100c0 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
100d0 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65  gative, the page
100e0 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  r will.** operat
100f0 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  e asynchronously
10100 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73   - it will not s
10110 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28  top to do fsync(
10120 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20  )s.** to insure 
10130 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
10140 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
10150 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  ace before.** co
10160 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73  ntinuing.  Trans
10170 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f  actions still wo
10180 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  rk if synchronou
10190 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64  s is off,.** and
101a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
101b0 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
101c0 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61  d if this progra
101d0 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42  m.** crashes.  B
101e0 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
101f0 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
10200 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a  es or there is.*
10210 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  * an abrupt powe
10220 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73  r failure when s
10230 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
10240 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  f, the database.
10250 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74  ** could be left
10260 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
10270 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65  ent and unrecove
10280 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20  rable state..** 
10290 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  Synchronous is o
102a0 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20  n by default so 
102b0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
102c0 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f  ion is not.** no
102d0 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a  rmally a worry..
102e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
102f0 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
10300 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
10310 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
10320 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
10330 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10340 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
10350 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
10360 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
10370 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
10380 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
10390 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
103a0 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
103b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
103c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
103d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
103e0 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
103f0 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
10400 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
10410 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
10420 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
10430 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
10440 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
10450 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
10460 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
10470 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
10480 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
10490 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
104a0 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
104b0 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
104c0 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
104d0 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
104e0 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
104f0 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
10500 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
10510 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
10520 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
10530 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
10540 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
10550 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
10560 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
10570 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
10580 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
10590 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
105a0 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
105b0 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
105c0 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79  e3BtreeSetSafety
105d0 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20  Level(Btree *p, 
105e0 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66  int level, int f
105f0 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68  ullSync){.  BtSh
10600 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
10610 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
10620 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10630 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
10640 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
10650 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
10660 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
10670 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67  yLevel(pBt->pPag
10680 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53  er, level, fullS
10690 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ync);.  sqlite3B
106a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
106b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
106c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
106d0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
106e0 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
106f0 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
10700 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
10710 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
10720 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
10730 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
10740 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
10750 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10760 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
10770 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
10780 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10790 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
107a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
107b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
107c0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
107d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
107e0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
107f0 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
10800 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
10810 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
10820 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
10830 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
10840 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
10850 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  n rc;.}..#if !de
10860 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10870 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
10880 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
10890 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
108a0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
108b0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
108c0 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
108d0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
108e0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
108f0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
10900 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
10910 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
10920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
10930 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
10940 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
10950 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
10960 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
10970 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
10980 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
10990 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
109a0 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
109b0 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
109c0 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
109d0 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
109e0 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
109f0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
10a00 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
10a10 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
10a20 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
10a30 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
10a40 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
10a50 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
10a60 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
10a70 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
10a80 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
10a90 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
10aa0 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
10ab0 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
10ac0 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
10ad0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
10ae0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
10af0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
10b00 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
10b10 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
10b20 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
10b30 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
10b40 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
10b50 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
10b60 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
10b70 65 6e 20 74 68 65 20 70 61 67 65 53 69 7a 65 46  en the pageSizeF
10b80 69 78 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  ixed flag is set
10b90 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
10ba0 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75  e size.** and au
10bb0 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61  tovacuum mode ca
10bc0 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63  n no longer be c
10bd0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
10be0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
10bf0 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
10c00 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
10c10 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74  nt nReserve, int
10c20 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   iFix){.  int rc
10c30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10c40 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
10c50 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
10c60 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
10c70 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
10c80 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
10c90 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
10ca0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
10cb0 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xed ){.    sqlit
10cc0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
10cd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10ce0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
10cf0 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
10d00 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
10d10 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
10d20 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
10d30 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
10d40 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
10d50 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
10d60 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
10d70 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
10d80 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
10d90 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
10da0 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
10db0 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
10dc0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
10dd0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
10de0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
10df0 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
10e00 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
10e10 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
10e20 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a  e = (u16)pageSiz
10e30 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
10e40 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20  pace(pBt);.  }. 
10e50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10e60 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
10e70 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
10e80 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
10e90 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61  rve);.  pBt->usa
10ea0 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
10eb0 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e  ageSize - (u16)n
10ec0 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69  Reserve;.  if( i
10ed0 46 69 78 20 29 20 70 42 74 2d 3e 70 61 67 65 53  Fix ) pBt->pageS
10ee0 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 20 20  izeFixed = 1;.  
10ef0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
10f00 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
10f10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
10f20 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
10f30 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
10f40 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
10f50 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
10f60 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
10f70 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
10f80 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
10f90 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
10fa0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
10fb0 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
10fc0 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
10fd0 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
10fe0 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
10ff0 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
11000 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
11010 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
11020 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
11030 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  tensions..*/.int
11040 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
11050 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
11060 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
11070 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11080 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74  p);.  n = p->pBt
11090 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
110a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
110b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
110c0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
110d0 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
110e0 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
110f0 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
11100 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
11110 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
11120 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
11130 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
11140 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
11150 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
11160 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
11170 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
11180 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
11190 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
111a0 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
111b0 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
111c0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
111d0 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
111e0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
111f0 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
11200 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
11210 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
11220 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
11230 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11240 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e   return n;.}.#en
11250 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
11260 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
11270 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
11280 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11290 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f  IT_VACUUM) */../
112a0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
112b0 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
112c0 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
112d0 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
112e0 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
112f0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
11300 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
11310 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
11320 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
11330 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
11340 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
11350 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
11360 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
11370 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
11380 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
11390 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
113a0 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
113b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
113c0 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
113d0 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
113e0 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
113f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
11400 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
11410 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
11420 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
11430 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
11440 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11450 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d  TE_OK;.  u8 av =
11460 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b   (u8)autoVacuum;
11470 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
11480 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
11490 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
114a0 65 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21  ed && (av ?1:0)!
114b0 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
114c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
114d0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
114e0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
114f0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20  autoVacuum = av 
11500 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69  ?1:0;.    pBt->i
11510 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d  ncrVacuum = av==
11520 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71  2 ?1:0;.  }.  sq
11530 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11540 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
11550 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
11560 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
11570 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
11580 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
11590 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
115a0 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
115b0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
115c0 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
115d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
115e0 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
115f0 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
11600 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
11610 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
11620 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
11630 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
11640 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
11650 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
11660 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
11670 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
11680 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
11690 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
116a0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
116b0 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
116c0 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
116d0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
116e0 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
116f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11700 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
11710 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
11720 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
11730 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
11740 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
11750 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
11760 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
11770 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
11780 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
11790 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
117a0 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
117b0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
117c0 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
117d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
117e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
117f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
11800 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
11810 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
11820 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
11830 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
11840 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
11850 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
11860 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
11870 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
11880 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
11890 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
118a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
118b0 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
118c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
118d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
118e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
118f0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
11900 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  =0 );.  rc = btr
11910 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
11920 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20  , &pPage1, 0);. 
11930 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11940 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
11950 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
11960 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
11970 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
11980 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
11990 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
119a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
119b0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
119c0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
119d0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
119e0 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
119f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11a00 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
11a10 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c  it_failed;.  }el
11a20 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  se if( nPage>0 )
11a30 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69  {.    int pageSi
11a40 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62  ze;.    int usab
11a50 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
11a60 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
11a70 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
11a80 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
11a90 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
11aa0 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
11ab0 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
11ac0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
11ad0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
11ae0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
11af0 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
11b00 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
11b10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11b20 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
11b30 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
11b40 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
11b50 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  }..    /* The ma
11b60 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66  ximum embedded f
11b70 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
11b80 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e  exactly 25%.  An
11b90 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20  d the minimum.  
11ba0 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72    ** embedded fr
11bb0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31  action must be 1
11bc0 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65  2.5% for both le
11bd0 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d  af-data and non-
11be0 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a  leaf-data..    *
11bf0 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  * The original d
11c00 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68  esign allowed th
11c10 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76  ese amounts to v
11c20 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20  ary, but as of. 
11c30 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
11c40 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20  6.0, we require 
11c50 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64  them to be fixed
11c60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11c70 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32   memcmp(&page1[2
11c80 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34  1], "\100\040\04
11c90 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20  0",3)!=0 ){.    
11ca0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
11cb0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
11cc0 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67      pageSize = g
11cd0 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31  et2byte(&page1[1
11ce0 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  6]);.    if( ((p
11cf0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
11d00 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53  ize)!=0 || pageS
11d10 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20  ize<512 ||.     
11d20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50     (SQLITE_MAX_P
11d30 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26  AGE_SIZE<32768 &
11d40 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  & pageSize>SQLIT
11d50 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
11d60 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
11d70 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
11d80 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
11d90 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
11da0 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
11db0 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
11dc0 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
11dd0 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65  0];.    if( page
11de0 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
11df0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
11e00 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
11e10 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
11e20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
11e30 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
11e40 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
11e50 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
11e60 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
11e70 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
11e80 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
11e90 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
11ea0 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
11eb0 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
11ec0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
11ed0 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
11ee0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
11ef0 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
11f00 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
11f10 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
11f20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
11f30 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
11f40 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11f50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
11f60 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge1);.      pBt-
11f70 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75  >usableSize = (u
11f80 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  16)usableSize;. 
11f90 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
11fa0 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69  ze = (u16)pageSi
11fb0 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
11fc0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
11fd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11fe0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
11ff0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
12000 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12030 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
12040 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
12050 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
12060 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65    if( usableSize
12070 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <480 ){.      go
12080 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
12090 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
120a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
120b0 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u16)pageSize;. 
120c0 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
120d0 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65  ze = (u16)usable
120e0 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
120f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
12100 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
12110 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
12120 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
12130 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
12140 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
12150 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
12160 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
12170 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
12180 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
12190 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
121a0 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
121b0 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
121c0 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
121d0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
121e0 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
121f0 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
12200 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
12210 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
12220 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
12230 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
12240 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
12250 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
12260 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
12270 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
12280 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
12290 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
122a0 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
122b0 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
122c0 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
122d0 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
122e0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
122f0 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
12300 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
12310 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
12320 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
12330 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
12340 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65  yte poiner, a he
12350 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73  ader which is as
12360 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37   much as.  ** 17
12370 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74   bytes long, 0 t
12380 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79  o N bytes of pay
12390 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74  load, and an opt
123a0 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65  ional 4 byte ove
123b0 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20  rflow.  ** page 
123c0 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
123d0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  pBt->maxLocal = 
123e0 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
123f0 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
12400 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  ;.  pBt->minLoca
12410 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
12420 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
12430 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78  - 23;.  pBt->max
12440 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62  Leaf = pBt->usab
12450 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70  leSize - 35;.  p
12460 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70  Bt->minLeaf = (p
12470 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
12480 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*32/255 - 23;.
12490 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
124a0 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
124b0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
124c0 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
124d0 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65  1 = pPage1;.  re
124e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
124f0 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
12500 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
12510 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
12520 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
12530 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12540 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
12550 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
12560 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
12570 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
12580 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
12590 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
125a0 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
125b0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
125c0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
125d0 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
125e0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
125f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12600 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
12610 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
12620 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
12630 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
12640 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
12650 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
12660 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
12670 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
12680 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
12690 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
126a0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
126b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
126c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
126d0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
126e0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72  ssert( pBt->pCur
126f0 73 6f 72 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69  sor==0 || pBt->i
12700 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41  nTransaction>TRA
12710 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28  NS_NONE );.  if(
12720 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
12730 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
12740 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
12750 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
12760 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
12770 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
12780 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
12790 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
127a0 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  ger)==1 );.    a
127b0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
127c0 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
127d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74   releasePage(pBt
127e0 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70  ->pPage1);.    p
127f0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
12800 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65    }.}../*.** Cre
12810 61 74 65 20 61 20 6e 65 77 20 64 61 74 61 62 61  ate a new databa
12820 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  se by initializi
12830 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
12840 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
12850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12860 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
12870 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
12880 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
12890 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
128a0 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  a;.  int rc;.  i
128b0 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73  nt nPage;..  ass
128c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
128d0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
128e0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
128f0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
12900 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
12910 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &nPage);.  if( 
12920 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
12930 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
12940 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
12950 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
12960 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
12970 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
12980 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
12990 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
129a0 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
129b0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
129c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
129d0 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
129e0 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
129f0 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
12a00 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
12a10 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
12a20 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  6 );.  put2byte(
12a30 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e  &data[16], pBt->
12a40 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
12a50 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
12a60 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
12a70 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
12a80 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
12a90 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
12aa0 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
12ab0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
12ac0 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
12ad0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
12ae0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
12af0 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
12b00 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
12b10 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
12b20 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
12b30 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
12b40 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
12b50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
12b60 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
12b70 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61  ATA );.  pBt->pa
12b80 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
12b90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12ba0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
12bb0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
12bc0 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
12bd0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
12be0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12bf0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
12c00 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
12c10 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
12c20 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
12c30 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
12c40 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
12c50 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
12c60 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
12c70 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
12c80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12c90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  K;.}../*.** Atte
12ca0 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
12cb0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
12cc0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
12cd0 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
12ce0 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
12cf0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
12d00 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
12d10 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
12d20 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
12d30 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
12d40 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
12d50 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
12d60 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
12d70 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
12d80 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
12d90 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
12da0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
12db0 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
12dc0 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
12dd0 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
12de0 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
12df0 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
12e00 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
12e10 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
12e20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
12e30 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
12e40 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
12e50 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
12e60 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
12e70 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
12e80 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
12e90 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
12ea0 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
12eb0 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
12ec0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
12ed0 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
12ee0 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
12ef0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
12f00 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
12f10 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
12f20 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
12f30 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
12f40 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
12f50 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
12f60 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
12f70 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
12f80 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
12f90 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
12fa0 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
12fb0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
12fc0 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
12fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
12fe0 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
12ff0 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
13000 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
13010 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
13020 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
13030 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
13040 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
13050 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
13060 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
13070 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
13080 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
13090 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
130a0 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
130b0 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
130c0 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
130d0 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
130e0 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
130f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
13100 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
13110 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
13120 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
13130 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
13140 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
13150 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
13160 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
13170 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
13180 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
13190 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
131a0 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
131b0 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
131c0 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
131d0 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
131e0 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
131f0 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
13200 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
13210 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
13220 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
13230 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
13240 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
13250 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
13260 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
13270 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
13280 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
13290 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
132a0 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
132b0 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
132c0 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
132d0 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
132e0 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
132f0 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
13300 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
13310 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
13320 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
13330 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
13340 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
13350 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
13360 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63    sqlite3 *pBloc
13370 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65  k = 0;.  BtShare
13380 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
13390 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
133a0 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65  TE_OK;..  sqlite
133b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
133c0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
133d0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
133e0 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61  e btree is alrea
133f0 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72  dy in a write-tr
13400 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74  ansaction, or it
13410 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  .  ** is already
13420 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73   in a read-trans
13430 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61  action and a rea
13440 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d-transaction.  
13450 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ** is requested,
13460 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
13470 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
13480 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
13490 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72  RITE || (p->inTr
134a0 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ans==TRANS_READ 
134b0 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20  && !wrflag) ){. 
134c0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
134d0 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  gun;.  }..  /* W
134e0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
134f0 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  s are not possib
13500 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c  le on a read-onl
13510 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
13520 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
13530 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  y && wrflag ){. 
13540 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
13550 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
13560 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
13570 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
13580 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
13590 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f  ACHE.  /* If ano
135a0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
135b0 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
135c0 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
135d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
135e0 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
135f0 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
13600 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
13610 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
13620 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  is.  ** requeste
13630 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
13640 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20  _LOCKED..  */.  
13650 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
13660 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13670 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20  n==TRANS_WRITE) 
13680 7c 7c 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e  || pBt->isPendin
13690 67 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20  g ){.    pBlock 
136a0 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
136b0 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  db;.  }else if( 
136c0 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
136d0 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
136e0 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
136f0 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
13700 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
13710 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
13720 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
13730 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63  ){.        pBloc
13740 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
13750 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62  e->db;.        b
13760 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
13770 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42    }.  }.  if( pB
13780 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  lock ){.    sqli
13790 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
137a0 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f  cked(p->db, pBlo
137b0 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ck);.    rc = SQ
137c0 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
137d0 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74  EDCACHE;.    got
137e0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
137f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
13800 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  Any read-only or
13810 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e   read-write tran
13820 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  saction implies 
13830 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a  a read-lock on .
13840 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20    ** page 1. So 
13850 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68  if some other sh
13860 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
13870 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  t already has a 
13880 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a  write-lock .  **
13890 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20   on page 1, the 
138a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e  transaction cann
138b0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f  ot be opened. */
138c0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
138d0 21 3d 28 72 63 20 3d 20 71 75 65 72 79 53 68 61  !=(rc = querySha
138e0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
138f0 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
13900 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 29 20 29 7b  , READ_LOCK)) ){
13910 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
13920 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 64 6f  begun;.  }..  do
13930 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
13940 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
13950 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
13960 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
13970 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
13980 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
13990 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
139a0 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
139b0 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
139c0 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
139d0 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
139e0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
139f0 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
13a00 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
13a10 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
13a20 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
13a30 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
13a40 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
13a50 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
13a60 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
13a70 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
13a80 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
13a90 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
13aa0 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
13ab0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
13ac0 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
13ad0 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
13ae0 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
13af0 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
13b00 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
13b10 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13b20 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
13b30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42   ){.      if( pB
13b40 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
13b50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
13b60 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
13b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13b80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13b90 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  gerBegin(pBt->pP
13ba0 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71  ager,wrflag>1,sq
13bb0 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
13bc0 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  y(p->db));.     
13bd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13be0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13bf0 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
13c00 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
13c10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
13c20 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d  .  .    if( rc!=
13c30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13c40 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
13c50 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
13c60 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d   }.  }while( rc=
13c70 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
13c80 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
13c90 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
13ca0 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
13cb0 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
13cc0 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
13cd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13ce0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
13cf0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
13d00 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
13d10 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
13d20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13d30 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
13d40 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
13d50 61 72 61 62 6c 65 20 29 7b 0a 09 61 73 73 65 72  arable ){..asser
13d60 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  t( p->lock.pBtre
13d70 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e  e==p && p->lock.
13d80 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
13d90 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f       p->lock.eLo
13da0 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
13db0 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
13dc0 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
13dd0 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  ck;.        pBt-
13de0 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63  >pLock = &p->loc
13df0 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
13e00 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  f.    }.    p->i
13e10 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
13e20 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
13e30 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
13e40 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
13e50 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
13e60 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
13e70 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
13e80 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
13e90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13ea0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
13eb0 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
13ec0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
13ed0 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
13ee0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
13ef0 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
13f00 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
13f10 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e 31   = (u8)(wrflag>1
13f20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
13f30 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
13f40 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
13f50 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
13f60 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
13f70 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
13f80 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
13f90 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
13fa0 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
13fb0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
13fc0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
13fd0 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
13fe0 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
13ff0 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
14000 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
14010 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
14020 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
14030 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
14040 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14050 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
14060 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
14070 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
14080 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
14090 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
140a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
140b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
140c0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
140d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
140e0 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
140f0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
14100 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
14110 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
14120 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
14130 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
14140 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
14150 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
14160 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
14170 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
14180 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
14190 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
141a0 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
141b0 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
141c0 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
141d0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
141e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
14200 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
14210 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
14220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14230 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14240 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
14250 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
14260 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
14270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14280 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
14290 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
142a0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
142b0 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
142c0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
142d0 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
142e0 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
142f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14300 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
14310 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
14320 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
14330 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
14340 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14350 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63  {.    goto set_c
14360 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
14370 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20  ;.  }.  nCell = 
14380 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
14390 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
143a0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
143b0 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
143c0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
143d0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
143e0 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
143f0 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
14400 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14410 20 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63        goto set_c
14420 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
14430 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
14440 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
14450 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
14460 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
14470 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72  (pCell);.      r
14480 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
14490 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
144a0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
144b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
144c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
144d0 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
144e0 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  aps_out;.    }. 
144f0 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
14500 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
14510 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
14520 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
14530 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
14540 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
14550 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
14560 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
14570 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
14580 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69  o);.  }..set_chi
14590 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a  ld_ptrmaps_out:.
145a0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
145b0 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
145c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
145d0 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e  .** Somewhere on
145e0 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e   pPage is a poin
145f0 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
14600 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20  m.  Modify this 
14610 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68  pointer so.** th
14620 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
14630 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
14640 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
14650 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
14660 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69  er to.** be modi
14670 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77  fied, as  follow
14680 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
14690 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
146a0 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
146b0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
146c0 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
146d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
146e0 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
146f0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
14700 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
14710 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
14720 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
14730 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
14740 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
14750 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
14760 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
14770 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
14780 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
14790 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
147a0 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
147b0 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
147c0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
147d0 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
14800 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
14810 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
14820 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
14830 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
14840 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
14850 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73   u8 eType){.  as
14860 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14870 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
14880 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
14890 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
148a0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
148b0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
148c0 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d   );.  if( eType=
148d0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
148e0 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
148f0 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
14900 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
14910 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
14920 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
14930 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
14940 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
14950 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
14960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
14970 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
14980 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
14990 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
149a0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
149b0 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
149c0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
149d0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
149e0 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62  nt nCell;..    b
149f0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
14a00 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d  ge);.    nCell =
14a10 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
14a20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
14a30 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
14a40 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
14a50 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
14a60 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
14a70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
14a80 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
14a90 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
14aa0 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
14ab0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
14ac0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
14ad0 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
14ae0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
14af0 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
14b00 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
14b10 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
14b20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
14b30 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c   put4byte(&pCell
14b40 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
14b50 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
14b60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
14b80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14b90 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
14ba0 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
14bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
14bc0 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
14bd0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
14be0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
14bf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
14c00 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
14c10 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
14c20 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
14c30 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
14c40 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
14c50 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
14c60 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
14c70 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
14c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
14c90 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
14ca0 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
14cb0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
14cc0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
14cd0 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  8], iTo);.    }.
14ce0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
14cf0 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
14d00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
14d10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
14d20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
14d30 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
14d40 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
14d50 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
14d60 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
14d70 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
14d80 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
14d90 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  valid..*/.static
14da0 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
14db0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
14dc0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
14dd0 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
14de0 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
14df0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
14e00 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
14e10 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
14e20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
14e30 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
14e40 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
14e50 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
14e60 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
14e70 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
14e80 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
14e90 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
14ea0 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20  no iFreePage,   
14eb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
14ec0 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
14ed0 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69  DbPage to */.  i
14ee0 6e 74 20 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20  nt isCommit.){. 
14ef0 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
14f00 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
14f10 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
14f20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
14f30 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
14f40 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
14f50 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
14f60 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
14f70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
14f80 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
14f90 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
14fa0 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
14fb0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
14fc0 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
14fd0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
14fe0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
14ff0 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
15000 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15010 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
15020 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
15030 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
15040 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
15050 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
15060 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
15070 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
15080 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
15090 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
150a0 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
150b0 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
150c0 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
150d0 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
150e0 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
150f0 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
15100 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
15110 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
15120 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
15130 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
15140 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
15150 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
15160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15170 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
15180 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
15190 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
151a0 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
151b0 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
151c0 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
151d0 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
151e0 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
151f0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
15200 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
15210 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
15220 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
15230 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
15240 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
15250 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
15260 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
15270 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
15280 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
15290 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
152a0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
152b0 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
152c0 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
152d0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
152e0 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
152f0 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
15300 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
15310 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
15320 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
15330 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
15340 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
15350 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
15360 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
15370 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
15380 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
15390 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
153a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
153b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
153c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
153d0 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
153e0 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
153f0 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
15400 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
15410 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
15420 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
15430 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
15440 57 32 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a  W2, iFreePage);.
15450 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15460 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15470 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15480 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15490 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
154a0 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
154b0 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
154c0 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
154d0 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
154e0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
154f0 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
15500 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
15510 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
15520 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
15530 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
15540 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
15550 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
15560 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
15570 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
15580 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
15590 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
155a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
155b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
155c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
155d0 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
155e0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
155f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15600 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
15610 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
15620 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15630 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
15640 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
15650 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
15660 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
15670 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
15680 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
15690 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
156a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
156b0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
156c0 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
156d0 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a  ype, iPtrPage);.
156e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
156f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
15700 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
15710 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
15720 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
15730 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
15740 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
15750 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
15760 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
15770 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
15780 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
15790 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
157a0 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
157b0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
157c0 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
157d0 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
157e0 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
157f0 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
15800 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c  .** point in cal
15810 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
15820 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
15830 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a  n SQLITE_DONE..*
15840 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  *.** More specif
15850 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  icly, this funct
15860 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
15870 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
15880 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20  .** database so 
15890 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
158a0 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
158b0 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a  urrently in use.
158c0 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  ** is no longer 
158d0 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  in use..**.** If
158e0 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65   the nFin parame
158f0 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
15900 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
15910 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74  ion assumes.** t
15920 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hat the caller w
15930 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
15940 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
15950 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65  ) until.** it re
15960 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
15970 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61  E or an error, a
15980 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20  nd that nFin is 
15990 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
159a0 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62   pages the datab
159b0 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f  ase file will co
159c0 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73  ntain after this
159d0 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20   .** process is 
159e0 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61  complete..*/.sta
159f0 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75  tic int incrVacu
15a00 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20  umStep(BtShared 
15a10 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c  *pBt, Pgno nFin,
15a20 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b 0a   Pgno iLastPg){.
15a30 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74    Pgno nFreeList
15a40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
15a50 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
15a60 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65  till on the free
15a70 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
15a80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15a90 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
15aa0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
15ab0 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a  iLastPg>nFin );.
15ac0 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49  .  if( !PTRMAP_I
15ad0 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
15ae0 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d  Pg) && iLastPg!=
15af0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
15b00 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69 6e  E(pBt) ){.    in
15b10 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54 79  t rc;.    u8 eTy
15b20 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
15b30 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65  rPage;..    nFre
15b40 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65  eList = get4byte
15b50 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
15b60 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69  Data[36]);.    i
15b70 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
15b80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
15b90 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
15ba0 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
15bb0 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
15bc0 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
15bd0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
15be0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15bf0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
15c00 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
15c10 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
15c20 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
15c30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
15c40 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
15c50 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
15c60 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
15c70 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
15c80 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nFin==0 ){.     
15c90 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
15ca0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
15cb0 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
15cc0 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
15cd0 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
15ce0 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a  if nFin is non-z
15cf0 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
15d00 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
15d10 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
15d20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
15d30 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
15d40 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
15d50 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
15d60 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
15d70 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
15d80 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
15d90 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
15da0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
15db0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
15dc0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
15dd0 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
15de0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
15df0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
15e00 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
15e10 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20  , iLastPg, 1);. 
15e20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
15e30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15e40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
15e50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15e60 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
15e70 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
15e80 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
15e90 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
15ea0 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
15eb0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
15ec0 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
15ed0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
15ee0 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
15ef0 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
15f00 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
15f10 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20  stPg;..      rc 
15f20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
15f30 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
15f40 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
15f50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15f60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
15f70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
15f80 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46  ..      /* If nF
15f90 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  in is zero, this
15fa0 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
15fb0 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
15fc0 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
15fd0 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
15fe0 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
15ff0 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
16000 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
16010 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
16020 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
16030 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20  and, if nFin is 
16040 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
16050 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
16060 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
16070 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
16080 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
16090 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
160a0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
160b0 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
160c0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
160d0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
160e0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
160f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
16100 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
16110 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
16120 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a  iFreePg, 0, 0);.
16130 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
16140 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16150 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
16160 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
16170 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16180 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16190 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
161a0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
161b0 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20  }while( nFin!=0 
161c0 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
161d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
161e0 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
161f0 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
16200 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16210 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d  erWrite(pLastPg-
16220 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
16230 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16240 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
16250 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
16260 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
16270 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
16280 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29  FreePg, nFin!=0)
16290 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
162a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
162b0 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tPg);.      if( 
162c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
162d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
162e0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
162f0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69  }.  }..  if( nFi
16300 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73  n==0 ){.    iLas
16310 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65  tPg--;.    while
16320 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
16330 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
16340 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45  )||PTRMAP_ISPAGE
16350 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
16360 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54 52 4d  {.      if( PTRM
16370 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
16380 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
16390 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 3b     MemPage *pPg;
163a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
163b0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
163c0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50  Bt, iLastPg, &pP
163d0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 0);.        i
163e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
163f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
16400 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
16410 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
16420 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
16430 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
16440 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
16450 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
16460 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16470 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16480 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
164a0 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
164b0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
164c0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
164d0 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
164e0 20 69 4c 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20   iLastPg);.  }. 
164f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16500 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  K;.}../*.** A wr
16510 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
16520 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
16530 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
16540 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
16550 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
16560 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
16570 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
16580 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
16590 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
165a0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
165b0 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
165c0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
165d0 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
165e0 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
165f0 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
16600 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
16610 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
16620 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
16630 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
16640 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
16650 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
16660 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16670 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
16680 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
16690 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
166a0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
166b0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
166c0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
166d0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
166e0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
166f0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
16700 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
16710 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
16720 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
16730 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
16740 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69  else{.    invali
16750 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
16760 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72  ache(pBt);.    r
16770 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
16780 65 70 28 70 42 74 2c 20 30 2c 20 70 61 67 65 72  ep(pBt, 0, pager
16790 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b  Pagecount(pBt));
167a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
167b0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
167c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
167d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
167e0 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
167f0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
16800 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
16810 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
16820 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61  ommited for an a
16830 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
16840 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
16850 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
16860 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
16870 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
16880 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
16890 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
168a0 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
168b0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
168c0 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
168d0 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
168e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
168f0 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
16900 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
16910 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
16920 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
16930 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
16940 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
16950 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
16960 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
16970 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
16980 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
16990 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
169a0 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
169b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
169c0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
169d0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
169e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
169f0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
16a00 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
16a10 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
16a20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
16a30 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
16a40 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
16a50 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
16a60 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
16a70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
16a80 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
16a90 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b  .    Pgno nFree;
16aa0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16ab0 72 20 6f 66 20 70 61 67 65 73 20 6e 6f 20 74 68  r of pages no th
16ac0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
16ad0 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20    Pgno nPtrmap; 
16ae0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16af0 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74  f PtrMap pages t
16b00 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
16b10 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20    Pgno iFree;   
16b20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
16b30 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65   page to be free
16b40 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 6e  d */.    int nEn
16b50 74 72 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  try;        /* N
16b60 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
16b70 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70   on one ptrmap p
16b80 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
16b90 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a  nOrig;        /*
16ba0 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   Database size b
16bb0 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f  efore freeing */
16bc0 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 70 61  ..    nOrig = pa
16bd0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
16be0 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  );.    if( PTRMA
16bf0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
16c00 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
16c10 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
16c20 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
16c30 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
16c40 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
16c50 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
16c60 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
16c70 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
16c80 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
16c90 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
16ca0 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
16cb0 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
16cc0 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
16cd0 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
16ce0 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
16cf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
16d00 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
16d10 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
16d20 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
16d30 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
16d40 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
16d50 20 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d     nEntry = pBt-
16d60 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20  >usableSize/5;. 
16d70 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46     nPtrmap = (nF
16d80 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
16d90 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
16da0 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74  ig)+nEntry)/nEnt
16db0 72 79 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e  ry;.    nFin = n
16dc0 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e  Orig - nFree - n
16dd0 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66 28 20  Ptrmap;.    if( 
16de0 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59  nOrig>PENDING_BY
16df0 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
16e00 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54  nFin<PENDING_BYT
16e10 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
16e20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
16e30 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54   }.    while( PT
16e40 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
16e50 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
16e60 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
16e70 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
16e80 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nFin--;.    }.  
16e90 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67    if( nFin>nOrig
16ea0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
16eb0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a  _CORRUPT_BKPT;..
16ec0 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f      for(iFree=nO
16ed0 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20  rig; iFree>nFin 
16ee0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
16ef0 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20  ; iFree--){.    
16f00 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
16f10 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
16f20 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20   iFree);.    }. 
16f30 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
16f40 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53  TE_DONE || rc==S
16f50 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72  QLITE_OK) && nFr
16f60 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
16f70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16f80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16f90 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
16fa0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
16fb0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
16fc0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
16fd0 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20  Data[32], 0);.  
16fe0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
16ff0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
17000 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [36], 0);.      
17010 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
17020 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
17030 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20  Pager, nFin);.  
17040 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
17050 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17060 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
17070 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
17080 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
17090 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69  sert( nRef==sqli
170a0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
170b0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
170c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
170d0 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  e /* ifndef SQLI
170e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
170f0 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73  UM */.# define s
17100 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78  etChildPtrmaps(x
17110 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
17120 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
17130 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
17140 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
17150 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
17160 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
17170 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
17180 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
17190 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
171a0 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
171b0 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
171c0 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
171d0 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
171e0 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
171f0 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
17200 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
17210 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
17220 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
17230 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
17240 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
17250 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
17260 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17270 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
17280 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
17290 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
172a0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
172b0 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
172c0 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
172d0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
172e0 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
172f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
17300 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
17310 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
17320 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
17330 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
17340 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
17350 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
17360 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
17370 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
17380 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
17390 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
173a0 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
173b0 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
173c0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
173d0 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65  Two() for the se
173e0 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
173f0 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
17400 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
17410 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
17420 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
17430 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
17440 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
17450 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
17460 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
17470 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
17480 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
17490 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
174a0 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
174b0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
174c0 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
174d0 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
174e0 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
174f0 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
17500 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
17510 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
17520 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
17530 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
17540 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
17550 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
17560 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
17570 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
17580 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
17590 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
175a0 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
175b0 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
175c0 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
175d0 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
175e0 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
175f0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
17600 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
17610 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
17620 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
17630 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
17640 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
17650 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
17660 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
17670 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
17680 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
17690 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
176a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
176b0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
176c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
176d0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
176e0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
176f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
17700 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
17710 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
17720 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
17730 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
17740 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
17750 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
17760 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
17770 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
17780 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17790 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
177a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
177b0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
177c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
177d0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
177e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
177f0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
17800 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
17810 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
17820 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
17830 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
17840 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17850 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
17860 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f  s called from bo
17870 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  th BtreeCommitPh
17880 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72  aseTwo() and Btr
17890 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  eeRollback().** 
178a0 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
178b0 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  n of a transacti
178c0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
178d0 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  id btreeEndTrans
178e0 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29  action(Btree *p)
178f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
17900 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
17910 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20  Cursor *pCsr;.  
17920 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
17930 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
17940 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63  ) );..  /* Searc
17950 68 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 68  h for a cursor h
17960 65 6c 64 20 6f 70 65 6e 20 62 79 20 74 68 69 73  eld open by this
17970 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65 63 74 69   b-tree connecti
17980 6f 6e 2e 20 49 66 20 6f 6e 65 20 65 78 69 73 74  on. If one exist
17990 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  s,.  ** then the
179a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
179b0 6c 20 62 65 20 64 6f 77 6e 67 72 61 64 65 64 20  l be downgraded 
179c0 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
179d0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
179e0 69 6e 73 74 65 61 64 20 6f 66 20 61 63 74 75 61  instead of actua
179f0 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 2e 20 41  lly concluded. A
17a00 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
17a10 20 74 6f 20 43 6f 6d 6d 69 74 50 68 61 73 65 54   to CommitPhaseT
17a20 77 6f 28 29 20 0a 20 20 2a 2a 20 6f 72 20 52 6f  wo() .  ** or Ro
17a30 6c 6c 62 61 63 6b 28 29 20 77 69 6c 6c 20 66 69  llback() will fi
17a40 6e 69 73 68 20 74 68 65 20 74 72 61 6e 73 61 63  nish the transac
17a50 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tion and unlock 
17a60 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a  the database.  *
17a70 2f 0a 20 20 66 6f 72 28 70 43 73 72 3d 70 42 74  /.  for(pCsr=pBt
17a80 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 73 72 20  ->pCursor; pCsr 
17a90 26 26 20 70 43 73 72 2d 3e 70 42 74 72 65 65 21  && pCsr->pBtree!
17aa0 3d 70 3b 20 70 43 73 72 3d 70 43 73 72 2d 3e 70  =p; pCsr=pCsr->p
17ab0 4e 65 78 74 29 3b 0a 20 20 61 73 73 65 72 74 28  Next);.  assert(
17ac0 20 70 43 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e 69   pCsr==0 || p->i
17ad0 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
17ae0 45 20 29 3b 0a 0a 20 20 62 74 72 65 65 43 6c 65  E );..  btreeCle
17af0 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
17b00 29 3b 0a 20 20 69 66 28 20 70 43 73 72 20 29 7b  );.  if( pCsr ){
17b10 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c  .    downgradeAl
17b20 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
17b30 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70  eLocks(p);.    p
17b40 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
17b50 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  S_READ;.  }else{
17b60 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68  .    /* If the h
17b70 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69  andle had any ki
17b80 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f  nd of transactio
17b90 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e  n open, decremen
17ba0 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72  t the .    ** tr
17bb0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
17bc0 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74  of the shared bt
17bd0 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e  ree. If the tran
17be0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20  saction count . 
17bf0 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c     ** reaches 0,
17c00 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
17c10 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
17c20 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42  ONE. The unlockB
17c30 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20  treeIfUnused(). 
17c40 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77     ** call below
17c50 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65   will unlock the
17c60 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20   pager.  */.    
17c70 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
17c80 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
17c90 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72      clearAllShar
17ca0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
17cb0 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  s(p);.      pBt-
17cc0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
17cd0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42  .      if( 0==pB
17ce0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
17cf0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
17d00 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
17d10 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
17d20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
17d30 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e  * Set the curren
17d40 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  t transaction st
17d50 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
17d60 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  E and unlock the
17d70 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69   .    ** pager i
17d80 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73  f this call clos
17d90 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64  ed the only read
17da0 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
17db0 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70  ction.  */.    p
17dc0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
17dd0 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f  S_NONE;.    unlo
17de0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
17df0 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
17e00 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
17e10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
17e20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
17e30 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
17e40 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
17e50 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
17e60 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
17e70 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
17e80 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
17e90 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
17ea0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
17eb0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
17ec0 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64   first phase and
17ed0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e   should.** be in
17ee0 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63  voked prior to c
17ef0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
17f00 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ine.  The sqlite
17f10 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
17f20 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  eOne().** routin
17f30 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f  e did all the wo
17f40 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e  rk of writing in
17f50 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f  formation out to
17f60 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69   disk and flushi
17f70 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
17f80 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ts so that they 
17f90 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f  are written onto
17fa0 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65   the disk platte
17fb0 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20  r.  All this.** 
17fc0 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64  routine has to d
17fd0 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74  o is delete or t
17fe0 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
17ff0 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68  the header in th
18000 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  e.** the rollbac
18010 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68  k journal (which
18020 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e   causes the tran
18030 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69  saction to commi
18040 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c  t) and.** drop l
18050 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ocks..**.** This
18060 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
18070 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
18080 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18090 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
180a0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
180b0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
180c0 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
180d0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
180e0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
180f0 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
18100 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
18110 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
18120 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
18130 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
18140 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
18150 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
18160 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  has a write-tran
18170 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f  saction open, co
18180 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d  mmit the shared-
18190 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61  btrees .  ** tra
181a0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74  nsaction and set
181b0 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
181c0 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e  e to TRANS_READ.
181d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
181e0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
181f0 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
18200 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
18210 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
18220 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
18230 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
18240 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
18250 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
18260 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
18270 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50  PhaseTwo(pBt->pP
18280 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
18290 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
182a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
182b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
182c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
182d0 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72   }.    pBt->inTr
182e0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
182f0 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62  S_READ;.  }..  b
18300 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
18310 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
18320 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18340 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62  K;.}../*.** Do b
18350 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20  oth phases of a 
18360 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73  commit..*/.int s
18370 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
18380 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
18390 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
183a0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
183b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
183c0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
183d0 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  (p, 0);.  if( rc
183e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
183f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
18400 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
18410 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  wo(p);.  }.  sql
18420 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18430 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18440 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
18450 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
18460 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69  he number of wri
18470 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  te-cursors open 
18480 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  on this handle. 
18490 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
184a0 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
184b0 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
184c0 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
184d0 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
184e0 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
184f0 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
18500 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72  rposes of this r
18510 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d  outine, a write-
18520 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75  cursor is any cu
18530 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20  rsor that.** is 
18540 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69  capable of writi
18550 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 73  ng to the databs
18560 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  e.  That means t
18570 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a  he cursor was.**
18580 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e   originally open
18590 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ed for writing a
185a0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  nd the cursor ha
185b0 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65  s not be disable
185c0 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69  d.** by having i
185d0 74 73 20 73 74 61 74 65 20 63 68 61 6e 67 65 64  ts state changed
185e0 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
185f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18600 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
18610 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  s(BtShared *pBt)
18620 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
18630 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
18640 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
18650 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
18660 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
18670 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
18680 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d  >wrFlag && pCur-
18690 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
186a0 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20  FAULT ) r++; .  
186b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
186c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
186d0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
186e0 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52  the state to CUR
186f0 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68  SOR_FAULT and th
18700 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
18710 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65  to errCode for e
18720 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42  very cursor on B
18730 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74  tShared that pBt
18740 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ree.** reference
18750 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63  s..**.** Every c
18760 75 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64  ursor is tripped
18770 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73  , including curs
18780 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a  ors that belong.
18790 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61  ** to other data
187a0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
187b0 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20   that happen to 
187c0 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68  be sharing.** th
187d0 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74  e cache with pBt
187e0 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ree..**.** This 
187f0 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c  routine gets cal
18800 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62  led when a rollb
18810 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41  ack occurs..** A
18820 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67  ll cursors using
18830 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20   the same cache 
18840 6d 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a  must be tripped.
18850 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  ** to prevent th
18860 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  em from trying t
18870 6f 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20  o use the btree 
18880 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c  after.** the rol
18890 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c  lback.  The roll
188a0 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
188b0 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20  leted tables.** 
188c0 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61  or moved root pa
188d0 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f  ges, so it is no
188e0 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a  t sufficient to.
188f0 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74  ** save the stat
18900 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e  e of the cursor.
18910 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
18920 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61  t be.** invalida
18930 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
18940 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
18950 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70  Cursors(Btree *p
18960 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f  Btree, int errCo
18970 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  de){.  BtCursor 
18980 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  *p;.  sqlite3Btr
18990 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
189a0 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
189b0 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
189c0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
189d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71     int i;.    sq
189e0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
189f0 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d  ursor(p);.    p-
18a00 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
18a10 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73  _FAULT;.    p->s
18a20 6b 69 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20  kip = errCode;. 
18a30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
18a40 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
18a50 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
18a60 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  (p->apPage[i]);.
18a70 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b        p->apPage[
18a80 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
18a90 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
18aa0 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d  Leave(pBtree);.}
18ab0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
18ac0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18ad0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41   in progress.  A
18ae0 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20  ll cursors will 
18af0 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20  be.** invalided 
18b00 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
18b10 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  n.  Any attempt 
18b20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a  to use a cursor.
18b30 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  ** that was open
18b40 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
18b50 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74  g of this operat
18b60 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a  ion will result.
18b70 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  ** in an error..
18b80 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
18b90 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
18ba0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
18bb0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
18bc0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
18bd0 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
18be0 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
18bf0 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
18c00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18c10 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
18c20 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
18c30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
18c40 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65  t = p->pBt;.  Me
18c50 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a  mPage *pPage1;..
18c60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
18c70 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
18c80 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
18c90 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65  t, 0, 0);.#ifnde
18ca0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
18cb0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28  ARED_CACHE.  if(
18cc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18cd0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
18ce0 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75   a horrible situ
18cf0 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20  ation. An IO or 
18d00 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
18d10 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 0a 20  ccurred whilst. 
18d20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20     ** trying to 
18d30 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69  save cursor posi
18d40 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69  tions. If this i
18d50 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72  s an automatic r
18d60 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20  ollback (as.    
18d70 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ** the result of
18d80 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d   a constraint, m
18d90 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20  alloc() failure 
18da0 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65  or IO error) the
18db0 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61  n .    ** the ca
18dc0 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72  che may be inter
18dd0 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
18de0 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  nt (not contain 
18df0 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a  valid trees) so.
18e00 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74      ** we cannot
18e10 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74   simply return t
18e20 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20  he error to the 
18e30 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c  caller. Instead,
18e40 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61   abort .    ** a
18e50 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74 20  ll queries that 
18e60 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79  may be using any
18e70 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20   of the cursors 
18e80 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73  that failed to s
18e90 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ave..    */.    
18ea0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
18eb0 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63  AllCursors(p, rc
18ec0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
18ed0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
18ee0 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
18ef0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
18f00 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
18f10 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ;..    assert( T
18f20 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
18f30 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
18f40 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
18f50 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
18f60 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
18f70 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
18f80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18f90 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
18fa0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
18fb0 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
18fc0 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
18fd0 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
18fe0 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
18ff0 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f  btreeGetPage() o
19000 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74  n page 1 again t
19010 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
19020 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  re pPage1->aData
19030 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
19040 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74  y. */.    if( bt
19050 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
19060 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
19070 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19080 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
19090 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
190a0 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57    assert( countW
190b0 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29  riteCursors(pBt)
190c0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
190d0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
190e0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a  TRANS_READ;.  }.
190f0 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
19100 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
19110 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19120 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19130 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
19140 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
19150 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
19160 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
19170 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
19180 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
19190 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
191a0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
191b0 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
191c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
191d0 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
191e0 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
191f0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
19200 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
19210 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
19220 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
19230 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
19240 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
19250 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
19260 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
19270 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
19280 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
19290 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
192a0 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
192b0 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
192c0 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
192d0 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
192e0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
192f0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
19300 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
19310 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
19320 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
19330 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
19340 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
19350 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
19360 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
19370 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
19380 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
19390 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
193a0 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
193b0 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
193c0 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
193d0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
193e0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
193f0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
19400 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
19410 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
19420 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
19430 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
19440 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
19450 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
19460 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
19470 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
19480 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
19490 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
194a0 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
194b0 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
194c0 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
194d0 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
194e0 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
194f0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
19500 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
19510 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
19520 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
19530 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
19540 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
19550 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
19560 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
19570 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
19580 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
19590 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
195a0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
195b0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 72    assert( pBt->r
195c0 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadOnly==0 );.  
195d0 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
195e0 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
195f0 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e  ( iStatement>p->
19600 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  db->nSavepoint )
19610 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d  ;.  if( NEVER(p-
19620 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
19630 57 52 49 54 45 20 7c 7c 20 70 42 74 2d 3e 72 65  WRITE || pBt->re
19640 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72  adOnly) ){.    r
19650 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
19660 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NAL;.  }else{.  
19670 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
19680 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
19690 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
196a0 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
196b0 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
196c0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
196d0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
196e0 69 74 68 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e  ith.    ** an in
196f0 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
19700 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
19710 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
19720 6c 79 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20  ly using.    ** 
19730 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  SQL statements. 
19740 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
19750 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f   open, release o
19760 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20  r rollback any. 
19770 20 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70     ** such savep
19780 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
19790 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
197a0 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
197b0 69 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 2a  is active..    *
197c0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
197d0 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
197e0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
197f0 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
19800 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
19810 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
19820 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19830 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
19840 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
19850 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c  ction, op, is al
19860 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  ways SAVEPOINT_R
19870 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41  OLLBACK.** or SA
19880 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
19890 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   This function e
198a0 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f  ither releases o
198b0 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  r rolls back the
198c0 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64  .** savepoint id
198d0 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
198e0 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74  meter iSavepoint
198f0 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
19900 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  he value .** of 
19910 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  op..**.** Normal
19920 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69  ly, iSavepoint i
19930 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
19940 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e  r equal to zero.
19950 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20   However, if op 
19960 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
19970 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69  ROLLBACK, then i
19980 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c  Savepoint may al
19990 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69  so be -1. In thi
199a0 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63  s case the .** c
199b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65  ontents of the e
199c0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
199d0 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  n are rolled bac
199e0 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
199f0 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e  rent.** from a n
19a00 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  ormal transactio
19a10 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e  n rollback, as n
19a20 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65  o locks are rele
19a30 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ased and the.** 
19a40 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61  transaction rema
19a50 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74  ins open..*/.int
19a60 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
19a70 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c  epoint(Btree *p,
19a80 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
19a90 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
19aa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19ab0 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e    if( p && p->in
19ac0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
19ad0 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
19ae0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
19af0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
19b00 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
19b10 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  ASE || op==SAVEP
19b20 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
19b30 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61  .    assert( iSa
19b40 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69  vepoint>=0 || (i
19b50 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26  Savepoint==-1 &&
19b60 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
19b70 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20  OLLBACK) );.    
19b80 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
19b90 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r(p);.    rc = s
19ba0 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
19bb0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
19bc0 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74  , op, iSavepoint
19bd0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
19be0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19bf0 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
19c00 73 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  se(pBt);.    }. 
19c10 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
19c20 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
19c30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19c40 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
19c50 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
19c60 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
19c70 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
19c80 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72  * iTable. If a r
19c90 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20  ead-only cursor 
19ca0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
19cb0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
19cc0 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61  .** the caller a
19cd0 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65  lready has at le
19ce0 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ast a read-only 
19cf0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
19d00 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62  .** on the datab
19d10 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20  ase already. If 
19d20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
19d30 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  s requested, the
19d40 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  n.** the caller 
19d50 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61  is assumed to ha
19d60 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
19d70 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
19d80 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30  .** If wrFlag==0
19d90 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
19da0 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  r can only be us
19db0 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  ed for reading..
19dc0 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c  ** If wrFlag==1,
19dd0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
19de0 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
19df0 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a   reading or for.
19e00 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74  ** writing if ot
19e10 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66  her conditions f
19e20 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61  or writing are a
19e30 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a  lso met.  These.
19e40 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69  ** are the condi
19e50 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
19e60 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20  be met in order 
19e70 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a  for writing to.*
19e80 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a  * be allowed:.**
19e90 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73  .** 1:  The curs
19ea0 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  or must have bee
19eb0 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  n opened with wr
19ec0 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a  Flag==1.**.** 2:
19ed0 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
19ee0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
19ef0 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
19f00 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
19f10 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
19f20 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
19f30 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
19f40 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
19f50 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
19f60 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
19f70 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
19f80 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
19f90 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
19fa0 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
19fb0 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
19fc0 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
19fd0 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
19fe0 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
19ff0 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
1a000 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
1a010 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
1a020 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
1a030 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
1a040 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
1a050 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
1a060 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
1a070 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1a080 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
1a090 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
1a0a0 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
1a0b0 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
1a0c0 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
1a0d0 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
1a0e0 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
1a0f0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
1a100 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
1a110 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
1a120 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  .**.** It is ass
1a130 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71  umed that the sq
1a140 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1a150 53 69 7a 65 28 29 20 62 79 74 65 73 20 6f 66 20  Size() bytes of 
1a160 6d 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e 74  memory .** point
1a170 65 64 20 74 6f 20 62 79 20 70 43 75 72 20 68 61  ed to by pCur ha
1a180 76 65 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62  ve been zeroed b
1a190 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  y the caller..*/
1a1a0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
1a1b0 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
1a1c0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1e0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
1a1f0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1a220 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
1a230 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
1a240 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a260 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
1a270 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
1a280 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
1a290 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a2b0 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
1a2c0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
1a2d0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
1a2e0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a300 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
1a310 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  sor */.){.  BtSh
1a320 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1a330 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
1a340 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74     /* Shared b-t
1a350 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20  ree handle */.. 
1a360 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1a370 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
1a380 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
1a390 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46  wrFlag==0 || wrF
1a3a0 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  lag==1 );..  /* 
1a3b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
1a3c0 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
1a3d0 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74  verify that if t
1a3e0 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c  his is a sharabl
1a3f0 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64  e .  ** b-tree d
1a400 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e  atabase, the con
1a410 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
1a420 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ng the required 
1a430 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20  table locks, .  
1a440 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f  ** and that no o
1a450 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
1a460 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  has any open cur
1a470 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63  sor that conflic
1a480 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68  ts with .  ** th
1a490 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  is lock.  */.  a
1a4a0 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
1a4b0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
1a4c0 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e  , iTable, pKeyIn
1a4d0 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29  fo!=0, wrFlag+1)
1a4e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
1a4f0 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52  Flag==0 || !hasR
1a500 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
1a510 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a  iTable) );..  /*
1a520 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
1a530 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e   caller has open
1a540 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ed the required 
1a550 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a  transaction. */.
1a560 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1a570 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
1a580 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1a590 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54  lag==0 || p->inT
1a5a0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1a5b0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
1a5c0 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42  Bt->pPage1 && pB
1a5d0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1a5e0 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   );..  if( NEVER
1a5f0 28 77 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrFlag && pBt->
1a600 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
1a610 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
1a620 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
1a630 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20  f( iTable==1 && 
1a640 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
1a650 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Bt)==0 ){.    re
1a660 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54  turn SQLITE_EMPT
1a670 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  Y;.  }..  /* Now
1a680 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
1a690 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
1a6a0 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
1a6b0 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
1a6c0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61    ** variables a
1a6d0 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73  nd link the curs
1a6e0 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68  or into the BtSh
1a6f0 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20  ared list.  */. 
1a700 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
1a710 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a  = (Pgno)iTable;.
1a720 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
1a730 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  -1;.  pCur->pKey
1a740 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
1a750 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
1a760 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  = p;.  pCur->pBt
1a770 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e   = pBt;.  pCur->
1a780 77 72 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46  wrFlag = (u8)wrF
1a790 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65  lag;.  pCur->pNe
1a7a0 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
1a7b0 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  r;.  if( pCur->p
1a7c0 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72  Next ){.    pCur
1a7d0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
1a7e0 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74   pCur;.  }.  pBt
1a7f0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
1a800 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
1a810 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1a820 44 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65  D;.  pCur->cache
1a830 64 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 72 65  dRowid = 0;.  re
1a840 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a850 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
1a860 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
1a870 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a890 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1a8a0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1a8b0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8d0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
1a8e0 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
1a8f0 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
1a900 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a920 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
1a930 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
1a940 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
1a950 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a970 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
1a980 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
1a990 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a9c0 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
1a9d0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1a9e0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1a9f0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1aa00 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
1aa10 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
1aa20 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
1aa30 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ur);.  sqlite3Bt
1aa40 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1aa50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1aa60 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
1aa70 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
1aa80 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
1aa90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
1aaa0 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
1aab0 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
1aac0 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
1aad0 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
1aae0 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
1aaf0 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
1ab00 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
1ab10 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
1ab20 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
1ab30 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
1ab40 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
1ab50 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
1ab60 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
1ab70 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
1ab80 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1ab90 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
1aba0 20 72 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42   return sizeof(B
1abb0 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a  tCursor);.}../*.
1abc0 2a 2a 20 53 65 74 20 74 68 65 20 63 61 63 68 65  ** Set the cache
1abd0 64 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66  d rowid value of
1abe0 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e   every cursor in
1abf0 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
1ac00 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43  se file.** as pC
1ac10 75 72 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68  ur and having th
1ac20 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65  e same root page
1ac30 20 6e 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e   number as pCur.
1ac40 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a    The value is.*
1ac50 2a 20 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e  * set to iRowid.
1ac60 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69  .**.** Only posi
1ac70 74 69 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65  tive rowid value
1ac80 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1ac90 20 76 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20   valid for this 
1aca0 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61  cache..** The ca
1acb0 63 68 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  che is initializ
1acc0 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69  ed to zero, indi
1acd0 63 61 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69  cating an invali
1ace0 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74  d cache..** A bt
1acf0 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69  ree will work fi
1ad00 6e 65 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20  ne with zero or 
1ad10 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e  negative rowids.
1ad20 20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74    We just cannot
1ad30 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f  .** cache zero o
1ad40 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  r negative rowid
1ad50 73 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  s, which means t
1ad60 61 62 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a  ables that use z
1ad70 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69  ero or.** negati
1ad80 76 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20  ve rowids might 
1ad90 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f  run a little slo
1ada0 77 65 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61  wer.  But in pra
1adb0 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  ctice, zero.** o
1adc0 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  r negative rowid
1add0 73 20 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d  s are very uncom
1ade0 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75  mon so this shou
1adf0 6c 64 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62  ld not be a prob
1ae00 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lem..*/.void sql
1ae10 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
1ae20 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  edRowid(BtCursor
1ae30 20 2a 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f   *pCur, sqlite3_
1ae40 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20  int64 iRowid){. 
1ae50 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
1ae60 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d  for(p=pCur->pBt-
1ae70 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
1ae80 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1ae90 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70  ( p->pgnoRoot==p
1aea0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20  Cur->pgnoRoot ) 
1aeb0 70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d  p->cachedRowid =
1aec0 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61   iRowid;.  }.  a
1aed0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63  ssert( pCur->cac
1aee0 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64  hedRowid==iRowid
1aef0 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   );.}../*.** Ret
1af00 75 72 6e 20 74 68 65 20 63 61 63 68 65 64 20 72  urn the cached r
1af10 6f 77 69 64 20 66 6f 72 20 74 68 65 20 67 69 76  owid for the giv
1af20 65 6e 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65  en cursor.  A ne
1af30 67 61 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a  gative or zero.*
1af40 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
1af50 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
1af60 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 69 73  e rowid cache is
1af70 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
1af80 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65  uld be.** ignore
1af90 64 2e 20 20 49 66 20 74 68 65 20 72 6f 77 69 64  d.  If the rowid
1afa0 20 63 61 63 68 65 20 68 61 73 20 6e 65 76 65 72   cache has never
1afb0 20 62 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74   before been set
1afc0 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f  , then a.** zero
1afd0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1afe0 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73  .sqlite3_int64 s
1aff0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 43 61  qlite3BtreeGetCa
1b000 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73  chedRowid(BtCurs
1b010 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
1b020 75 72 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64  urn pCur->cached
1b030 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
1b040 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20  Close a cursor. 
1b050 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f   The read lock o
1b060 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1b070 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a  ile is released.
1b080 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
1b090 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65   cursor is close
1b0a0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1b0b0 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
1b0c0 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
1b0d0 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  ){.  Btree *pBtr
1b0e0 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  ee = pCur->pBtre
1b0f0 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  e;.  if( pBtree 
1b100 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1b110 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1b120 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20  = pCur->pBt;.   
1b130 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1b140 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
1b150 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1b160 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
1b170 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72     if( pCur->pPr
1b180 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ev ){.      pCur
1b190 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
1b1a0 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
1b1b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1b1c0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
1b1d0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
1b1e0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
1b1f0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43  Next ){.      pC
1b200 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ur->pNext->pPrev
1b210 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a   = pCur->pPrev;.
1b220 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
1b230 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
1b240 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
1b250 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
1b260 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
1b270 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72   }.    unlockBtr
1b280 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1b290 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  .    invalidateO
1b2a0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
1b2b0 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  r);.    /* sqlit
1b2c0 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a  e3_free(pCur); *
1b2d0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
1b2e0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
1b2f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1b300 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1b310 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1b320 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
1b330 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
1b340 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
1b350 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
1b360 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
1b370 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
1b380 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72  lid, call.** btr
1b390 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
1b3a0 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
1b3b0 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
1b3c0 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
1b3d0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
1b3e0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
1b3f0 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
1b400 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
1b410 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
1b420 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73  lls to btreePars
1b430 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32  eCell()..**.** 2
1b440 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72  007-06-25:  Ther
1b450 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f  e is a bug in so
1b460 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d  me versions of M
1b470 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74  SVC that cause t
1b480 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74  he.** compiler t
1b490 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74  o crash when get
1b4a0 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d  CellInfo() is im
1b4b0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d  plemented as a m
1b4c0 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65  acro..** But the
1b4d0 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61  re is a measurea
1b4e0 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74  ble speed advant
1b4f0 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65  age to using the
1b500 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a   macro on gcc.**
1b510 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70   (when less comp
1b520 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  iler optimizatio
1b530 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d  ns like -Os or -
1b540 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20  O0 are used and 
1b550 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
1b560 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72  is not doing agr
1b570 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e  essive inlining.
1b580 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72  )  So we use a r
1b590 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  eal function.** 
1b5a0 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d  for MSVC and a m
1b5b0 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68  acro for everyth
1b5c0 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65  ing else.  Ticke
1b5d0 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e  t #2457..*/.#ifn
1b5e0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
1b5f0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
1b600 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
1b610 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
1b620 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
1b630 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
1b640 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  ->iPage;.    mem
1b650 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
1b660 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
1b670 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1b680 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1b690 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  ge], pCur->aiIdx
1b6a0 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b  [iPage], &info);
1b6b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
1b6c0 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
1b6d0 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
1b6e0 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nfo))==0 );.  }.
1b6f0 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
1b700 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78  assertCellInfo(x
1b710 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
1b720 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73  _MSC_VER.  /* Us
1b730 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
1b740 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72  n in MSVC to wor
1b750 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e  k around bugs in
1b760 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20   that compiler. 
1b770 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
1b780 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
1b790 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1b7a0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
1b7b0 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
1b7c0 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1b7d0 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
1b7e0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1b7f0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1b800 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
1b810 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
1b820 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72  nfo);.      pCur
1b830 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
1b840 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b850 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
1b860 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
1b870 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f  }.#else /* if no
1b880 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20  t _MSC_VER */.  
1b890 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69  /* Use a macro i
1b8a0 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70  n all other comp
1b8b0 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68  ilers so that th
1b8c0 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  e function is in
1b8d0 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  lined */.#define
1b8e0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1b8f0 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20          \.  if( 
1b930 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1b940 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b970 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69           \.    i
1b980 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1b990 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  >iPage;         
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9c0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1b9d0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1b9e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1b9f0 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
1ba00 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
1ba10 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e  o); \.    pCur->
1ba20 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20  validNKey = 1;  
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba60 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bab0 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65        \.    asse
1bac0 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
1bad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb00 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e         \.  }.#en
1bb10 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20  dif /* _MSC_VER 
1bb20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
1bb30 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
1bb40 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
1bb50 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
1bb60 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
1bb70 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
1bb80 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
1bb90 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
1bba0 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
1bbb0 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
1bbc0 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
1bbd0 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
1bbe0 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
1bbf0 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
1bc00 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
1bc10 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
1bc20 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
1bc30 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1bc40 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f  s in the key..*/
1bc50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1bc60 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
1bc70 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
1bc80 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
1bc90 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1bca0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1bcb0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
1bcc0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
1bcd0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
1bce0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bcf0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1bd00 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1bd10 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
1bd20 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1bd30 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
1bd40 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1bd50 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
1bd60 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  {.      *pSize =
1bd70 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1bd80 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
1bd90 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
1bda0 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
1bdb0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  o.nKey;.    }.  
1bdc0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1bdd0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
1bde0 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
1bdf0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
1be00 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
1be10 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
1be20 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
1be30 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e  .  Always return
1be40 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
1be50 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
1be60 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20  ssible.  If the 
1be70 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75  cursor is not cu
1be80 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
1be90 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  ing to an entry 
1bea0 28 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65  (which can happe
1beb0 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n, for example, 
1bec0 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  if.** the databa
1bed0 73 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65  se is empty) the
1bee0 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  n *pSize is set 
1bef0 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  to 0..*/.int sql
1bf00 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
1bf10 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1bf20 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
1bf30 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1bf40 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1bf50 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1bf60 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
1bf70 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
1bf80 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1bf90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1bfa0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1bfb0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1bfc0 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
1bfd0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1bfe0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
1bff0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1c000 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
1c010 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67   /* Not pointing
1c020 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72   at a valid entr
1c030 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74  y - set *pSize t
1c040 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70  o 0. */.      *p
1c050 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Size = 0;.    }e
1c060 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65  lse{.      getCe
1c070 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1c080 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75      *pSize = pCu
1c090 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  r->info.nData;. 
1c0a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1c0b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
1c0c0 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
1c0d0 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
1c0e0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1c0f0 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
1c100 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
1c110 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
1c120 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1c130 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
1c140 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
1c150 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
1c160 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
1c170 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
1c180 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
1c190 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
1c1a0 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
1c1b0 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
1c1c0 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
1c1d0 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
1c1e0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1c1f0 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
1c200 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1c210 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1c220 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
1c230 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1c240 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
1c250 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
1c260 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
1c270 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
1c280 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
1c290 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1c2a0 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
1c2b0 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
1c2c0 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
1c2d0 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
1c2e0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
1c2f0 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
1c300 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
1c310 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
1c320 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
1c330 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
1c340 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
1c350 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
1c360 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
1c370 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
1c380 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
1c390 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
1c3a0 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
1c3b0 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
1c3c0 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
1c3d0 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
1c3e0 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
1c3f0 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
1c400 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
1c410 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
1c420 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
1c430 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
1c440 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
1c450 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1c460 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
1c470 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
1c480 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
1c490 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
1c4a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1c4b0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1c4c0 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20   Pgno ovfl,     
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c4e0 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f   Current overflo
1c4f0 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
1c500 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
1c510 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
1c520 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
1c530 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e  handle (may be N
1c540 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ULL) */.  Pgno *
1c550 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
1c560 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
1c570 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
1c580 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
1c590 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
1c5a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1c5b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
1c5c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
1c5d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1c5e0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1c5f0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1c600 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23  t(pPgnoNext);..#
1c610 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c620 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1c630 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
1c640 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1c650 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
1c660 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
1c670 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
1c680 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
1c690 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
1c6a0 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
1c6b0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
1c6c0 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
1c6d0 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
1c6e0 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
1c6f0 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
1c700 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
1c710 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
1c720 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
1c730 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
1c740 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1c750 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
1c760 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
1c770 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1c780 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
1c790 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
1c7a0 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
1c7b0 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
1c7c0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
1c7d0 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
1c7e0 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
1c7f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1c800 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
1c810 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
1c820 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72 50  ( iGuess<=pagerP
1c830 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
1c840 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
1c850 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
1c860 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
1c870 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1c880 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54  =SQLITE_OK && eT
1c890 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1c8a0 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
1c8b0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
1c8c0 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
1c8d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c8e0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
1c8f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1c900 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74  ..  assert( next
1c910 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
1c920 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  E_DONE );.  if( 
1c930 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c940 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
1c950 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
1c960 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , &pPage, 0);.  
1c970 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1c980 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1c990 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ==0 );.    if( r
1c9a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c9b0 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
1c9c0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1c9d0 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
1c9e0 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
1c9f0 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67  ext;.  if( ppPag
1ca00 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  e ){.    *ppPage
1ca10 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73   = pPage;.  }els
1ca20 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  e{.    releasePa
1ca30 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
1ca40 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
1ca50 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
1ca60 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
1ca70 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
1ca80 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
1ca90 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
1caa0 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
1cab0 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
1cac0 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
1cad0 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
1cae0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
1caf0 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
1cb00 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
1cb10 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
1cb20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
1cb30 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
1cb40 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
1cb50 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
1cb60 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
1cb70 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
1cb80 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
1cb90 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
1cba0 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
1cbb0 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
1cbc0 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
1cbd0 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
1cbe0 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
1cbf0 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
1cc00 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1cc10 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
1cc20 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
1cc30 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
1cc40 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
1cc50 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
1cc60 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
1cc70 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
1cc80 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
1cc90 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
1cca0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1ccb0 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
1ccc0 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
1ccd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1cce0 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
1ccf0 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
1cd00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1cd10 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
1cd20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
1cd30 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
1cd40 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
1cd50 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
1cd60 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
1cd70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
1cd80 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
1cd90 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1cda0 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
1cdb0 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
1cdc0 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
1cdd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1cde0 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
1cdf0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ce00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1ce10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1ce20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
1ce30 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
1ce40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1ce50 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
1ce60 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
1ce70 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
1ce80 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
1ce90 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
1cea0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
1ceb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1cec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1ced0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1cee0 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
1cef0 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
1cf00 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
1cf10 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
1cf20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
1cf30 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
1cf40 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61  If the eOp.** pa
1cf50 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
1cf60 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
1cf70 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70  ration (data cop
1cf80 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66  ied into.** buff
1cf90 65 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20  er pBuf). If it 
1cfa0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77  is non-zero, a w
1cfb0 72 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65  rite (data copie
1cfc0 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72  d from.** buffer
1cfd0 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20   pBuf)..**.** A 
1cfe0 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
1cff0 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72  ytes are read or
1d000 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69   written beginni
1d010 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ng at "offset"..
1d020 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20  ** Data is read 
1d030 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62  to or from the b
1d040 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
1d050 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65  * The content be
1d060 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74  ing read or writ
1d070 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72  ten might appear
1d080 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67   on the main pag
1d090 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74  e.** or be scatt
1d0a0 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
1d0b0 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  iple overflow pa
1d0c0 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ges..**.** If th
1d0d0 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63  e BtCursor.isInc
1d0e0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
1d0f0 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65   is set, and the
1d100 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73   current.** curs
1d110 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
1d120 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
1d130 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66  ow pages, this f
1d140 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63  unction.** alloc
1d150 61 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61  ates space for a
1d160 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61  nd lazily poplua
1d170 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
1d180 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63   page-list .** c
1d190 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75  ache array (BtCu
1d1a0 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e  rsor.aOverflow).
1d1b0 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
1d1c0 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61  s use this.** ca
1d1d0 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b  che to make seek
1d1e0 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
1d1f0 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20  ied offset more 
1d200 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
1d210 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
1d220 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
1d230 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
1d240 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a  ated, it may be.
1d250 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
1d260 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
1d270 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
1d280 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
1d290 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
1d2a0 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
1d2b0 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
1d2c0 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
1d2d0 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
1d2e0 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
1d2f0 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
1d300 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
1d310 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1d320 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
1d330 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
1d340 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
1d350 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
1d360 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
1d370 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
1d380 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
1d390 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
1d3a0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
1d3b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d3c0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
1d3d0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
1d3e0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
1d3f0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
1d400 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
1d410 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20  /.  u32 offset, 
1d420 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
1d430 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
1d440 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
1d450 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20  */.  u32 amt,   
1d460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
1d470 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
1d480 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
1d490 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
1d4a0 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
1d4b0 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
1d4c0 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20  */ .  int eOp   
1d4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65             /* ze
1d4e0 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d  ro to read. non-
1d4f0 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a  zero to write. *
1d500 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
1d510 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
1d520 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d530 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79  E_OK;.  u32 nKey
1d540 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
1d550 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1d560 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
1d570 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20  e[pCur->iPage]; 
1d580 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
1d590 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a   current entry *
1d5a0 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
1d5b0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20  t = pCur->pBt;  
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5d0 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75  /* Btree this cu
1d5e0 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rsor belongs to 
1d5f0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1d600 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
1d610 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1d620 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1d630 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1d640 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1d650 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
1d660 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
1d670 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1d680 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c  r) );..  getCell
1d690 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
1d6a0 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
1d6b0 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72  nfo.pCell + pCur
1d6c0 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
1d6d0 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d    nKey = (pPage-
1d6e0 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28 69  >intKey ? 0 : (i
1d6f0 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
1d700 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  ey);..  if( NEVE
1d710 52 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e  R(offset+amt > n
1d720 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  Key+pCur->info.n
1d730 44 61 74 61 29 20 0a 20 20 20 7c 7c 20 26 61 50  Data) .   || &aP
1d740 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
1d750 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
1d760 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
1d770 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a  sableSize].  ){.
1d780 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
1d790 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
1d7a0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
1d7b0 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
1d7c0 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
1d7d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1d7e0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
1d7f0 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
1d800 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
1d810 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
1d820 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
1d830 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
1d840 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
1d850 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
1d860 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
1d870 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
1d880 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
1d890 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
1d8a0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
1d8b0 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
1d8c0 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
1d8d0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
1d8e0 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
1d8f0 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
1d900 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
1d910 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
1d920 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
1d930 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
1d940 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
1d950 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20  .nLocal;.  }..  
1d960 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d970 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
1d980 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c    const u32 ovfl
1d990 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
1d9a0 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
1d9b0 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
1d9c0 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
1d9d0 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
1d9e0 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
1d9f0 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
1da00 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
1da10 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64  nLocal]);..#ifnd
1da20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1da30 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49  NCRBLOB.    /* I
1da40 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62  f the isIncrblob
1da50 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
1da60 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72  et and the BtCur
1da70 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a  sor.aOverflow[].
1da80 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62      ** has not b
1da90 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
1daa0 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  llocate it now. 
1dab0 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a  The array is siz
1dac0 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65  ed at.    ** one
1dad0 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
1dae0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1daf0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
1db00 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20  ain. The.    ** 
1db10 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1db20 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
1db30 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64  w page is stored
1db40 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
1db50 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20  ,.    ** etc. A 
1db60 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
1db70 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
1db80 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79  ray means "not y
1db90 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a  et known".    **
1dba0 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
1dbb0 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
1dbc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1dbd0 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f   pCur->isIncrblo
1dbe0 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72  bHandle && !pCur
1dbf0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
1dc00 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
1dc10 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
1dc20 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
1dc30 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
1dc40 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
1dc50 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
1dc60 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71  low = (Pgno *)sq
1dc70 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
1dc80 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76  sizeof(Pgno)*nOv
1dc90 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a 20 6e 4f  fl);.      /* nO
1dca0 76 66 6c 20 69 73 20 61 6c 77 61 79 73 20 70 6f  vfl is always po
1dcb0 73 69 74 69 76 65 2e 20 20 49 66 20 69 74 20 77  sitive.  If it w
1dcc0 65 72 65 20 7a 65 72 6f 2c 20 66 65 74 63 68 50  ere zero, fetchP
1dcd0 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20 68 61 76  ayload would hav
1dce0 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20  e.      ** been 
1dcf0 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
1dd00 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f  this routine. */
1dd10 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
1dd20 53 28 6e 4f 76 66 6c 29 20 26 26 20 21 70 43 75  S(nOvfl) && !pCu
1dd30 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
1dd40 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1dd50 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1dd60 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1dd70 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
1dd80 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1dd90 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
1dda0 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
1ddb0 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
1ddc0 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20   first required 
1ddd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
1dde0 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20   valid, skip.   
1ddf0 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
1de00 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
1de10 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
1de20 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
1de30 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
1de40 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
1de50 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
1de60 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
1de70 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
1de80 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1de90 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d  ;.      offset =
1dea0 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
1deb0 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
1dec0 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d  ..    for( ; rc=
1ded0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1dee0 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b  t>0 && nextPage;
1def0 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64   iIdx++){..#ifnd
1df00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1df10 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a  NCRBLOB.      /*
1df20 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
1df30 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
1df40 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1df50 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  che. */.      if
1df60 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
1df70 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  w ){.        ass
1df80 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
1df90 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43  flow[iIdx] || pC
1dfa0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1dfb0 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a  dx]==nextPage);.
1dfc0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
1dfd0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
1dfe0 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20  nextPage;.      
1dff0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
1e000 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
1e010 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1e020 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
1e030 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
1e040 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
1e050 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
1e060 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
1e070 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1e080 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
1e090 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
1e0a0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
1e0b0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
1e0c0 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
1e0d0 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
1e0e0 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
1e0f0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
1e100 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
1e110 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
1e120 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
1e130 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
1e140 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
1e150 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e160 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1e170 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
1e180 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
1e190 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1e1a0 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
1e1b0 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
1e1c0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1e1d0 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  +1];.        } e
1e1e0 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
1e1f0 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
1e200 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
1e210 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
1e220 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
1e230 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
1e240 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
1e250 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
1e260 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
1e270 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
1e280 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
1e290 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
1e2a0 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
1e2b0 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
1e2c0 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
1e2d0 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
1e2e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1e2f0 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
1e300 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ge;.        int 
1e310 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20  a = amt;.       
1e320 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1e330 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
1e340 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
1e350 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1e360 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e370 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
1e380 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
1e390 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
1e3a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1e3b0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
1e3c0 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
1e3d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
1e3e0 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
1e3f0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1e400 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
1e410 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
1e420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e430 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
1e440 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
1e450 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
1e460 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  eOp, pDbPage);. 
1e470 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e480 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
1e490 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ge);.          o
1e4a0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
1e4b0 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
1e4c0 20 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d           pBuf +=
1e4d0 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   a;.        }.  
1e4e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e4f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e500 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
1e510 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e520 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1e530 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1e540 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
1e550 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
1e560 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1e570 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
1e580 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
1e590 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
1e5a0 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
1e5b0 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
1e5c0 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
1e5d0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
1e5e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1e5f0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
1e600 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
1e610 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
1e620 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
1e630 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
1e640 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
1e650 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
1e660 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
1e670 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
1e680 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74  lite3BtreeKey(Bt
1e690 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1e6a0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1e6b0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1e6c0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1e6d0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1e6e0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1e6f0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
1e700 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1e710 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1e720 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1e730 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1e740 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e750 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1e760 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
1e770 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
1e780 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
1e790 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 70 50     if( pCur->apP
1e7a0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[0]->intKey )
1e7b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1e7c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e7d0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  PT;.    }.    as
1e7e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1e7f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1e800 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1e810 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
1e820 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65  );.    rc = acce
1e830 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
1e840 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
1e850 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
1e860 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
1e870 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e880 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
1e890 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  e data associate
1e8a0 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
1e8b0 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
1e8c0 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
1e8d0 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
1e8e0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
1e8f0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
1e900 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
1e910 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1e920 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1e930 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
1e940 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
1e950 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
1e960 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
1e970 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
1e980 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
1e990 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
1e9a0 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
1e9b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1e9c0 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  eData(BtCursor *
1e9d0 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
1e9e0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
1e9f0 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
1ea00 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1ea10 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1ea20 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74    if ( pCur->eSt
1ea30 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1ea40 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
1ea50 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
1ea60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
1ea70 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1ea80 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1ea90 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
1eaa0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1eab0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1eac0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1ead0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1eae0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1eaf0 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
1eb00 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
1eb10 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
1eb20 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
1eb30 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1eb40 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1eb50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
1eb60 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1eb70 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
1eb80 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
1eb90 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
1eba0 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d  t, pBuf, 0);.  }
1ebb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ebc0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1ebd0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
1ebe0 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
1ebf0 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
1ec00 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
1ec10 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
1ec20 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
1ec30 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
1ec40 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
1ec50 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79  e key if skipKey
1ec60 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74  ==0 and it point
1ec70 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1ec80 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a  ng of data if.**
1ec90 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68   skipKey==1.  Th
1eca0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1ecb0 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b  s of available k
1ecc0 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
1ecd0 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74  en.** into *pAmt
1ece0 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20  .  If *pAmt==0, 
1ecf0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
1ed00 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
1ed10 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70   be.** a valid p
1ed20 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ointer..**.** Th
1ed30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
1ed40 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
1ed50 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72  It is common for
1ed60 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a   the entire key.
1ed70 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66  ** and data to f
1ed80 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  it on the local 
1ed90 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65  page and for the
1eda0 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72  re to be no over
1edb0 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20  flow.** pages.  
1edc0 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c  When that is so,
1edd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
1ede0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63  n be used to acc
1edf0 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61  ess the.** key a
1ee00 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20  nd data without 
1ee10 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20  making a copy.  
1ee20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f  If the key and/o
1ee30 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a  r data spills.**
1ee40 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
1ee50 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73  ages, then acces
1ee60 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20  sPayload() must 
1ee70 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73  be used to reass
1ee80 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79  emble.** the key
1ee90 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69  /data and copy i
1eea0 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f  t into a preallo
1eeb0 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a  cated buffer..**
1eec0 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
1eed0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
1eee0 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64   routine looks d
1eef0 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65  irectly into the
1ef00 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20   cached.** page 
1ef10 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
1ef20 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74    The data might
1ef30 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20   change or move 
1ef40 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a  the next time.**
1ef50 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69   any btree routi
1ef60 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
1ef70 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
1ef80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74  signed char *fet
1ef90 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
1efa0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
1efb0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
1efc0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
1efd0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
1efe0 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20  int *pAmt,      
1eff0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
1f000 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
1f010 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
1f020 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65   */.  int skipKe
1f030 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65  y          /* re
1f040 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  ad beginning at 
1f050 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20  data if this is 
1f060 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  true */.){.  uns
1f070 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
1f080 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20  load;.  MemPage 
1f090 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b  *pPage;.  u32 nK
1f0a0 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c  ey;.  u32 nLocal
1f0b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
1f0c0 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
1f0d0 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
1f0e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1f0f0 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge]);.  assert( 
1f100 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1f110 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1f120 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1f130 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1f140 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
1f150 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1f160 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
1f170 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1f180 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
1f190 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43  >nCell );.  getC
1f1a0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1f1b0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
1f1c0 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20  ->info.pCell;.  
1f1d0 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72  aPayload += pCur
1f1e0 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
1f1f0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1f200 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20  Key ){.    nKey 
1f210 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1f220 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43    nKey = (int)pC
1f230 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
1f240 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79   }.  if( skipKey
1f250 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64   ){.    aPayload
1f260 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c   += nKey;.    nL
1f270 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
1f280 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b  o.nLocal - nKey;
1f290 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
1f2a0 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
1f2b0 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66  o.nLocal;.    if
1f2c0 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b  ( nLocal>nKey ){
1f2d0 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  .      nLocal = 
1f2e0 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nKey;.    }.  }.
1f2f0 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c    *pAmt = nLocal
1f300 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c  ;.  return aPayl
1f310 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
1f320 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
1f330 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
1f340 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
1f350 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
1f360 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
1f370 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
1f380 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
1f390 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
1f3a0 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
1f3b0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
1f3c0 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
1f3d0 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
1f3e0 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
1f3f0 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
1f400 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
1f410 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
1f420 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
1f430 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
1f440 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
1f450 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
1f460 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
1f470 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
1f480 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
1f490 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
1f4a0 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
1f4b0 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
1f4c0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
1f4d0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
1f4e0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
1f4f0 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
1f500 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
1f510 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
1f520 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
1f530 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
1f540 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
1f550 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
1f560 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
1f570 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43  treeKeyFetch(BtC
1f580 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1f590 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72   *pAmt){.  asser
1f5a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1f5b0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1f5c0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1f5d0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
1f5e0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1f5f0 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
1f600 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1f610 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  _VALID ){.    re
1f620 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64  turn (const void
1f630 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
1f640 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20  Cur, pAmt, 0);. 
1f650 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1f660 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
1f670 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
1f680 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
1f690 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
1f6a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1f6b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1f6c0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1f6d0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1f6e0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1f6f0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
1f700 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1f710 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
1f720 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73      return (cons
1f730 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
1f740 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
1f750 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
1f760 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  n 0;.}.../*.** M
1f770 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1f780 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
1f790 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
1f7a0 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
1f7b0 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
1f7c0 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
1f7d0 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
1f7e0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
1f7f0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
1f800 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1f810 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74   newPgno){.  int
1f820 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70   rc;.  int i = p
1f830 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65  Cur->iPage;.  Me
1f840 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b  mPage *pNewPage;
1f850 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1f860 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
1f870 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1f880 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1f890 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1f8a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1f8b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
1f8c0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1f8d0 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
1f8e0 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75  PTH );.  if( pCu
1f8f0 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
1f900 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
1f910 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1f920 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1f930 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  PT;.  }.  rc = g
1f940 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
1f950 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65  t, newPgno, &pNe
1f960 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  wPage);.  if( rc
1f970 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f980 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31  pCur->apPage[i+1
1f990 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20  ] = pNewPage;.  
1f9a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d  pCur->aiIdx[i+1]
1f9b0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
1f9c0 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e  age++;..  pCur->
1f9d0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1f9e0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1f9f0 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65  y = 0;.  if( pNe
1fa00 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c  wPage->nCell<1 |
1fa10 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b  | pNewPage->intK
1fa20 65 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  ey!=pCur->apPage
1fa30 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  [i]->intKey ){. 
1fa40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fa50 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1fa60 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1fa70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1fa80 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  f NDEBUG./*.** P
1fa90 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61  age pParent is a
1faa0 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d  n internal (non-
1fab0 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e  leaf) tree page.
1fac0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
1fad0 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
1fae0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
1faf0 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63  ld is the left-c
1fb00 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78  hild if the iIdx
1fb10 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70  'th.** cell in p
1fb20 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c  age pParent. Or,
1fb30 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61   if iIdx is equa
1fb40 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  l to the total n
1fb50 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
1fb60 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68  s in pParent, th
1fb70 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
1fb80 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67  Child is the rig
1fb90 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74  ht-child of.** t
1fba0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
1fbb0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61  ic void assertPa
1fbc0 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67  rentIndex(MemPag
1fbd0 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20  e *pParent, int 
1fbe0 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c  iIdx, Pgno iChil
1fbf0 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49  d){.  assert( iI
1fc00 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx<=pParent->nCe
1fc10 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78  ll );.  if( iIdx
1fc20 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
1fc30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1fc40 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
1fc50 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
1fc60 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
1fc70 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c  =iChild );.  }el
1fc80 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1fc90 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1fca0 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29  l(pParent, iIdx)
1fcb0 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
1fcc0 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  .}.#else.#  defi
1fcd0 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  ne assertParentI
1fce0 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e  ndex(x,y,z) .#en
1fcf0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
1fd00 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
1fd10 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
1fd20 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
1fd30 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
1fd40 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
1fd50 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
1fd60 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
1fd70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
1fd80 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
1fd90 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
1fda0 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
1fdb0 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
1fdc0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
1fdd0 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
1fde0 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
1fdf0 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
1fe00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76  .static void mov
1fe10 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73  eToParent(BtCurs
1fe20 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
1fe30 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1fe40 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1fe50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1fe60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1fe70 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
1fe80 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
1fe90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1fea0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1feb0 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
1fec0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20  tParentIndex(.  
1fed0 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
1fee0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
1fef0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
1ff00 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
1ff10 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
1ff20 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1ff30 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65  pgno.  );.  rele
1ff40 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
1ff50 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1ff60 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  ]);.  pCur->iPag
1ff70 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  e--;.  pCur->inf
1ff80 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1ff90 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1ffa0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76   0;.}../*.** Mov
1ffb0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
1ffc0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f  the root page.*/
1ffd0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1ffe0 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
1fff0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
20000 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
20010 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20020 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
20030 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
20040 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
20050 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
20060 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
20070 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
20080 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
20090 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
200a0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
200b0 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
200c0 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
200d0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
200e0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
200f0 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
20100 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
20110 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
20120 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
20130 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
20140 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
20150 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
20160 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
20170 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  skip;.    }.    
20180 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
20190 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
201a0 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   }..  if( pCur->
201b0 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  iPage>=0 ){.    
201c0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
201d0 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =1; i<=pCur->iPa
201e0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
201f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
20200 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
20210 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
20220 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  age = 0;.  }else
20230 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20  {.    if( .     
20240 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
20250 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
20260 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
20270 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
20280 61 67 65 5b 30 5d 29 29 0a 20 20 20 20 29 7b 0a  age[0])).    ){.
20290 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
202a0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
202b0 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
202c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
202d0 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b  pCur->iPage = 0;
202e0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 75 72  ..    /* If pCur
202f0 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f  ->pKeyInfo is no
20300 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
20310 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65   caller that ope
20320 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a  ned this cursor.
20330 20 20 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20      ** expected 
20340 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e  to open it on an
20350 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f   index b-tree. O
20360 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65  therwise, if pKe
20370 79 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a 2a 20  yInfo is.    ** 
20380 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72  NULL, the caller
20390 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65   expects a table
203a0 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73   b-tree. If this
203b0 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65   is not the case
203c0 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  ,.    ** return 
203d0 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
203e0 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20  T error.  */.   
203f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
20400 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
20410 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==1 || pCur->apP
20420 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d  age[0]->intKey==
20430 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 43  0 );.    if( (pC
20440 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
20450 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  !=pCur->apPage[0
20460 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ]->intKey ){.   
20470 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20480 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
20490 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 6f 6f     }.  }..  pRoo
204a0 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
204b0 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
204c0 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
204d0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20  ->pgnoRoot );.  
204e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
204f0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
20500 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
20510 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a  ur->atLast = 0;.
20520 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
20530 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52  y = 0;..  if( pR
20540 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  oot->nCell==0 &&
20550 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
20560 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
20570 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
20580 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
20590 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
205a0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  T_BKPT;.    asse
205b0 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
205c0 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70 61 67  =1 );.    subpag
205d0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
205e0 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
205f0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
20600 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 75 62  .    assert( sub
20610 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 70 43  page>0 );.    pC
20620 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
20630 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72  SOR_VALID;.    r
20640 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
20650 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a  pCur, subpage);.
20660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
20670 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 52  r->eState = ((pR
20680 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55  oot->nCell>0)?CU
20690 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f  RSOR_VALID:CURSO
206a0 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a  R_INVALID);.  }.
206b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
206c0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
206d0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
206e0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
206f0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
20700 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
20710 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
20720 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
20730 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
20740 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
20750 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
20760 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
20770 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
20780 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
20790 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
207a0 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
207b0 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
207c0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
207d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
207e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
207f0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
20800 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
20810 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
20820 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
20830 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
20840 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
20850 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
20860 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
20870 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
20880 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
20890 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
208a0 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
208b0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
208c0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
208d0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
208e0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
208f0 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20  Page]));.    rc 
20900 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
20910 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
20920 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20930 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
20940 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
20950 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
20960 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
20970 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
20980 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
20990 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
209a0 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
209b0 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
209c0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
209d0 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
209e0 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
209f0 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
20a00 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
20a10 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
20a20 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
20a30 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
20a40 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
20a50 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
20a60 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
20a70 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
20a80 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
20a90 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
20aa0 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
20ab0 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
20ac0 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
20ad0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
20ae0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
20af0 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
20b00 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
20b10 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
20b20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
20b30 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
20b40 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
20b50 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
20b60 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
20b70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
20b80 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
20b90 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
20ba0 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
20bb0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
20bc0 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
20bd0 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
20be0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
20bf0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
20c00 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
20c10 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
20c20 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67  r->iPage] = pPag
20c30 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63  e->nCell;.    rc
20c40 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
20c50 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
20c60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20c70 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  _OK ){.    pCur-
20c80 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
20c90 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
20ca0 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e  ll-1;.    pCur->
20cb0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
20cc0 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
20cd0 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
20ce0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
20cf0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
20d00 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
20d10 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
20d20 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
20d30 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
20d40 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
20d50 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
20d60 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
20d70 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
20d80 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
20d90 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
20da0 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
20db0 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73  sqlite3BtreeFirs
20dc0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
20dd0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
20de0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
20df0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
20e00 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
20e10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
20e20 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
20e30 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
20e40 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
20e50 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
20e60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20e70 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  OK ){.    if( pC
20e80 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
20e90 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
20ea0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
20eb0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
20ec0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
20ed0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
20ee0 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   1;.      rc = S
20ef0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
20f00 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
20f10 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
20f20 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
20f30 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
20f40 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
20f50 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
20f60 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
20f70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20f80 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
20f90 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
20fa0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
20fb0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
20fc0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
20fd0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
20fe0 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
20ff0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
21000 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
21010 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
21020 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
21030 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
21040 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21050 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
21060 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
21070 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
21080 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
21090 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
210a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
210b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
210c0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
210d0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
210e0 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
210f0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20   already points 
21100 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
21110 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  y, this is a no-
21120 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52  op. */.  if( CUR
21130 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
21140 3e 65 53 74 61 74 65 20 26 26 20 70 43 75 72 2d  >eState && pCur-
21150 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69 66 64 65  >atLast ){.#ifde
21160 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
21170 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
21180 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
21190 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
211a0 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
211b0 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
211c0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
211d0 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
211e0 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
211f0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
21200 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
21210 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21220 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
21230 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
21240 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
21250 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
21260 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
21270 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61  >iPage]==pCur->a
21280 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21290 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  e]->nCell-1 );. 
212a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
212b0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
212c0 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65  age]->leaf );.#e
212d0 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
212e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
212f0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
21300 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
21310 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21320 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
21330 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
21340 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73  tate ){.      as
21350 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
21360 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
21370 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
21380 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
21390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
213a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
213b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
213c0 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
213d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
213e0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
213f0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43  (pCur);.      pC
21400 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d  ur->atLast = rc=
21410 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b  =SQLITE_OK ?1:0;
21420 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
21430 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
21440 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f  ve the cursor so
21450 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
21460 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72  to an entry near
21470 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65   the key .** spe
21480 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65  cified by pIdxKe
21490 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52  y or intKey.   R
214a0 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20  eturn a success 
214b0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  code..**.** For 
214c0 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74  INTKEY tables, t
214d0 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65  he intKey parame
214e0 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49  ter is used.  pI
214f0 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62  dxKey .** must b
21500 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64  e NULL.  For ind
21510 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b  ex tables, pIdxK
21520 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69  ey is used and i
21530 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  ntKey.** is igno
21540 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
21550 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
21560 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
21570 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
21580 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
21590 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
215a0 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
215b0 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
215c0 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
215d0 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
215e0 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
215f0 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
21600 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
21610 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
21620 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67  ..**.** An integ
21630 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  er is written in
21640 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69  to *pRes which i
21650 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  s the result of.
21660 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  ** comparing the
21670 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e   key with the en
21680 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65  try to which the
21690 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70   cursor is .** p
216a0 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65  ointing.  The me
216b0 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74  aning of the int
216c0 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74  eger written int
216d0 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73  o.** *pRes is as
216e0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
216f0 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20      *pRes<0     
21700 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
21710 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
21720 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
21730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21740 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
21750 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
21760 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
21770 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20   is empty.**    
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
21790 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  d the cursor is 
217a0 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70  therefore left p
217b0 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e  oint to nothing.
217c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
217d0 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73  ==0     The curs
217e0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
217f0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
21800 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
21810 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79           exactly
21820 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f   matches intKey/
21830 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  pIdxKey..**.**  
21840 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
21850 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
21860 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
21870 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21890 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
218a0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
218b0 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
218c0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
218d0 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
218e0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
218f0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
21900 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
21910 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
21920 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
21930 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
21940 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
21950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21960 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
21970 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
21980 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
21990 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
219a0 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
219b0 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
219c0 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
219d0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
219e0 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
219f0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
21a00 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
21a10 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
21a20 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
21a30 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
21a40 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
21a50 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
21a60 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20  .  assert( pRes 
21a70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  );.  assert( (pI
21a80 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
21a90 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29  ->pKeyInfo==0) )
21aa0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
21ab0 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
21ac0 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
21ad0 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
21ae0 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
21af0 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
21b00 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
21b10 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
21b20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  */.  if( pCur->e
21b30 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
21b40 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c  LID && pCur->val
21b50 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70 43  idNKey .   && pC
21b60 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
21b70 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20  ntKey .  ){.    
21b80 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
21b90 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
21ba0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
21bb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21bc0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
21bd0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61    if( pCur->atLa
21be0 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f  st && pCur->info
21bf0 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  .nKey<intKey ){.
21c00 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
21c10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
21c20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
21c30 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
21c40 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
21c50 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
21c60 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
21c70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
21c80 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21c90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
21ca0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21cb0 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20  >iPage]->isInit 
21cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
21cd0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21ce0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
21cf0 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
21d00 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
21d10 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
21d20 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
21d30 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52  VALID ){.    *pR
21d40 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  es = -1;.    ass
21d50 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
21d60 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
21d70 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
21d80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21d90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
21da0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
21db0 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b  >intKey || pIdxK
21dc0 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  ey );.  for(;;){
21dd0 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70  .    int lwr, up
21de0 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  r;.    Pgno chld
21df0 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
21e00 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
21e10 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21e20 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 0a  e];.    int c;..
21e30 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
21e40 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
21e50 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
21e60 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
21e70 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
21e80 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
21e90 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
21ea0 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
21eb0 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
21ec0 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
21ed0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
21ee0 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
21ef0 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
21f00 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
21f10 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
21f20 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
21f30 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
21f40 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
21f50 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
21f60 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
21f70 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
21f80 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
21f90 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
21fa0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
21fb0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
21fc0 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
21fd0 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
21fe0 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
21ff0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
22000 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
22010 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
22020 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
22030 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
22040 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
22050 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 62  ell-1;.    if( b
22060 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20  iasRight ){.    
22070 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
22080 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
22090 36 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  6)upr;.    }else
220a0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  {.      pCur->ai
220b0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
220c0 20 3d 20 28 75 31 36 29 28 28 75 70 72 2b 6c 77   = (u16)((upr+lw
220d0 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
220e0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
220f0 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
22100 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22110 65 5d 3b 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  e]; /* Index of 
22120 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
22130 70 50 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 75  pPage */.      u
22140 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  8 *pCell;       
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22160 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
22170 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
22180 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20   pPage */..     
22190 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
221a0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 65  e = 0;.      pCe
221b0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
221c0 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67  age, idx) + pPag
221d0 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
221e0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
221f0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
22200 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
22210 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
22220 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
22230 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75            u32 du
22240 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mmy;.          p
22250 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e  Cell += getVarin
22260 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79  t32(pCell, dummy
22270 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
22280 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
22290 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65  Cell, (u64*)&nCe
222a0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
222b0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  if( nCellKey==in
222c0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
222d0 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
222e0 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
222f0 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
22300 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a          c = -1;.
22310 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
22320 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
22330 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
22340 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
22350 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
22360 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61          pCur->va
22370 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
22380 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
22390 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
223a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
223b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78        /* The max
223c0 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
223d0 61 67 65 2d 73 69 7a 65 20 69 73 20 33 32 37 36  age-size is 3276
223e0 38 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65  8 bytes. This me
223f0 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  ans that.       
22400 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   ** the maximum 
22410 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  number of record
22420 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e   bytes stored on
22430 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65   an index B-Tree
22440 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
22450 20 69 73 20 61 74 20 6d 6f 73 74 20 38 31 39 38   is at most 8198
22460 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 6d 61   bytes, which ma
22470 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
22480 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20   2-byte.        
22490 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20  ** varint. This 
224a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
224b0 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74  sed to attempt t
224c0 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20  o avoid parsing 
224d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
224e0 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63  entire cell by c
224f0 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20  hecking for the 
22500 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
22510 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20  record is .     
22520 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74     ** stored ent
22530 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65  irely within the
22540 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20   b-tree page by 
22550 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66  inspecting the f
22560 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  irst .        **
22570 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   2 bytes of the 
22580 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cell..        */
22590 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65  .        int nCe
225a0 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20  ll = pCell[0];. 
225b0 20 20 20 20 20 20 20 69 66 28 20 21 28 6e 43 65         if( !(nCe
225c0 6c 6c 20 26 20 30 78 38 30 29 20 26 26 20 6e 43  ll & 0x80) && nC
225d0 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ell<=pPage->maxL
225e0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
225f0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
22600 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63   runs if the rec
22610 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  ord-size field o
22620 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a  f the cell is a.
22630 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
22640 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20  gle byte varint 
22650 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66  and the record f
22660 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
22670 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20  the main.       
22680 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67     ** b-tree pag
22690 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
226a0 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
226b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
226c0 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
226d0 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[1], pIdxKey);
226e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
226f0 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20  f( !(pCell[1] & 
22700 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20  0x80) .         
22710 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e   && (nCell = ((n
22720 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b  Cell&0x7f)<<7) +
22730 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67   pCell[1])<=pPag
22740 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20  e->maxLocal.    
22750 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
22760 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73   /* The record-s
22770 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32  ize field is a 2
22780 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
22790 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20   the record .   
227a0 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65         ** fits e
227b0 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
227c0 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ain b-tree page.
227d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
227e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
227f0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
22800 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
22810 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [2], pIdxKey);. 
22820 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22830 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
22840 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72  ecord flows over
22850 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   onto one or mor
22860 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
22870 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  . In.          *
22880 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  * this case the 
22890 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73  whole cell needs
228a0 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61   to be parsed, a
228b0 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
228c0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  d.          ** a
228d0 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nd accessPayload
228e0 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69  () used to retri
228f0 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  eve the record i
22900 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
22910 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f    ** buffer befo
22920 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  re VdbeRecordCom
22930 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61  pare() can be ca
22940 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lled. */.       
22950 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65     void *pCellKe
22960 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  y;.          u8 
22970 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64  * const pCellBod
22980 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67  y = pCell - pPag
22990 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
229a0 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
229b0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
229c0 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26  ge, pCellBody, &
229d0 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
229e0 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28         nCell = (
229f0 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
22a00 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
22a10 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
22a20 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29  3Malloc( nCell )
22a30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22a40 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
22a50 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
22a60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
22a70 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
22a80 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
22a90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22aa0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
22ab0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
22ac0 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64  nCell, (unsigned
22ad0 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c   char*)pCellKey,
22ae0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63   0);.          c
22af0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
22b00 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
22b10 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  l, pCellKey, pId
22b20 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
22b30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
22b40 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
22b50 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
22b60 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
22b70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22b80 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
22b90 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
22ba0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
22bb0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
22bc0 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
22bd0 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
22be0 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20  upr = lwr - 1;. 
22bf0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
22c00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
22c10 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
22c20 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
22c30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22c40 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
22c50 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
22c60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
22c70 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
22c80 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
22c90 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
22ca0 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69  .        upr = i
22cb0 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dx-1;.      }.  
22cc0 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
22cd0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
22ce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22cf0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
22d00 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
22d10 28 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20  ((lwr+upr)/2);. 
22d20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
22d30 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20   lwr==upr+1 );. 
22d40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22d50 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
22d60 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
22d70 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
22d80 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
22d90 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
22da0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
22db0 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
22dc0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
22dd0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
22de0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
22df0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
22e00 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
22e10 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
22e20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64    }.    if( chld
22e30 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  Pg==0 ){.      a
22e40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
22e50 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
22e60 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22e70 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
22e80 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
22e90 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = c;.      rc = 
22ea0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
22eb0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
22ec0 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ish;.    }.    p
22ed0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22ee0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c  >iPage] = (u16)l
22ef0 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  wr;.    pCur->in
22f00 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
22f10 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
22f20 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
22f30 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
22f40 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
22f50 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76  f( rc ) goto mov
22f60 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a  eto_finish;.  }.
22f70 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
22f80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
22f90 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
22fa0 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
22fb0 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
22fc0 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
22fd0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
22fe0 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
22ff0 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
23000 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
23010 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
23020 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
23030 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
23040 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
23050 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
23060 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
23070 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
23080 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
23090 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
230a0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
230b0 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
230c0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
230d0 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
230e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
230f0 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
23100 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
23110 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
23120 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
23130 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
23140 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
23150 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
23160 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
23170 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
23180 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
23190 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
231a0 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
231b0 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
231c0 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
231d0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
231e0 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
231f0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
23200 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
23210 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
23220 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
23230 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
23240 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
23250 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
23260 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
23270 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
23280 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
23290 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
232a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
232b0 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
232c0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
232d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
232e0 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
232f0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
23300 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
23310 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
23320 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
23330 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
23340 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
23350 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
23360 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
23370 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
23380 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
23390 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
233a0 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
233b0 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
233c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
233d0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
233e0 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  p>0 ){.    pCur-
233f0 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a  >skip = 0;.    *
23400 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
23410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23420 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
23430 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
23440 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
23450 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64  ur->iPage];.  id
23460 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64  x = ++pCur->aiId
23470 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
23480 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
23490 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
234a0 65 72 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d  ert( idx<=pPage-
234b0 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75  >nCell );..  pCu
234c0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
234d0 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
234e0 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
234f0 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
23500 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
23510 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
23520 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
23530 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
23540 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
23550 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
23560 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
23570 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
23580 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
23590 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
235a0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
235b0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
235c0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
235d0 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
235e0 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
235f0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
23600 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
23610 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
23620 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
23630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23640 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
23650 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
23660 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
23670 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
23680 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
23690 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
236a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
236b0 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  e]>=pPage->nCell
236c0 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
236d0 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
236e0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
236f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
23700 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
23710 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
23720 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23730 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
23740 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
23750 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
23760 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
23770 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
23780 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
23790 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
237a0 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
237b0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
237c0 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
237d0 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
237e0 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
237f0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
23800 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
23810 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
23820 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
23830 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
23840 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
23850 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
23860 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
23870 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
23880 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
23890 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
238a0 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
238b0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
238c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
238d0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
238e0 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
238f0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
23900 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23910 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23920 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
23930 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
23940 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
23950 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
23960 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
23970 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a  ur->atLast = 0;.
23980 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
23990 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
239a0 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
239b0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
239c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
239d0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c   if( pCur->skip<
239e0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
239f0 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  kip = 0;.    *pR
23a00 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
23a10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
23a20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d  }.  pCur->skip =
23a30 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70   0;..  pPage = p
23a40 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23a50 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
23a60 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
23a70 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  t );.  if( !pPag
23a80 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69  e->leaf ){.    i
23a90 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  nt idx = pCur->a
23aa0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
23ab0 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  ];.    rc = move
23ac0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
23ad0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
23ae0 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20  pPage, idx)));. 
23af0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
23b00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
23b10 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76    }.    rc = mov
23b20 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
23b30 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
23b40 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69   while( pCur->ai
23b50 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
23b60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
23b70 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
23b80 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
23b90 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
23ba0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
23bb0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
23bc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23bd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
23be0 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
23bf0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
23c00 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
23c10 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
23c20 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
23c30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ;..    pCur->aiI
23c40 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
23c50 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  -;.    pPage = p
23c60 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23c70 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66  ->iPage];.    if
23c80 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
23c90 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
23ca0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
23cb0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
23cc0 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
23cd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23ce0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23cf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52  .    }.  }.  *pR
23d00 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  es = 0;.  return
23d10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
23d20 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
23d30 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
23d40 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
23d50 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20  The new page is 
23d60 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
23d70 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
23d80 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  s, sqlite3PagerW
23d90 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c  rite().** has al
23da0 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
23db0 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  d on the new pag
23dc0 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67  e.)  The new pag
23dd0 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65  e has also.** be
23de0 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e  en referenced an
23df0 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  d the calling ro
23e00 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73  utine is respons
23e10 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
23e20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
23e30 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e  Unref() on the n
23e40 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20  ew page when it 
23e50 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53  is done..**.** S
23e60 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
23e70 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
23e80 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75    Any other retu
23e90 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
23ea0 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20  es.** an error. 
23eb0 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50   *ppPage and *pP
23ec0 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65  gno are undefine
23ed0 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
23ee0 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44  f an error..** D
23ef0 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c  o not invoke sql
23f00 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
23f10 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61   on *ppPage if a
23f20 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
23f30 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
23f40 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d  e "nearby" param
23f50 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74  eter is not 0, t
23f60 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65  hen a (feeble) e
23f70 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f  ffort is made to
23f80 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61   .** locate a pa
23f90 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20  ge close to the 
23fa0 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61  page number "nea
23fb0 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20  rby".  This can 
23fc0 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a  be used in an.**
23fd0 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70   attempt to keep
23fe0 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63   related pages c
23ff0 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68  lose to each oth
24000 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
24010 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63  se file,.** whic
24020 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61  h in turn can ma
24030 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ke database acce
24040 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  ss faster..**.**
24050 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20   If the "exact" 
24060 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
24070 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65   0, and the page
24080 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65  -number nearby e
24090 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65  xists .** anywhe
240a0 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
240b0 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ist, then it is 
240c0 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65  guarenteed to be
240d0 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
240e0 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  ** is only used 
240f0 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  by auto-vacuum d
24100 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c  atabases when al
24110 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74  locating a new t
24120 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
24130 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
24140 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
24150 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61  d *pBt, .  MemPa
24160 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20  ge **ppPage, .  
24170 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20  Pgno *pPgno, .  
24180 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75  Pgno nearby,.  u
24190 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d  8 exact.){.  Mem
241a0 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
241b0 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b  int rc;.  u32 n;
241c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
241d0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
241e0 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32  reelist */.  u32
241f0 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   k;     /* Numbe
24200 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  r of leaves on t
24210 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20  he trunk of the 
24220 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65  freelist */.  Me
24230 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
24240 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
24250 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
24260 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20  Pgno mxPage;    
24270 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
24280 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
24290 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ile */..  assert
242a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
242b0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
242c0 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
242d0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
242e0 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
242f0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20  count(pBt);.  n 
24300 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
24310 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
24320 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d    testcase( n==m
24330 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28  xPage-1 );.  if(
24340 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20   n>=mxPage ){.  
24350 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24360 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
24370 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
24380 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
24390 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
243a0 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
243b0 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
243c0 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
243d0 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
243e0 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
243f0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
24400 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
24410 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
24420 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
24430 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72   the 'exact' par
24440 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20  ameter was true 
24450 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
24460 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
24470 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
24480 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
24490 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
244a0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
244b0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
244c0 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
244d0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
244e0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
244f0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
24500 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
24510 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63  UUM.    if( exac
24520 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d 78 50  t && nearby<=mxP
24530 61 67 65 20 29 7b 0a 20 20 20 20 20 20 75 38 20  age ){.      u8 
24540 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73  eType;.      ass
24550 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b  ert( nearby>0 );
24560 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24570 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
24580 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  ;.      rc = ptr
24590 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
245a0 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
245b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
245c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
245d0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
245e0 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
245f0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
24600 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
24610 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61      *pPgno = nea
24620 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rby;.    }.#endi
24630 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  f..    /* Decrem
24640 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
24650 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
24660 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
24670 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
24680 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
24690 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
246a0 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
246b0 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
246c0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
246d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
246e0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
246f0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
24700 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62  rn rc;.    put4b
24710 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
24720 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20  ta[36], n-1);.. 
24730 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77     /* The code w
24740 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20  ithin this loop 
24750 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65  is run only once
24760 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c   if the 'searchL
24770 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20  ist' variable.  
24780 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65    ** is not true
24790 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
247a0 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
247b0 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e  ch trunk-page on
247c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65   the.    ** free
247d0 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20  -list until the 
247e0 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
247f0 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f   located..    */
24800 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
24810 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
24820 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
24830 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
24840 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
24850 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
24860 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  nk->aData[0]);. 
24870 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24880 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
24890 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
248a0 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
248b0 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
248c0 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  e( iTrunk==mxPag
248d0 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e );.      if( i
248e0 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a  Trunk>mxPage ){.
248f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
24900 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
24910 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
24920 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
24930 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
24940 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
24950 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
24960 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
24970 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
24980 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
24990 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
249a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20       }..      k 
249b0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
249c0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
249d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6b       testcase( k
249e0 3d 3d 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  ==(u32)(pBt->usa
249f0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
24a00 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30  ;.      if( k==0
24a10 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20   && !searchList 
24a20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
24a30 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c  e trunk has no l
24a40 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69  eaves and the li
24a50 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  st is not being 
24a60 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20  searched. .     
24a70 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74     ** So extract
24a80 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
24a90 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69  itself and use i
24aa0 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a  t as the newly .
24ab0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
24ac0 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20  ated page */.   
24ad0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
24ae0 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20  evTrunk==0 );.  
24af0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24b00 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
24b10 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
24b20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
24b30 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
24b40 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
24b50 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
24b60 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
24b70 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65  runk;.        me
24b80 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
24b90 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
24ba0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
24bb0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
24bc0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
24bd0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
24be0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
24bf0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
24c00 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
24c10 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
24c20 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d  , n-1));.      }
24c30 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29  else if( k>(u32)
24c40 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
24c50 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20  /4 - 2) ){.     
24c60 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b     /* Value of k
24c70 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
24c80 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
24c90 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
24ca0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
24cb0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
24cc0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
24cd0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
24ce0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24cf0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
24d00 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
24d10 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d  hList && nearby=
24d20 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  =iTrunk ){.     
24d30 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
24d40 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
24d50 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
24d60 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
24d70 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
24d80 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
24d90 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
24da0 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
24db0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
24dc0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d   assert( *pPgno=
24dd0 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20  =iTrunk );.     
24de0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
24df0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61  unk;.        sea
24e00 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
24e10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24e20 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
24e30 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
24e40 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
24e50 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
24e60 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
24e70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24e80 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a      if( k==0 ){.
24e90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
24ea0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
24eb0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
24ec0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
24ed0 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
24ee0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
24ef0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24f00 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
24f10 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
24f20 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
24f30 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
24f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24f60 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
24f70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
24f80 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
24f90 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
24fa0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
24fb0 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
24fc0 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
24fd0 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
24fe0 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
24ff0 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
25000 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
25010 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
25020 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
25030 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
25040 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
25050 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
25060 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
25070 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
25080 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
25090 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
250a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
250b0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
250c0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
250d0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
250e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
250f0 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
25100 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
25110 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
25120 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
25130 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
25140 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
25150 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25160 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25170 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
25180 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
25190 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
251a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
251b0 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
251c0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
251d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
251e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
251f0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
25200 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
25210 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
25220 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
25230 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
25240 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
25250 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
25260 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
25270 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
25280 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
25290 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
252a0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
252b0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
252c0 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
252d0 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
252e0 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
252f0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
25300 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
25310 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
25320 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
25330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
25340 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
25350 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
25360 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
25370 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
25380 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
25390 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
253a0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
253b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
253c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
253d0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
253e0 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
253f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
25400 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
25410 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
25420 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
25430 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25440 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
25450 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
25460 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
25470 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
25480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25490 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
254a0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
254b0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
254c0 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
254d0 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
254e0 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
254f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
25500 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  k>0 ){.        /
25510 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
25520 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
25530 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  */.        u32 c
25540 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
25550 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
25560 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
25570 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
25580 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
25590 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
255a0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
255b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
255c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
255d0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
255e0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
255f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25600 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b   if( nearby>0 ){
25610 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69  .          u32 i
25620 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
25630 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
25640 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
25650 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65         dist = ge
25660 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
25670 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
25680 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30        if( dist<0
25690 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b   ) dist = -dist;
256a0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
256b0 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
256c0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
256d0 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  2 = get4byte(&aD
256e0 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
256f0 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
25700 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20    if( d2<0 ) d2 
25710 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20  = -d2;.         
25720 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
25730 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
25740 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
25750 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
25760 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
25770 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
25780 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25790 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
257a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
257b0 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
257c0 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
257d0 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
257e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
257f0 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20  ( iPage==mxPage 
25800 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
25810 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20  Page>mxPage ){. 
25820 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
25830 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25840 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
25850 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
25860 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
25870 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
25880 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
25890 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  ;.        if( !s
258a0 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61  earchList || iPa
258b0 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20  ge==nearby ){.  
258c0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f          int noCo
258d0 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20  ntent;.         
258e0 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b   *pPgno = iPage;
258f0 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
25900 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
25910 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25  was leaf %d of %
25920 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20  d on trunk %d". 
25930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25940 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20  ": %d more free 
25950 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
25960 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e             *pPgn
25970 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c  o, closest+1, k,
25980 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e   pTrunk->pgno, n
25990 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
259a0 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
259b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
259c0 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
259d0 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
259e0 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
259f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25a00 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
25a10 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
25a20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
25a30 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
25a40 69 74 65 61 62 6c 65 28 70 54 72 75 6e 6b 2d 3e  iteable(pTrunk->
25a50 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
25a60 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20        noContent 
25a70 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f  = !btreeGetHasCo
25a80 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e  ntent(pBt, *pPgn
25a90 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o);.          rc
25aa0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
25ab0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
25ac0 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
25ad0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
25ae0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25af0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
25b00 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
25b10 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
25b20 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
25b30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25b40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25b50 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
25b60 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
25b70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25b90 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
25ba0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25bb0 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
25bc0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
25bd0 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
25be0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
25bf0 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
25c00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
25c10 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
25c20 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
25c30 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20  list, so create 
25c40 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68  a new page at th
25c50 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20  e.    ** end of 
25c60 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
25c70 69 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65  int nPage = page
25c80 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  rPagecount(pBt);
25c90 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50  .    *pPgno = nP
25ca0 61 67 65 20 2b 20 31 3b 0a 0a 20 20 20 20 69 66  age + 1;..    if
25cb0 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  ( *pPgno==PENDIN
25cc0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
25cd0 20 29 7b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e   ){.      (*pPgn
25ce0 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  o)++;.    }..#if
25cf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25d00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
25d10 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
25d20 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
25d30 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f  PAGE(pBt, *pPgno
25d40 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
25d50 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
25d60 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
25d70 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
25d80 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
25d90 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
25da0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
25db0 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
25dc0 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
25dd0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
25de0 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
25df0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
25e00 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
25e10 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
25e20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
25e30 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
25e40 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
25e50 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
25e60 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
25e70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
25e80 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
25e90 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
25ea0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
25eb0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
25ec0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
25ed0 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
25ee0 6e 6f 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20  no, &pPg, 0);.  
25ef0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25f00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25f10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25f20 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
25f30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
25f40 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
25f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25f60 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
25f70 63 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f  c;.      (*pPgno
25f80 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a  )++;.      if( *
25f90 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42  pPgno==PENDING_B
25fa0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
25fb0 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20   (*pPgno)++; }. 
25fc0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
25fd0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
25fe0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
25ff0 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72  GE(pBt) );.    r
26000 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
26010 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
26020 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
26030 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
26040 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
26050 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
26060 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
26070 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
26080 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26090 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
260a0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
260b0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
260c0 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
260d0 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e  f file\n", *pPgn
260e0 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  o));.  }..  asse
260f0 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
26100 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
26110 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
26120 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
26130 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
26140 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
26150 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66  PrevTrunk);.  if
26160 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26170 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
26180 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
26190 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
261a0 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20  DbPage)>1 ){.   
261b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
261c0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  ppPage);.      r
261d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
261e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
261f0 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e  .    (*ppPage)->
26200 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65  isInit = 0;.  }e
26210 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
26220 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
26230 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26240 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
26250 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67   used to add pag
26260 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64  e iPage to the d
26270 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65  atabase file fre
26280 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69  e-list. .** It i
26290 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
262a0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
262b0 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66  lready a part of
262c0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
262d0 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
262e0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
262f0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
26300 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26310 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49  s optional..** I
26320 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70  f the caller hap
26330 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70  pens to have a p
26340 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65  ointer to the Me
26350 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  mPage object .**
26360 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
26370 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e  o page iPage han
26380 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  dy, it may pass 
26390 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  it as the second
263a0 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65   value. .** Othe
263b0 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61  rwise, it may pa
263c0 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  ss NULL..**.** I
263d0 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  f a pointer to a
263e0 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
263f0 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
26400 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
26410 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e  ,.** its referen
26420 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20  ce count is not 
26430 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20  altered by this 
26440 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
26450 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65  tic int freePage
26460 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  2(BtShared *pBt,
26470 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61   MemPage *pMemPa
26480 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b  ge, Pgno iPage){
26490 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
264a0 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
264b0 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c         /* Free-l
264c0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
264d0 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20  /.  Pgno iTrunk 
264e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
264f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
26500 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c  number of free-l
26510 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
26520 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  / .  MemPage *pP
26530 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
26540 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  e1;      /* Loca
26550 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  l reference to p
26560 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61  age 1 */.  MemPa
26570 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  ge *pPage;      
26580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26590 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65  * Page being fre
265a0 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e  ed. May be NULL.
265b0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
265c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
265e0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
265f0 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
26600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26610 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
26620 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
26630 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
26640 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
26650 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
26660 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
26670 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20  rt( iPage>1 );. 
26680 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61   assert( !pMemPa
26690 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e  ge || pMemPage->
266a0 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a  pgno==iPage );..
266b0 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29    if( pMemPage )
266c0 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d  {.    pPage = pM
266d0 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69  emPage;.    sqli
266e0 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67  te3PagerRef(pPag
266f0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
26700 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20  else{.    pPage 
26710 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
26720 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  p(pBt, iPage);. 
26730 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65   }..  /* Increme
26740 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65  nt the free page
26750 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31   count on pPage1
26760 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
26770 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
26780 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
26790 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
267a0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e  reepage_out;.  n
267b0 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
267c0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
267d0 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
267e0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
267f0 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 23  6], nFree+1);..#
26800 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  ifdef SQLITE_SEC
26810 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20  URE_DELETE.  /* 
26820 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45  If the SQLITE_SE
26830 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70  CURE_DELETE comp
26840 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
26850 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
26860 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c  .  ** always ful
26870 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
26880 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
26890 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a   with zeros..  *
268a0 2f 0a 20 20 69 66 28 20 28 21 70 50 61 67 65 20  /.  if( (!pPage 
268b0 26 26 20 28 72 63 20 3d 20 62 74 72 65 65 47 65  && (rc = btreeGe
268c0 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
268d0 2c 20 26 70 50 61 67 65 2c 20 30 29 29 29 0a 20  , &pPage, 0))). 
268e0 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20    ||            
268f0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
26900 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
26910 44 62 50 61 67 65 29 29 0a 20 20 29 7b 0a 20 20  DbPage)).  ){.  
26920 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
26930 6f 75 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  out;.  }.  memse
26940 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
26950 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
26960 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66  ageSize);.#endif
26970 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
26980 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
26990 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
269a0 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
269b0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
269c0 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
269d0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
269e0 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
269f0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
26a00 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  {.    rc = ptrma
26a10 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c  pPut(pBt, iPage,
26a20 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
26a30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
26a40 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
26a50 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
26a60 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74  Now manipulate t
26a70 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
26a80 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72  se free-list str
26a90 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72  ucture. There ar
26aa0 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69  e two.  ** possi
26ab0 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65  bilities. If the
26ac0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75   free-list is cu
26ad0 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f  rrently empty, o
26ae0 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  r if the first. 
26af0 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69   ** trunk page i
26b00 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
26b10 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68  is full, then th
26b20 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
26b30 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66  ome a.  ** new f
26b40 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
26b50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
26b60 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  it will become a
26b70 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a   leaf of the.  *
26b80 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  * first trunk pa
26b90 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ge in the curren
26ba0 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  t free-list. Thi
26bb0 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66  s block tests if
26bc0 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
26bd0 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20  ible to add the 
26be0 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72  page as a new fr
26bf0 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20  ee-list leaf..  
26c00 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d  */.  if( nFree!=
26c10 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65  0 ){.    int nLe
26c20 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
26c30 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
26c40 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c  mber of leaf cel
26c50 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  ls on trunk page
26c60 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20   */..    iTrunk 
26c70 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
26c80 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
26c90 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
26ca0 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
26cb0 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
26cc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26cd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
26ce0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
26cf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65  ;.    }..    nLe
26d00 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  af = get4byte(&p
26d10 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
26d20 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 3c  ;.    if( nLeaf<
26d30 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
26d40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
26d50 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
26d60 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
26d70 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61    }.    if( nLea
26d80 66 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  f<pBt->usableSiz
26d90 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
26da0 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
26db0 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f   there is room o
26dc0 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  n the trunk page
26dd0 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70   to insert the p
26de0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  age.      ** bei
26df0 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65  ng freed as a ne
26e00 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a  w leaf..      **
26e10 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  .      ** Note t
26e20 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  hat the trunk pa
26e30 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ge is not really
26e40 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63   full until it c
26e50 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
26e60 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
26e70 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75  2 entries, not u
26e80 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
26e90 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61  entries as we ha
26ea0 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  ve.      ** code
26eb0 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61  d.  But due to a
26ec0 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e   coding error in
26ed0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
26ee0 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  ite prior to.   
26ef0 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74     ** 3.6.0, dat
26f00 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65  abases with free
26f10 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73  list trunk pages
26f20 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68   holding more th
26f30 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  an.      ** usab
26f40 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
26f50 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70  ries will be rep
26f60 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74  orted as corrupt
26f70 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20  .  In order.    
26f80 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e    ** to maintain
26f90 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
26fa0 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
26fb0 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
26fc0 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a  SQLite,.      **
26fd0 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e   we will contain
26fe0 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65   to restrict the
26ff0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
27000 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65  es to usableSize
27010 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20  /4 - 8.      ** 
27020 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d  for now.  At som
27030 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
27040 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72  uture (once ever
27050 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65  yone has upgrade
27060 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e  d.      ** to 3.
27070 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65  6.0 or later) we
27080 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72   should consider
27090 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64   fixing the cond
270a0 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20  itional above.  
270b0 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22      ** to read "
270c0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20  usableSize/4-2" 
270d0 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62  instead of "usab
270e0 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20  leSize/4-8"..   
270f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
27100 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27110 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
27120 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
27130 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27140 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
27150 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
27160 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20  4], nLeaf+1);.  
27170 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
27180 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b  pTrunk->aData[8+
27190 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29  nLeaf*4], iPage)
271a0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
271b0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
271c0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
271d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
271e0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
271f0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
27200 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ge);.        }.#
27210 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72 63  endif.        rc
27220 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f   = btreeSetHasCo
27230 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65  ntent(pBt, iPage
27240 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
27250 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
27260 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
27270 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
27280 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
27290 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
272a0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
272b0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
272c0 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
272d0 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f  flows to this po
272e0 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73  int, then it was
272f0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
27300 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68   add the.  ** th
27310 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
27320 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67  ed as a leaf pag
27330 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
27340 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
27350 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73  -list..  ** Poss
27360 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
27370 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d   free-list is em
27380 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79  pty, or possibly
27390 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20   because the .  
273a0 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  ** first trunk i
273b0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
273c0 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20  is full. Either 
273d0 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65  way, the page be
273e0 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77  ing freed.  ** w
273f0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
27400 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ew first trunk p
27410 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
27420 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
27430 20 20 20 28 28 21 70 50 61 67 65 29 20 26 26 20     ((!pPage) && 
27440 28 30 20 21 3d 20 28 72 63 20 3d 20 62 74 72 65  (0 != (rc = btre
27450 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
27460 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
27470 29 29 0a 20 20 20 20 20 7c 7c 20 28 30 20 21 3d  )).     || (0 !=
27480 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
27490 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
274a0 70 44 62 50 61 67 65 29 29 29 0a 20 20 29 7b 0a  pDbPage))).  ){.
274b0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
274c0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74  e_out;.  }.  put
274d0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
274e0 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70  ta, iTrunk);.  p
274f0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
27500 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
27510 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
27520 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61  ->aData[32], iPa
27530 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46  ge);.  TRACE(("F
27540 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
27550 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
27560 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61  acing %d\n", pPa
27570 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b  ge->pgno, iTrunk
27580 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75  ));..freepage_ou
27590 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  t:.  if( pPage )
275a0 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
275b0 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nit = 0;.  }.  r
275c0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
275d0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
275e0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  (pTrunk);.  retu
275f0 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
27600 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d  int freePage(Mem
27610 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
27620 72 65 74 75 72 6e 20 66 72 65 65 50 61 67 65 32  return freePage2
27630 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61  (pPage->pBt, pPa
27640 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ge, pPage->pgno)
27650 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
27660 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
27670 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
27680 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
27690 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
276a0 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61   clearCell(MemPa
276b0 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67  ge *pPage, unsig
276c0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29  ned char *pCell)
276d0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
276e0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
276f0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
27700 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
27710 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
27720 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f  t nOvfl;.  u16 o
27730 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  vflPageSize;..  
27740 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
27750 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
27760 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
27770 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
27780 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
27790 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
277a0 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d   info.iOverflow=
277b0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
277c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
277d0 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
277e0 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
277f0 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
27800 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67   */.  }.  ovflPg
27810 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
27820 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
27830 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  low]);.  assert(
27840 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
27850 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61   > 4 );.  ovflPa
27860 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
27870 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
27880 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50  nOvfl = (info.nP
27890 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c  ayload - info.nL
278a0 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
278b0 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
278c0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
278d0 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
278e0 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69  nOvfl>0 );.  whi
278f0 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
27900 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20     Pgno iNext = 
27910 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  0;.    MemPage *
27920 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69  pOvfl = 0;.    i
27930 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c  f( ovflPgno<2 ||
27940 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50   ovflPgno>pagerP
27950 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
27960 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e  .      /* 0 is n
27970 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20  ot a legal page 
27980 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
27990 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a  1 cannot be an .
279a0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
279b0 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72  w page. Therefor
279c0 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20  e if ovflPgno<2 
279d0 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  or past the end 
279e0 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
279f0 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61   file the databa
27a00 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
27a10 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  pt. */.      ret
27a20 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
27a30 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
27a40 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a     if( nOvfl ){.
27a50 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
27a60 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
27a70 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
27a80 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20  , &iNext);.     
27a90 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
27aa0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
27ab0 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42  c = freePage2(pB
27ac0 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67  t, pOvfl, ovflPg
27ad0 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 76  no);.    if( pOv
27ae0 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  fl ){.      sqli
27af0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
27b00 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  vfl->pDbPage);. 
27b10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
27b20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
27b30 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78   ovflPgno = iNex
27b40 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
27b50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
27b60 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
27b70 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
27b80 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
27b90 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
27ba0 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
27bb0 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
27bc0 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
27bd0 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
27be0 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
27bf0 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
27c00 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
27c10 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
27c20 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
27c30 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
27c40 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
27c50 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
27c60 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
27c70 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
27c80 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
27c90 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
27ca0 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
27cb0 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
27cc0 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
27cd0 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
27ce0 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
27cf0 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
27d00 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
27d10 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
27d20 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
27d30 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
27d40 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
27d50 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
27d60 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
27d70 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
27d80 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
27d90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27da0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
27db0 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
27dc0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
27dd0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
27de0 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
27df0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
27e00 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
27e10 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
27e20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
27e30 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
27e40 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  ta,int nData,   
27e50 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
27e60 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e80 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79  /* Extra zero by
27e90 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
27ea0 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20   pData */.  int 
27eb0 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
27ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
27ed0 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
27ee0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
27ef0 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
27f00 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
27f10 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20   nSrc, n, rc;.  
27f20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  int spaceLeft;. 
27f30 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
27f40 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
27f50 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a  pToRelease = 0;.
27f60 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
27f70 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
27f80 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
27f90 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
27fa0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
27fb0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66  ;.  Pgno pgnoOvf
27fc0 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65  l = 0;.  int nHe
27fd0 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ader;.  CellInfo
27fe0 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74   info;..  assert
27ff0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
28000 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
28010 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
28020 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65   pPage is not ne
28030 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61  cessarily writea
28040 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20  ble since pCell 
28050 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61  might be auxilia
28060 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73  ry.  ** buffer s
28070 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70  pace that is sep
28080 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70  arate from the p
28090 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61  Page buffer area
280a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
280b0 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ell<pPage->aData
280c0 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67   || pCell>=&pPag
280d0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
280e0 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
280f0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
28100 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
28110 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
28120 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
28130 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
28140 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20   nHeader = 0;.  
28150 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
28160 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
28170 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20  += 4;.  }.  if( 
28180 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
28190 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
281a0 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
281b0 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74  l[nHeader], nDat
281c0 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73  a+nZero);.  }els
281d0 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e  e{.    nData = n
281e0 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Zero = 0;.  }.  
281f0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
28200 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
28210 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b  der], *(u64*)&nK
28220 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73  ey);.  btreePars
28230 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
28240 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
28250 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48   assert( info.nH
28260 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29  eader==nHeader )
28270 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
28280 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
28290 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44   assert( info.nD
282a0 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61  ata==(u32)(nData
282b0 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20  +nZero) );.  .  
282c0 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
282d0 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79  ayload */.  nPay
282e0 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e  load = nData + n
282f0 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67  Zero;.  if( pPag
28300 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
28310 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
28320 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
28330 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a  .    nData = 0;.
28340 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66    }else{ .    if
28350 28 20 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ( nKey>0x7ffffff
28360 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 20 29 7b 0a  f || pKey==0 ){.
28370 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28380 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
28390 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
283a0 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20  += (int)nKey;.  
283b0 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
283c0 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e     nSrc = (int)n
283d0 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69  Key;.  }.  *pnSi
283e0 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  ze = info.nSize;
283f0 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69  .  spaceLeft = i
28400 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50  nfo.nLocal;.  pP
28410 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
28420 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69  nHeader];.  pPri
28430 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  or = &pCell[info
28440 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20  .iOverflow];..  
28450 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
28460 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
28470 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
28480 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28490 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
284a0 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
284b0 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
284c0 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
284d0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
284e0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
284f0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
28500 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
28510 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
28520 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
28530 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
28540 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
28550 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
28560 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
28570 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
28580 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
28590 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
285a0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
285b0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
285c0 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
285d0 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
285e0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
285f0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
28600 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
28610 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
28620 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
28630 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
28640 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
28650 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
28660 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
28670 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
28680 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
28690 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
286a0 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
286b0 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
286c0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
286d0 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
286e0 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
286f0 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
28700 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
28710 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
28720 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
28730 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
28740 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
28750 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
28760 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
28770 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
28780 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
28790 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
287a0 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
287b0 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
287c0 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ised values and 
287d0 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
287e0 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
287f0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
28800 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
28810 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
28820 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
28830 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28840 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
28850 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
28860 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
28870 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
28880 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
28890 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  Put(pBt, pgnoOvf
288a0 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74  l, eType, pgnoPt
288b0 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69  rmap);.        i
288c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
288d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
288e0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
288f0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
28900 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
28910 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
28920 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
28930 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
28940 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
28950 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
28960 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
28970 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
28980 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
28990 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
289a0 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
289b0 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
289c0 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
289d0 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
289e0 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
289f0 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
28a00 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
28a10 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
28a20 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
28a30 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
28a40 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
28a50 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
28a60 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
28a70 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
28a80 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
28a90 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
28aa0 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
28ab0 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
28ac0 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
28ad0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
28ae0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
28af0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
28b00 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
28b10 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
28b20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
28b30 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
28b40 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
28b50 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
28b60 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
28b70 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
28b80 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
28b90 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
28ba0 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
28bb0 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
28bc0 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
28bd0 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
28be0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
28bf0 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
28c00 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
28c10 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
28c20 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
28c30 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
28c40 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
28c50 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
28c60 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
28c70 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
28c80 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
28c90 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
28ca0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
28cb0 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
28cc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
28cd0 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
28ce0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
28cf0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
28d00 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
28d10 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
28d20 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
28d30 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
28d40 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
28d50 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
28d60 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
28d70 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
28d80 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
28d90 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
28da0 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
28db0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
28dc0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
28dd0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
28de0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
28df0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
28e00 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
28e10 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
28e20 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
28e30 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
28e40 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
28e50 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
28e60 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
28e70 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
28e80 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
28e90 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
28ea0 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
28eb0 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
28ec0 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
28ed0 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
28ee0 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
28ef0 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
28f00 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
28f10 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
28f20 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
28f30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
28f40 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
28f50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
28f60 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
28f70 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
28f80 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
28f90 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
28fa0 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
28fb0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
28fc0 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
28fd0 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
28fe0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
28ff0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
29000 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
29010 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
29020 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
29030 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
29040 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
29050 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
29060 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
29070 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
29080 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
29090 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
290a0 74 61 74 69 63 20 69 6e 74 20 64 72 6f 70 43 65  tatic int dropCe
290b0 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
290c0 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
290d0 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  sz){.  int i;   
290e0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
290f0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
29100 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
29110 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
29120 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
29130 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
29140 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
29150 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
29160 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
29170 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
29180 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
29190 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
291a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
291b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
291c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
291d0 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
291e0 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
291f0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  l );.  assert( s
29200 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
29210 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
29220 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
29230 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
29240 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
29250 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
29260 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
29270 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
29280 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
29290 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
292a0 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
292b0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64  ellOffset + 2*id
292c0 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62  x];.  pc = get2b
292d0 79 74 65 28 70 74 72 29 3b 0a 20 20 69 66 28 20  yte(ptr);.  if( 
292e0 28 70 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f 66  (pc<pPage->hdrOf
292f0 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c  fset+6+(pPage->l
29300 65 61 66 3f 30 3a 34 29 29 0a 20 20 20 20 20 7c  eaf?0:4)).     |
29310 7c 20 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d 3e  | (pc+sz>pPage->
29320 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
29330 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
29340 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29350 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  PT;.  }.  rc = f
29360 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
29370 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
29380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29390 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
293a0 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31   }.  for(i=idx+1
293b0 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
293c0 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a  ; i++, ptr+=2){.
293d0 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
293e0 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20  [2];.    ptr[1] 
293f0 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20  = ptr[3];.  }.  
29400 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
29410 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
29420 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
29430 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  t+3], pPage->nCe
29440 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ll);.  pPage->nF
29450 72 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74 75  ree += 2;.  retu
29460 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
29470 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
29480 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67  new cell on pPag
29490 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20  e at cell index 
294a0 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e  "i".  pCell poin
294b0 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ts to the.** con
294c0 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tent of the cell
294d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
294e0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  ell content will
294f0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
29500 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68  , then put it th
29510 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77  ere.  If it.** w
29520 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65  ill not fit, the
29530 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  n make a copy of
29540 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
29550 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a  t into pTemp if.
29560 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20  ** pTemp is not 
29570 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73  null.  Regardles
29580 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f  s of pTemp, allo
29590 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  cate a new entry
295a0 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f  .** in pPage->aO
295b0 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69  vfl[] and make i
295c0 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63  t point to the c
295d0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74  ell content (eit
295e0 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20  her.** in pTemp 
295f0 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
29600 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20  pCell) and also 
29610 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78  record its index
29620 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67  . .** Allocating
29630 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
29640 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69  pPage->aCell[] i
29650 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20  mplies that .** 
29660 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
29670 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
29680 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20  .**.** If nSkip 
29690 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
296a0 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68  n do not copy th
296b0 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79  e first nSkip by
296c0 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65  tes of the.** ce
296d0 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ll. The caller w
296e0 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
296f0 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75  em after this fu
29700 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
29710 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e  If.** nSkip is n
29720 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43  on-zero, then pC
29730 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e  ell may not poin
29740 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
29750 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
29760 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e  .** (but pCell+n
29770 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76  Skip is always v
29780 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  alid)..*/.static
29790 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28   int insertCell(
297a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
297b0 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
297c0 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
297d0 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
297e0 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
297f0 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
29800 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
29810 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
29820 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
29830 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
29840 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
29850 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
29860 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
29870 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
29880 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
29890 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
298a0 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
298b0 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
298c0 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ded */.  Pgno iC
298d0 68 69 6c 64 20 20 20 20 20 20 20 2f 2a 20 49 66  hild       /* If
298e0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61   non-zero, repla
298f0 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  ce first 4 bytes
29900 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65   with this value
29910 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
29920 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ;          /* Wh
29930 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
29940 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
29950 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
29960 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
29970 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
29980 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20  /.  int end;    
29990 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
299a0 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73  yte past the las
299b0 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
299c0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
299d0 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20  t ins;          
299e0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61  /* Index in data
299f0 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c  [] where new cel
29a00 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73  l pointer is ins
29a10 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63  erted */.  int c
29a20 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20  ellOffset;   /* 
29a30 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74  Address of first
29a40 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
29a50 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
29a60 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
29a70 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
29a80 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
29a90 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
29aa0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66         /* Used f
29ab0 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d  or moving inform
29ac0 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20  ation around in 
29ad0 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e 74  data[] */..  int
29ae0 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64   nSkip = (iChild
29af0 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 61 73   ? 4 : 0);..  as
29b00 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
29b10 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
29b20 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
29b30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29b40 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c  e->nCell<=MX_CEL
29b50 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26  L(pPage->pBt) &&
29b60 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
29b70 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20  pBt)<=5460 );.  
29b80 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
29b90 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
29ba0 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  ize(pPage->aOvfl
29bb0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
29bc0 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  z==cellSizePtr(p
29bd0 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a  Page, pCell) );.
29be0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
29bf0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
29c00 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
29c10 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
29c20 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b  nOverflow || sz+
29c30 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  2>pPage->nFree )
29c40 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20  {.    if( pTemp 
29c50 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
29c60 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65  pTemp+nSkip, pCe
29c70 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
29c80 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  ip);.      pCell
29c90 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
29ca0 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
29cb0 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
29cc0 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b  (pCell, iChild);
29cd0 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
29ce0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
29cf0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
29d00 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50  <(int)(sizeof(pP
29d10 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65  age->aOvfl)/size
29d20 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
29d30 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67  0])) );.    pPag
29d40 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c  e->aOvfl[j].pCel
29d50 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  l = pCell;.    p
29d60 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69  Page->aOvfl[j].i
29d70 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d  dx = (u16)i;.  }
29d80 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
29d90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
29da0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
29db0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
29dc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29dd0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29de0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
29df0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
29e00 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
29e10 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
29e20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
29e30 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  Data;.    cellOf
29e40 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
29e50 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
29e60 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
29e70 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
29e80 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f  .    ins = cellO
29e90 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20  ffset + 2*i;.   
29ea0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70   rc = allocateSp
29eb0 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26  ace(pPage, sz, &
29ec0 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  idx);.    if( rc
29ed0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29ee0 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 65    assert( idx>=e
29ef0 6e 64 2b 32 20 29 3b 0a 20 20 20 20 69 66 28 20  nd+2 );.    if( 
29f00 69 64 78 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e  idx+sz > pPage->
29f10 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
29f20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
29f30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
29f40 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
29f50 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
29f60 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
29f70 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29  -= (u16)(2 + sz)
29f80 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
29f90 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70  ta[idx+nSkip], p
29fa0 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
29fb0 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20 69  Skip);.    if( i
29fc0 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
29fd0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64  ut4byte(&data[id
29fe0 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  x], iChild);.   
29ff0 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64   }.    for(j=end
2a000 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20  , ptr=&data[j]; 
2a010 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72  j>ins; j-=2, ptr
2a020 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b  -=2){.      ptr[
2a030 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20  0] = ptr[-2];.  
2a040 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
2a050 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [-1];.    }.    
2a060 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
2a070 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70  ns], idx);.    p
2a080 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50  ut2byte(&data[pP
2a090 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
2a0a0 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
2a0b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2a0c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2a0d0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2a0e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2a0f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
2a100 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
2a110 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
2a120 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
2a130 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
2a140 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
2a150 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
2a160 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
2a170 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
2a180 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
2a190 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  n ptrmapPutOvflP
2a1a0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2a1b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2a1c0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
2a1d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2a1e0 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63   Add a list of c
2a1f0 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20  ells to a page. 
2a200 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64   The page should
2a210 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d   be initially em
2a220 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  pty..** The cell
2a230 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
2a240 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70   to fit on the p
2a250 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
2a260 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65  oid assemblePage
2a270 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
2a280 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge,   /* The pag
2a290 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69  e to be assembli
2a2a0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ed */.  int nCel
2a2b0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  l,        /* The
2a2c0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
2a2d0 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20   to add to this 
2a2e0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
2a2f0 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50  pCell,      /* P
2a300 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20  ointers to cell 
2a310 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20  bodies */.  u16 
2a320 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a  *aSize        /*
2a330 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65   Sizes of the ce
2a340 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lls */.){.  int 
2a350 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
2a360 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2a370 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b  .  u8 *pCellptr;
2a380 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
2a390 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69  of next cell poi
2a3a0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  nter */.  int ce
2a3b0 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41  llbody;     /* A
2a3c0 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
2a3d0 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38  ell body */.  u8
2a3e0 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20   * const data = 
2a3f0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
2a400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2a410 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72  nter to data for
2a420 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73   pPage */.  cons
2a430 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
2a440 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
2a450 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2a460 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70  t of header on p
2a470 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Page */.  const 
2a480 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50  int nUsable = pP
2a490 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2a4a0 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20  Size; /* Usable 
2a4b0 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a  size of page */.
2a4c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2a4d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
2a4e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2a4f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2a500 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2a510 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
2a520 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c  Cell>=0 && nCell
2a530 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
2a540 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c  >pBt) && MX_CELL
2a550 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34  (pPage->pBt)<=54
2a560 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  60 );.  assert( 
2a570 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2a580 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2a590 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
2a5a0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2a5b0 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62 65  page has just be
2a5c0 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72  en zeroed by zer
2a5d0 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73  oPage() */.  ass
2a5e0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2a5f0 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l==0 );.  assert
2a600 28 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ( get2byte(&data
2a610 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c  [hdr+5])==nUsabl
2a620 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72  e );..  pCellptr
2a630 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
2a640 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65  cellOffset + nCe
2a650 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64  ll*2];.  cellbod
2a660 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66  y = nUsable;.  f
2a670 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e  or(i=nCell-1; i>
2a680 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43  =0; i--){.    pC
2a690 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20  ellptr -= 2;.   
2a6a0 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69   cellbody -= aSi
2a6b0 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62  ze[i];.    put2b
2a6c0 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65  yte(pCellptr, ce
2a6d0 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d  llbody);.    mem
2a6e0 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f  cpy(&data[cellbo
2a6f0 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  dy], apCell[i], 
2a700 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20  aSize[i]);.  }. 
2a710 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2a720 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
2a730 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2a740 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64  [hdr+5], cellbod
2a750 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  y);.  pPage->nFr
2a760 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b  ee -= (nCell*2 +
2a770 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62   nUsable - cellb
2a780 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
2a790 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c  Cell = (u16)nCel
2a7a0 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
2a7b0 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
2a7c0 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68  ters determine h
2a7d0 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74  ow many adjacent
2a7e0 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c   pages get invol
2a7f0 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61  ved.** in a bala
2a800 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
2a810 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62    NN is the numb
2a820 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
2a830 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a  on either side.*
2a840 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  * of the page th
2a850 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69  at participate i
2a860 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
2a870 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69  operation.  NB i
2a880 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e  s the.** total n
2a890 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
2a8a0 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c  hat participate,
2a8b0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
2a8c0 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a  arget page and.*
2a8d0 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f  * NN neighbors o
2a8e0 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a  n either side..*
2a8f0 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  *.** The minimum
2a900 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20   value of NN is 
2a910 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20  1 (of course).  
2a920 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62  Increasing NN ab
2a930 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f  ove 1.** (to 2 o
2a940 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64  r 3) gives a mod
2a950 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  est improvement 
2a960 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45  in SELECT and DE
2a970 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  LETE performance
2a980 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20  .** in exchange 
2a990 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67  for a larger deg
2a9a0 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45  radation in INSE
2a9b0 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65  RT and UPDATE pe
2a9c0 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
2a9d0 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70  e value of NN ap
2a9e0 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68  pears to give th
2a9f0 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f  e best results o
2aa00 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69  verall..*/.#defi
2aa10 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20  ne NN 1         
2aa20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2aa30 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
2aa40 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
2aa50 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42  ge */.#define NB
2aa60 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f   (NN*2+1)      /
2aa70 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e  * Total pages in
2aa80 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61  volved in the ba
2aa90 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64  lance */...#ifnd
2aaa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
2aab0 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a  UICKBALANCE./*.*
2aac0 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
2aad0 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64  f balance() hand
2aae0 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73  les the common s
2aaf0 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
2ab00 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79  e.** a new entry
2ab10 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
2ab20 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d  ed on the extrem
2ab30 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74  e right-end of t
2ab40 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f  he.** tree, in o
2ab50 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e  ther words, when
2ab60 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
2ab70 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c  ill become the l
2ab80 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20  argest.** entry 
2ab90 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a  in the tree..**.
2aba0 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72  ** Instead of tr
2abb0 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65  ying balance the
2abc0 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65   3 right-most le
2abd0 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61  af pages, just a
2abe0 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65  dd.** a new page
2abf0 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61   to the right-ha
2ac00 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20  nd side and put 
2ac10 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72  the one new entr
2ac20 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67  y in.** that pag
2ac30 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20  e.  This leaves 
2ac40 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
2ac50 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77  f the tree somew
2ac60 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65  hat.** unbalance
2ac70 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65  d.  But odds are
2ac80 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
2ac90 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65   inserting new e
2aca0 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65  ntries.** at the
2acb0 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77   end soon afterw
2acc0 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72  ards so the near
2acd0 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  ly empty page wi
2ace0 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69  ll quickly.** fi
2acf0 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61  ll up.  On avera
2ad00 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20  ge..**.** pPage 
2ad10 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  is the leaf page
2ad20 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69   which is the ri
2ad30 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e  ght-most page in
2ad40 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50   the tree..** pP
2ad50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72  arent is its par
2ad60 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74  ent.  pPage must
2ad70 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f   have a single o
2ad80 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a  verflow entry.**
2ad90 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74   which is also t
2ada0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
2adb0 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  try on the page.
2adc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63  .**.** The pSpac
2add0 65 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  e buffer is used
2ade0 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70   to store a temp
2adf0 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68  orary copy of th
2ae00 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c  e divider.** cel
2ae10 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69  l that will be i
2ae20 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61  nserted into pPa
2ae30 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c  rent. Such a cel
2ae40 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
2ae50 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e  4.** byte page n
2ae60 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62  umber followed b
2ae70 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  y a variable len
2ae80 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20  gth integer. In 
2ae90 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
2aea0 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73  at most 13 bytes
2aeb0 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61  . Hence the pSpa
2aec0 63 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  ce buffer must b
2aed0 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33  e at.** least 13
2aee0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
2aef0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2af00 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50  lance_quick(MemP
2af10 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65  age *pParent, Me
2af20 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
2af30 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53   *pSpace){.  BtS
2af40 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74  hared *const pBt
2af50 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20   = pPage->pBt;  
2af60 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61    /* B-Tree Data
2af70 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  base */.  MemPag
2af80 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  e *pNew;        
2af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2afa0 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
2afb0 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  d page */.  int 
2afc0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afe0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
2aff0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
2b000 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
2b010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2b020 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77  e number of pNew
2b030 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
2b040 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2b050 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2b060 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2b070 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2b080 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
2b090 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
2b0a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2b0b0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
2b0c0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
2b0d0 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72 6e 20  ell<=0 ) return 
2b0e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2b0f0 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  KPT;..  /* Alloc
2b100 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ate a new page. 
2b110 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62  This page will b
2b120 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d  ecome the right-
2b130 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a  sibling of .  **
2b140 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65   pPage. Make the
2b150 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 72 69   parent page wri
2b160 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74  table, so that t
2b170 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
2b180 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ell.  ** may be 
2b190 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74  inserted. If bot
2b1a0 68 20 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f  h these operatio
2b1b0 6e 73 20 61 72 65 20 73 75 63 63 65 73 73 66 75  ns are successfu
2b1c0 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  l, proceed..  */
2b1d0 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
2b1e0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2b1f0 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20  pNew, &pgnoNew, 
2b200 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63  0, 0);..  if( rc
2b210 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a  ==SQLITE_OK ){..
2b220 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26      u8 *pOut = &
2b230 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75  pSpace[4];.    u
2b240 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65  8 *pCell = pPage
2b250 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c  ->aOvfl[0].pCell
2b260 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c  ;.    u16 szCell
2b270 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2b280 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
2b290 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20    u8 *pStop;..  
2b2a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2b2b0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2b2c0 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
2b2d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2b2e0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d  pPage->aData[0]=
2b2f0 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  =(PTF_INTKEY|PTF
2b300 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45  _LEAFDATA|PTF_LE
2b310 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  AF) );.    zeroP
2b320 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e  age(pNew, PTF_IN
2b330 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
2b340 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20  A|PTF_LEAF);.   
2b350 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
2b360 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26  ew, 1, &pCell, &
2b370 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a  szCell);..    /*
2b380 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
2b390 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
2b3a0 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
2b3b0 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20  pointer map.    
2b3c0 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20  ** with entries 
2b3d0 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65  for the new page
2b3e0 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65  , and any pointe
2b3f0 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  r from the .    
2b400 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70  ** cell on the p
2b410 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  age to an overfl
2b420 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 68  ow page. If eith
2b430 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20  er of these.    
2b440 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61  ** operations fa
2b450 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20  ils, the return 
2b460 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75 74  code is set, but
2b470 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
2b480 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65    ** of the pare
2b490 6e 74 20 70 61 67 65 20 61 72 65 20 73 74 69 6c  nt page are stil
2b4a0 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79  l manipulated by
2b4b0 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e   thh code below.
2b4c0 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20  .    ** That is 
2b4d0 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Ok, at this poin
2b4e0 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
2b4f0 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
2b500 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72  to.    ** be mar
2b510 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 52 65  ked as dirty. Re
2b520 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
2b530 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65   code will cause
2b540 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61   a.    ** rollba
2b550 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20  ck, undoing any 
2b560 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20  changes made to 
2b570 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2b580 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2b590 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2b5a0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2b5b0 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65  pPut(pBt, pgnoNe
2b5c0 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  w, PTRMAP_BTREE,
2b5d0 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b   pParent->pgno);
2b5e0 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c  .      if( szCel
2b5f0 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c  l>pNew->minLocal
2b600 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2b610 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2b620 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  = ptrmapPutOvflP
2b630 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 29 3b  tr(pNew, pCell);
2b640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b650 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
2b660 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74  a divider cell t
2b670 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50  o insert into pP
2b680 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64  arent. The divid
2b690 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63  er cell.    ** c
2b6a0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62  onsists of a 4-b
2b6b0 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  yte page number 
2b6c0 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (the page number
2b6d0 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20   of pPage) and. 
2b6e0 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65     ** a variable
2b6f0 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75   length key valu
2b700 65 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65  e (which must be
2b710 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
2b720 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61  as the.    ** la
2b730 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61  rgest key on pPa
2b740 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ge)..    **.    
2b750 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c  ** To find the l
2b760 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65  argest key value
2b770 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74   on pPage, first
2b780 20 66 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d   find the right-
2b790 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c  most .    ** cel
2b7a0 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20  l on pPage. The 
2b7b0 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73  first two fields
2b7c0 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72   of this cell ar
2b7d0 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65  e the .    ** re
2b7e0 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76  cord-length (a v
2b7f0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
2b800 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33  nteger at most 3
2b810 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a  2-bits in size).
2b820 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b      ** and the k
2b830 65 79 20 76 61 6c 75 65 20 28 61 20 76 61 72 69  ey value (a vari
2b840 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
2b850 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e  ger, may have an
2b860 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a  y value)..    **
2b870 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68   The first of th
2b880 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  e while(...) loo
2b890 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f  ps below skips o
2b8a0 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c  ver the record-l
2b8b0 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65  ength.    ** fie
2b8c0 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77  ld. The second w
2b8d0 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63  hile(...) loop c
2b8e0 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20 76 61  opies the key va
2b8f0 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  lue from the.   
2b900 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67   ** cell on pPag
2b910 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63  e into the pSpac
2b920 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f  e buffer..    */
2b930 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
2b940 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
2b950 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  ge->nCell-1);.  
2b960 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c    pStop = &pCell
2b970 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
2b980 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30  (*(pCell++)&0x80
2b990 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70  ) && pCell<pStop
2b9a0 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20   );.    pStop = 
2b9b0 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77  &pCell[9];.    w
2b9c0 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b  hile( ((*(pOut++
2b9d0 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26  ) = *(pCell++))&
2b9e0 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70  0x80) && pCell<p
2b9f0 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Stop );..    /* 
2ba00 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64  Insert the new d
2ba10 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
2ba20 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20   pParent. */.   
2ba30 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
2ba40 65 6e 74 2c 70 50 61 72 65 6e 74 2d 3e 6e 43 65  ent,pParent->nCe
2ba50 6c 6c 2c 70 53 70 61 63 65 2c 28 69 6e 74 29 28  ll,pSpace,(int)(
2ba60 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 30 2c 70  pOut-pSpace),0,p
2ba70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  Page->pgno);..  
2ba80 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67    /* Set the rig
2ba90 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ht-child pointer
2baa0 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70   of pParent to p
2bab0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
2bac0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74  page. */.    put
2bad0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
2bae0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
2baf0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
2bb00 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  oNew);.  .    /*
2bb10 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   Release the ref
2bb20 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  erence to the ne
2bb30 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72  w page. */.    r
2bb40 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
2bb50 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2bb60 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
2bb70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
2bb80 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66  KBALANCE */..#if
2bb90 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75   0./*.** This fu
2bba0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
2bbb0 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68  contribute anyth
2bbc0 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ing to the opera
2bbd0 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a  tion of SQLite..
2bbe0 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d  ** it is sometim
2bbf0 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65 6d  es activated tem
2bc00 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64  porarily while d
2bc10 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65  ebugging code re
2bc20 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f  sponsible .** fo
2bc30 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65  r setting pointe
2bc40 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a  r-map entries..*
2bc50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
2bc60 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65  mapCheckPages(Me
2bc70 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20  mPage **apPage, 
2bc80 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  int nPage){.  in
2bc90 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d  t i, j;.  for(i=
2bca0 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29  0; i<nPage; i++)
2bcb0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20  {.    Pgno n;.  
2bcc0 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50    u8 e;.    MemP
2bcd0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50  age *pPage = apP
2bce0 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68  age[i];.    BtSh
2bcf0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
2bd00 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  e->pBt;.    asse
2bd10 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2bd20 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  t );..    for(j=
2bd30 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; j<pPage->nCel
2bd40 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43  l; j++){.      C
2bd50 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
2bd60 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20      u8 *z;.     
2bd70 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43  .      z = findC
2bd80 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20  ell(pPage, j);. 
2bd90 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
2bda0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c  ellPtr(pPage, z,
2bdb0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69   &info);.      i
2bdc0 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
2bdd0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  w ){.        Pgn
2bde0 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
2bdf0 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  e(&z[info.iOverf
2be00 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  low]);.        p
2be10 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76  trmapGet(pBt, ov
2be20 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  fl, &e, &n);.   
2be30 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
2be40 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
2be50 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
2be60 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  W1 );.      }.  
2be70 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2be80 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2be90 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74  Pgno child = get
2bea0 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20  4byte(z);.      
2beb0 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
2bec0 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
2bed0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2bee0 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
2bef0 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  && e==PTRMAP_BTR
2bf00 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  EE );.      }.  
2bf10 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61    }.    if( !pPa
2bf20 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2bf30 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67    Pgno child = g
2bf40 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2bf50 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2bf60 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2bf70 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
2bf80 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
2bf90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2bfa0 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
2bfb0 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45   e==PTRMAP_BTREE
2bfc0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
2bfd0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
2bfe0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
2bff0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
2c000 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74  to copy the cont
2c010 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72  ents of the b-tr
2c020 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a  ee node stored .
2c030 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d  ** on page pFrom
2c040 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66   to page pTo. If
2c050 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20   page pFrom was 
2c060 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c  not a leaf page,
2c070 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69   then.** the poi
2c080 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2c090 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20   for each child 
2c0a0 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65 64  page are updated
2c0b0 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
2c0c0 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72  parent page stor
2c0d0 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ed in the pointe
2c0e0 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70 54  r map is page pT
2c0f0 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74  o. If pFrom cont
2c100 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c  ained.** any cel
2c110 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77  ls with overflow
2c120 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20   page pointers, 
2c130 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70  then the corresp
2c140 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a  onding pointer.*
2c150 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72  * map entries ar
2c160 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73  e also updated s
2c170 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65 6e  o that the paren
2c180 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20 70  t page is page p
2c190 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72  To..**.** If pFr
2c1a0 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  om is currently 
2c1b0 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65  carrying any ove
2c1c0 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74  rflow cells (ent
2c1d0 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d  ries in the.** M
2c1e0 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61  emPage.aOvfl[] a
2c1f0 72 72 61 79 29 2c 20 74 68 65 79 20 61 72 65 20  rray), they are 
2c200 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54  not copied to pT
2c210 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  o. .**.** Before
2c220 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65   returning, page
2c230 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61   pTo is reinitia
2c240 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65  lized using btre
2c250 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a  eInitPage()..**.
2c260 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e  ** The performan
2c270 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ce of this funct
2c280 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69  ion is not criti
2c290 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20  cal. It is only 
2c2a0 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20  used by .** the 
2c2b0 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65  balance_shallowe
2c2c0 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f  r() and balance_
2c2d0 64 65 65 70 65 72 28 29 20 70 72 6f 63 65 64 75  deeper() procedu
2c2e0 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a  res, neither of.
2c2f0 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63 61 6c  ** which are cal
2c300 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20  led often under 
2c310 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61  normal circumsta
2c320 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nces..*/.static 
2c330 69 6e 74 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74  int copyNodeCont
2c340 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72  ent(MemPage *pFr
2c350 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  om, MemPage *pTo
2c360 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 20  ){.  BtShared * 
2c370 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f  const pBt = pFro
2c380 6d 2d 3e 70 42 74 3b 0a 20 20 75 38 20 2a 20 63  m->pBt;.  u8 * c
2c390 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72  onst aFrom = pFr
2c3a0 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20  om->aData;.  u8 
2c3b0 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54  * const aTo = pT
2c3c0 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20  o->aData;.  int 
2c3d0 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d  const iFromHdr =
2c3e0 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65   pFrom->hdrOffse
2c3f0 74 3b 0a 20 20 69 6e 74 20 63 6f 6e 73 74 20 69  t;.  int const i
2c400 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70  ToHdr = ((pTo->p
2c410 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20  gno==1) ? 100 : 
2c420 30 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  0);.  int rc = S
2c430 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2c440 69 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74  iData;..  assert
2c450 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20  ( pFrom->isInit 
2c460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 72  );.  assert( pFr
2c470 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64  om->nFree>=iToHd
2c480 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67  r );.  assert( g
2c490 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
2c4a0 46 72 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74  FromHdr+5])<=pBt
2c4b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
2c4c0 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62  .  /* Copy the b
2c4d0 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65  -tree node conte
2c4e0 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72  nt from page pFr
2c4f0 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
2c500 2a 2f 0a 20 20 69 44 61 74 61 20 3d 20 67 65 74  */.  iData = get
2c510 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72  2byte(&aFrom[iFr
2c520 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d  omHdr+5]);.  mem
2c530 63 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c  cpy(&aTo[iData],
2c540 20 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20   &aFrom[iData], 
2c550 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
2c560 69 44 61 74 61 29 3b 0a 20 20 6d 65 6d 63 70 79  iData);.  memcpy
2c570 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26  (&aTo[iToHdr], &
2c580 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c  aFrom[iFromHdr],
2c590 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73   pFrom->cellOffs
2c5a0 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43  et + 2*pFrom->nC
2c5b0 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 52 65 69 6e  ell);..  /* Rein
2c5c0 69 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54  itialize page pT
2c5d0 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  o so that the co
2c5e0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65  ntents of the Me
2c5f0 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 0a  mPage structure.
2c600 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e    ** match the n
2c610 65 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69  ew data. The ini
2c620 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70  tialization of p
2c630 54 6f 20 22 63 61 6e 6e 6f 74 22 20 66 61 69 6c  To "cannot" fail
2c640 2c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 64 61  , as the.  ** da
2c650 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 70  ta copied from p
2c660 46 72 6f 6d 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  From is known to
2c670 20 62 65 20 76 61 6c 69 64 2e 20 20 2a 2f 0a 20   be valid.  */. 
2c680 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30   pTo->isInit = 0
2c690 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 72 63 20  ;.  TESTONLY(rc 
2c6a0 3d 20 29 20 62 74 72 65 65 49 6e 69 74 50 61 67  = ) btreeInitPag
2c6b0 65 28 70 54 6f 29 3b 0a 20 20 61 73 73 65 72 74  e(pTo);.  assert
2c6c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c6d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
2c6e0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
2c6f0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
2c700 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
2c710 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  map entries.  **
2c720 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20   for any b-tree 
2c730 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
2c740 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63  s that pTo now c
2c750 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
2c760 74 65 72 73 20 74 6f 2e 20 2a 2f 0a 20 20 69 66  ters to. */.  if
2c770 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2c780 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
2c790 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b  ildPtrmaps(pTo);
2c7a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c7b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2c7c0 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
2c7d0 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74  butes cells on t
2c7e0 68 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68  he iParentIdx'th
2c7f0 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
2c800 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20  t.** (hereafter 
2c810 22 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20  "the page") and 
2c820 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73  up to 2 siblings
2c830 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67   so that all pag
2c840 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68  es have about th
2c850 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74  e.** same amount
2c860 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20   of free space. 
2c870 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65  Usually a single
2c880 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68   sibling on eith
2c890 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a  er side of the.*
2c8a0 2a 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20  * page are used 
2c8b0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
2c8c0 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69  , though both si
2c8d0 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
2c8e0 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69  e from one.** si
2c8f0 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  de if the page i
2c900 73 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c  s the first or l
2c910 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73  ast child of its
2c920 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20   parent. If the 
2c930 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77  page .** has few
2c940 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e  er than 2 siblin
2c950 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68  gs (something wh
2c960 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
2c970 70 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a  pen if the page.
2c980 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67  ** is a root pag
2c990 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20  e or a child of 
2c9a0 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65  a root page) the
2c9b0 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
2c9c0 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74  siblings.** part
2c9d0 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
2c9e0 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
2c9f0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
2ca00 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61  blings of the pa
2ca10 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
2ca20 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
2ca30 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72  ed by .** one or
2ca40 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
2ca50 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
2ca60 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
2ca70 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a  not over full. .
2ca80 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2ca90 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
2caa0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
2cab0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
2cac0 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69  n the page.** mi
2cad0 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
2cae0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65   be stored in Me
2caf0 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54  mPage.aData[]. T
2cb00 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
2cb10 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
2cb20 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20   overfull. This 
2cb30 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
2cb40 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61  that all cells a
2cb50 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74  llocated.** to t
2cb60 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
2cb70 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74  siblings fit int
2cb80 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  o MemPage.aData[
2cb90 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ] before returni
2cba0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ng..**.** In the
2cbb0 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
2cbc0 63 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e  cing the page an
2cbd0 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20  d its siblings, 
2cbe0 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20  cells may be.** 
2cbf0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72  inserted into or
2cc00 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
2cc10 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70  e parent page (p
2cc20 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73  Parent). Doing s
2cc30 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74  o.** may cause t
2cc40 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74  he parent page t
2cc50 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
2cc60 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
2cc70 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65  If this.** happe
2cc80 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ns, it is the re
2cc90 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
2cca0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e  the caller to in
2ccb0 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74  voke the correct
2ccc0 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f  .** balancing ro
2ccd0 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69  utine to fix thi
2cce0 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74  s problem (see t
2ccf0 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75  he balance() rou
2cd00 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  tine). .**.** If
2cd10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
2cd20 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
2cd30 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
2cd40 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
2cd50 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
2cd60 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74  d state. So if t
2cd70 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
2cd80 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
2cd90 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
2cda0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
2cdb0 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
2cdc0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
2cdd0 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c  ion, aOvflSpace,
2cde0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2cdf0 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 70 61 67   a.** buffer pag
2ce00 65 2d 73 69 7a 65 20 62 79 74 65 73 20 69 6e 20  e-size bytes in 
2ce10 73 69 7a 65 2e 20 49 66 2c 20 69 6e 20 69 6e 73  size. If, in ins
2ce20 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74  erting cells int
2ce30 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20  o the parent.** 
2ce40 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2c 20  page (pParent), 
2ce50 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2ce60 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c  becomes overfull
2ce70 2c 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73  , this buffer is
2ce80 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
2ce90 65 20 74 68 65 20 70 61 72 65 6e 74 73 20 6f 76  e the parents ov
2cea0 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65  erflow cells. Be
2ceb0 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
2cec0 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61  ion inserts.** a
2ced0 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72   maximum of four
2cee0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
2cef0 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
2cf00 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78  age, and the max
2cf10 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  imum.** size of 
2cf20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69  a cell stored wi
2cf30 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  thin an internal
2cf40 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20   node is always 
2cf50 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a  less than 1/4.**
2cf60 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
2cf70 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63  e, the aOvflSpac
2cf80 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67 75  e[] buffer is gu
2cf90 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
2cfa0 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66  arge.** enough f
2cfb0 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  or all overflow 
2cfc0 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cells..**.** If 
2cfd0 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73 65  aOvflSpace is se
2cfe0 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  t to a null poin
2cff0 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
2d000 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
2d010 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
2d020 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2d030 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65  ce_nonroot(.  Me
2d040 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
2d050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d060 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20   Parent page of 
2d070 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62  siblings being b
2d080 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  alanced */.  int
2d090 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20   iParentIdx,    
2d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d0b0 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70 61  Index of "the pa
2d0c0 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  ge" in pParent *
2d0d0 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61  /.  u8 *aOvflSpa
2d0e0 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
2d0f0 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65      /* page-size
2d100 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2d110 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20  for parent ovfl 
2d120 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 20  */.  int isRoot 
2d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d140 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2d150 70 50 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f  pParent is a roo
2d160 74 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 42  t-page */.){.  B
2d170 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
2d180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d190 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73  he whole databas
2d1a0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
2d1b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2d1c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2d1d0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
2d1e0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  [] */.  int nMax
2d1f0 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
2d200 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
2d210 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c  d size of apCell
2d220 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e  , szCell, aFrom.
2d230 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d   */.  int nNew =
2d240 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d250 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2d260 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d  pages in apNew[]
2d270 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20   */.  int nOld; 
2d280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d290 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2d2a0 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d  pages in apOld[]
2d2b0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20   */.  int i, j, 
2d2c0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2d2d0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2d2e0 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44  ers */.  int nxD
2d2f0 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
2d300 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69        /* Next di
2d310 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50  vider slot in pP
2d320 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
2d330 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2d340 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2d350 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
2d360 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61  ode */.  u16 lea
2d370 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20  fCorrection;    
2d380 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50        /* 4 if pP
2d390 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
2d3a0 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e  0 if not */.  in
2d3b0 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20  t leafData;     
2d3c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2d3d0 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61  ue if pPage is a
2d3e0 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44   leaf of a LEAFD
2d3f0 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e  ATA tree */.  in
2d400 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20  t usableSpace;  
2d410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
2d420 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79  tes in pPage bey
2d430 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a  ond the header *
2d440 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67  /.  int pageFlag
2d450 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2d460 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61   /* Value of pPa
2d470 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a  ge->aData[0] */.
2d480 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20    int subtotal; 
2d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d4a0 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79  * Subtotal of by
2d4b0 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20  tes in cells on 
2d4c0 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  one page */.  in
2d4d0 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20  t iSpace1 = 0;  
2d4e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2d4f0 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
2d500 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a  of aSpace1[] */.
2d510 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65    int iOvflSpace
2d520 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
2d530 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
2d540 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63  yte of aOvflSpac
2d550 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  e[] */.  int szS
2d560 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  cratch;         
2d570 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2d580 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
2d590 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d  requested */.  M
2d5a0 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42  emPage *apOld[NB
2d5b0 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  ];          /* p
2d5c0 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74  Page and up to t
2d5d0 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  wo siblings */. 
2d5e0 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
2d5f0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
2d600 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
2d610 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
2d620 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
2d630 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
2d640 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
2d650 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
2d660 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
2d670 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68  g */.  u8 *pRigh
2d680 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2d690 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20      /* Location 
2d6a0 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67  in parent of rig
2d6b0 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74  ht-sibling point
2d6c0 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69  er */.  u8 *apDi
2d6d0 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20  v[NB-1];        
2d6e0 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20       /* Divider 
2d6f0 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
2d700 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77   */.  int cntNew
2d710 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
2d720 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
2d730 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61  Cell[] of cell a
2d740 66 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a  fter i-th page *
2d750 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42  /.  int szNew[NB
2d760 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
2d770 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a   /* Combined siz
2d780 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65  e of cells place
2d790 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f   on i-th page */
2d7a0 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d  .  u8 **apCell =
2d7b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d7c0 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
2d7d0 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
2d7e0 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
2d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d800 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
2d810 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
2d820 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53  ll[] */.  u8 *aS
2d830 70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20  pace1;          
2d840 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
2d850 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69  for copies of di
2d860 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a  viders cells */.
2d870 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
2d880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d890 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74  * Temp var to st
2d8a0 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ore a page numbe
2d8b0 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d  r in */..  pBt =
2d8c0 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20   pParent->pBt;. 
2d8d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2d8e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2d8f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2d900 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2d910 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2d920 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2d930 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45  ;..#if 0.  TRACE
2d940 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
2d950 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
2d960 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
2d970 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
2d980 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  pgno));.#endif..
2d990 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
2d9a0 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68  nt pParent may h
2d9b0 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
2d9c0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41  overflow cell. A
2d9d0 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20  nd if.  ** this 
2d9e0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73  overflow cell is
2d9f0 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73   present, it mus
2da00 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69  t be the cell wi
2da10 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  th .  ** index i
2da20 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20  ParentIdx. This 
2da30 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61  scenario comes a
2da40 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66  bout when this f
2da50 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
2da60 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74  called (indirect
2da70 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ly) from sqlite3
2da80 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e 20 2a  BtreeDelete(). *
2da90 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
2daa0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
2dab0 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  0 || pParent->nO
2dac0 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20  verflow==1 );.  
2dad0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
2dae0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
2daf0 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b   pParent->aOvfl[
2db00 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e 74 49  0].idx==iParentI
2db10 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f  dx );..  if( !aO
2db20 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20  vflSpace ){.    
2db30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2db40 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  MEM;.  }..  /* F
2db50 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20  ind the sibling 
2db60 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65  pages to balance
2db70 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68  . Also locate th
2db80 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  e cells in pPare
2db90 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69  nt .  ** that di
2dba0 76 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67  vide the sibling
2dbb0 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  s. An attempt is
2dbc0 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e   made to find NN
2dbd0 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20   siblings on .  
2dbe0 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  ** either side o
2dbf0 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69  f pPage. More si
2dc00 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e  blings are taken
2dc10 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20   from one side, 
2dc20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69  however, .  ** i
2dc30 66 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65  f there are fewe
2dc40 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e  r than NN siblin
2dc50 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20  gs on the other 
2dc60 73 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74  side. If pParent
2dc70 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20  .  ** has NB or 
2dc80 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74  fewer children t
2dc90 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  hen all children
2dca0 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20   of pParent are 
2dcb0 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20  taken.  .  **.  
2dcc0 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73  ** This loop als
2dcd0 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69 76 69  o drops the divi
2dce0 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74  der cells from t
2dcf0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
2dd00 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74  This.  ** way, t
2dd10 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
2dd20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
2dd30 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65  s not have to de
2dd40 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a  al with any.  **
2dd50 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
2dd60 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  in the parent pa
2dd70 67 65 2c 20 61 73 20 69 66 20 6f 6e 65 20 65 78  ge, as if one ex
2dd80 69 73 74 65 64 20 69 74 20 68 61 73 20 61 6c 72  isted it has alr
2dd90 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 72  eady.  ** been r
2dda0 65 6d 6f 76 65 64 2e 20 20 2a 2f 0a 20 20 69 20  emoved.  */.  i 
2ddb0 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  = pParent->nOver
2ddc0 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e  flow + pParent->
2ddd0 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32  nCell;.  if( i<2
2dde0 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
2ddf0 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 69 2b  0;.    nOld = i+
2de00 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
2de10 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20 20 69 66  nOld = 3;.    if
2de20 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20  ( iParentIdx==0 
2de30 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
2de40 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20     .      nxDiv 
2de50 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
2de60 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69  f( iParentIdx==i
2de70 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20   ){.      nxDiv 
2de80 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65 6c 73 65  = i-2;.    }else
2de90 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  {.      nxDiv = 
2dea0 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20  iParentIdx-1;.  
2deb0 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 3b 0a 20    }.    i = 2;. 
2dec0 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69   }.  if( (i+nxDi
2ded0 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
2dee0 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e  flow)==pParent->
2def0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69  nCell ){.    pRi
2df00 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e  ght = &pParent->
2df10 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
2df20 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d  drOffset+8];.  }
2df30 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74  else{.    pRight
2df40 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72   = findCell(pPar
2df50 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
2df60 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
2df70 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67  ;.  }.  pgno = g
2df80 65 74 34 62 79 74 65 28 70 52 69 67 68 74 29 3b  et4byte(pRight);
2df90 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
2dfa0 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
2dfb0 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
2dfc0 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  , &apOld[i]);.  
2dfd0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2dfe0 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20    memset(apOld, 
2dff0 30 2c 20 69 2a 73 69 7a 65 6f 66 28 4d 65 6d 50  0, i*sizeof(MemP
2e000 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f  age*));.      go
2e010 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2e020 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  up;.    }.    nM
2e030 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f  axCells += 1+apO
2e040 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f  ld[i]->nCell+apO
2e050 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ld[i]->nOverflow
2e060 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d  ;.    if( (i--)=
2e070 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =0 ) break;..   
2e080 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f   if( pParent->nO
2e090 76 65 72 66 6c 6f 77 20 26 26 20 69 2b 6e 78 44  verflow && i+nxD
2e0a0 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 4f 76  iv==pParent->aOv
2e0b0 66 6c 5b 30 5d 2e 69 64 78 20 29 7b 0a 20 20 20  fl[0].idx ){.   
2e0c0 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50     apDiv[i] = pP
2e0d0 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  arent->aOvfl[0].
2e0e0 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70 67 6e  pCell;.      pgn
2e0f0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  o = get4byte(apD
2e100 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a  iv[i]);.      sz
2e110 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  New[i] = cellSiz
2e120 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70  ePtr(pParent, ap
2e130 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70  Div[i]);.      p
2e140 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2e150 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  w = 0;.    }else
2e160 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d  {.      apDiv[i]
2e170 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72   = findCell(pPar
2e180 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
2e190 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
2e1a0 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67  ;.      pgno = g
2e1b0 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d  et4byte(apDiv[i]
2e1c0 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69  );.      szNew[i
2e1d0 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
2e1e0 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
2e1f0 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72  ]);..      /* Dr
2e200 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  op the cell from
2e210 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2e220 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c  . apDiv[i] still
2e230 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20   points to.     
2e240 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74   ** the cell wit
2e250 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20  hin the parent, 
2e260 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68  even though it h
2e270 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e  as been dropped.
2e280 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
2e290 73 20 73 61 66 65 20 62 65 63 61 75 73 65 20 64  s safe because d
2e2a0 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f  ropping a cell o
2e2b0 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 74  nly overwrites t
2e2c0 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a  he first.      *
2e2d0 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20  * four bytes of 
2e2e0 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e  it, and this fun
2e2f0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e  ction does not n
2e300 65 65 64 20 74 68 65 20 66 69 72 73 74 0a 20 20  eed the first.  
2e310 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65      ** four byte
2e320 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
2e330 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f   cell. So the po
2e340 69 6e 74 65 72 20 69 73 20 73 61 66 65 20 74 6f  inter is safe to
2e350 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61   use.      ** la
2e360 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20  ter on.  .      
2e370 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65  **.      ** Unle
2e380 73 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  ss SQLite is com
2e390 70 69 6c 65 64 20 69 6e 20 73 65 63 75 72 65 2d  piled in secure-
2e3a0 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20  delete mode. In 
2e3b0 74 68 69 73 20 63 61 73 65 2c 0a 20 20 20 20 20  this case,.     
2e3c0 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c   ** the dropCell
2e3d0 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
2e3e0 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e  overwrite the en
2e3f0 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a  tire cell with z
2e400 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  eroes..      ** 
2e410 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65  In this case, te
2e420 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74  mporarily copy t
2e430 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65  he cell into the
2e440 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20   aOvflSpace[].  
2e450 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49      ** buffer. I
2e460 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64  t will be copied
2e470 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f   out again as so
2e480 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65  on as the aSpace
2e490 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20  [] buffer.      
2e4a0 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  ** is allocated.
2e4b0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
2e4c0 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
2e4d0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61  .      memcpy(&a
2e4e0 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b  OvflSpace[apDiv[
2e4f0 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  i]-pParent->aDat
2e500 61 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a  a], apDiv[i], sz
2e510 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61  New[i]);.      a
2e520 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c  pDiv[i] = &aOvfl
2e530 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70  Space[apDiv[i]-p
2e540 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a  Parent->aData];.
2e550 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64 72 6f  #endif.      dro
2e560 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  pCell(pParent, i
2e570 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
2e580 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77  nOverflow, szNew
2e590 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [i]);.    }.  }.
2e5a0 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43  .  /* Make nMaxC
2e5b0 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20  ells a multiple 
2e5c0 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f  of 4 in order to
2e5d0 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65   preserve 8-byte
2e5e0 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20  .  ** alignment 
2e5f0 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d  */.  nMaxCells =
2e600 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29   (nMaxCells + 3)
2e610 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  &~3;..  /*.  ** 
2e620 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
2e630 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  or memory struct
2e640 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20  ures.  */.  k = 
2e650 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  pBt->pageSize + 
2e660 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
2e670 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72  mPage));.  szScr
2e680 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d  atch =.       nM
2e690 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
2e6a0 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  8*)             
2e6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43            /* apC
2e6c0 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d  ell */.     + nM
2e6d0 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
2e6e0 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20  16)             
2e6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43            /* szC
2e700 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42  ell */.     + pB
2e710 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20  t->pageSize     
2e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70            /* aSp
2e740 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b  ace1 */.     + k
2e750 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20  *nOld;          
2e760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2e780 67 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70  ge copies (apCop
2e790 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d  y) */.  apCell =
2e7a0 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d   sqlite3ScratchM
2e7b0 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68  alloc( szScratch
2e7c0 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c   ); .  if( apCel
2e7d0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
2e7e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2e7f0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2e800 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73  cleanup;.  }.  s
2e810 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61  zCell = (u16*)&a
2e820 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  pCell[nMaxCells]
2e830 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75  ;.  aSpace1 = (u
2e840 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43  8*)&szCell[nMaxC
2e850 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28  ells];.  assert(
2e860 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2e870 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29  NMENT(aSpace1) )
2e880 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61  ;..  /*.  ** Loa
2e890 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c  d pointers to al
2e8a0 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69  l cells on sibli
2e8b0 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ng pages and the
2e8c0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
2e8d0 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63   ** into the loc
2e8e0 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61  al apCell[] arra
2e8f0 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20  y.  Make copies 
2e900 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
2e910 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73  ells.  ** into s
2e920 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
2e930 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64  om aSpace1[] and
2e940 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20   remove the the 
2e950 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20  divider Cells.  
2e960 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e  ** from pParent.
2e970 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
2e980 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f  e siblings are o
2e990 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68  n leaf pages, th
2e9a0 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69  en the child poi
2e9b0 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a  nters of the.  *
2e9c0 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * divider cells 
2e9d0 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f  are stripped fro
2e9e0 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f  m the cells befo
2e9f0 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69  re they are copi
2ea00 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70  ed.  ** into aSp
2ea10 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73  ace1[].  In this
2ea20 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20   way, all cells 
2ea30 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20  in apCell[] are 
2ea40 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69  without.  ** chi
2ea50 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66  ld pointers.  If
2ea60 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
2ea70 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61  t leaves, then a
2ea80 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20  ll cell in.  ** 
2ea90 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65  apCell[] include
2eaa0 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
2eab0 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c    Either way, al
2eac0 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
2ead0 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69  l[].  ** are ali
2eae0 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65  ke..  **.  ** le
2eaf0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34  afCorrection:  4
2eb00 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
2eb10 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65  eaf.  0 if pPage
2eb20 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a   is not a leaf..
2eb30 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44    **       leafD
2eb40 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65  ata:  1 if pPage
2eb50 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20   holds key+data 
2eb60 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64  and pParent hold
2eb70 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a  s only keys..  *
2eb80 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69  /.  leafCorrecti
2eb90 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c  on = apOld[0]->l
2eba0 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74  eaf*4;.  leafDat
2ebb0 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61  a = apOld[0]->ha
2ebc0 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30  sData;.  for(i=0
2ebd0 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
2ebe0 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20      int limit;. 
2ebf0 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72     .    /* Befor
2ec00 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
2ec10 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f   else, take a co
2ec20 70 79 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f  py of the i'th o
2ec30 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a  riginal sibling.
2ec40 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20      ** The rest 
2ec50 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2ec60 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66   will use data f
2ec70 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72  rom the copies r
2ec80 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  ather.    ** tha
2ec90 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
2eca0 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f  ages since the o
2ecb0 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69  riginal pages wi
2ecc0 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20  ll be in the.   
2ecd0 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62   ** process of b
2ece0 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
2ecf0 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  .  */.    MemPag
2ed00 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
2ed10 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  [i] = (MemPage*)
2ed20 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61  &aSpace1[pBt->pa
2ed30 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20  geSize + k*i];. 
2ed40 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20     memcpy(pOld, 
2ed50 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66  apOld[i], sizeof
2ed60 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20  (MemPage));.    
2ed70 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76  pOld->aData = (v
2ed80 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20  oid*)&pOld[1];. 
2ed90 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e     memcpy(pOld->
2eda0 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d  aData, apOld[i]-
2edb0 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67  >aData, pBt->pag
2edc0 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d  eSize);..    lim
2edd0 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  it = pOld->nCell
2ede0 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  +pOld->nOverflow
2edf0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
2ee00 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
2ee10 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
2ee20 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
2ee30 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
2ee40 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
2ee50 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
2ee60 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
2ee70 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
2ee80 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
2ee90 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 6e 43  Cell]);.      nC
2eea0 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ell++;.    }.   
2eeb0 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26   if( i<nOld-1 &&
2eec0 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20 20 20   !leafData){.   
2eed0 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75 31 36     u16 sz = (u16
2eee0 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20  )szNew[i];.     
2eef0 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
2ef00 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
2ef10 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
2ef20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
2ef30 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 54 65   = sz;.      pTe
2ef40 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53  mp = &aSpace1[iS
2ef50 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 69 53  pace1];.      iS
2ef60 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20  pace1 += sz;.   
2ef70 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
2ef80 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29  Bt->pageSize/4 )
2ef90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2efa0 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61  iSpace1<=pBt->pa
2efb0 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
2efc0 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70  memcpy(pTemp, ap
2efd0 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20  Div[i], sz);.   
2efe0 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
2eff0 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72   = pTemp+leafCor
2f000 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61  rection;.      a
2f010 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
2f020 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66  ction==0 || leaf
2f030 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
2f040 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
2f050 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43  ell] = szCell[nC
2f060 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65  ell] - leafCorre
2f070 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  ction;.      if(
2f080 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a   !pOld->leaf ){.
2f090 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f0a0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
2f0b0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
2f0c0 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66  ert( pOld->hdrOf
2f0d0 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  fset==0 );.     
2f0e0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
2f0f0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63  pointer of the c
2f100 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62  hild page pOld b
2f110 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a  ecomes the left.
2f120 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
2f130 65 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  er of the divide
2f140 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  r cell */.      
2f150 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b    memcpy(apCell[
2f160 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61  nCell], &pOld->a
2f170 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20  Data[8], 4);.   
2f180 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f190 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
2f1a0 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20  rrection==4 );. 
2f1b0 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
2f1c0 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20  l[nCell]<4 ){.  
2f1d0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
2f1e0 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c  t allow any cell
2f1f0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34  s smaller than 4
2f200 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20   bytes. */.     
2f210 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
2f220 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l] = 4;.        
2f230 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2f240 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nCell++;.    }. 
2f250 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
2f260 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d  gure out the num
2f270 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65  ber of pages nee
2f280 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ded to hold all 
2f290 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a  nCell cells..  *
2f2a0 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d  * Store this num
2f2b0 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73  ber in "k".  Als
2f2c0 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b  o compute szNew[
2f2d0 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74  ] which is the t
2f2e0 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  otal.  ** size o
2f2f0 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74  f all cells on t
2f300 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64  he i-th page and
2f310 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20   cntNew[] which 
2f320 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  is the index.  *
2f330 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66  * in apCell[] of
2f340 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64   the cell that d
2f350 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72  ivides page i fr
2f360 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20  om page i+1.  . 
2f370 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68   ** cntNew[k] sh
2f380 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c  ould equal nCell
2f390 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75  ..  **.  ** Valu
2f3a0 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  es computed by t
2f3b0 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a  his block:.  **.
2f3c0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b    **           k
2f3d0 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  : The total numb
2f3e0 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61  er of sibling pa
2f3f0 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65  ges.  **    szNe
2f400 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65  w[i]: Spaced use
2f410 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69  d on the i-th si
2f420 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
2f430 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e     cntNew[i]: In
2f440 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  dex in apCell[] 
2f450 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72  and szCell[] for
2f460 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
2f470 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  to.  **         
2f480 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f       the right o
2f490 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  f the i-th sibli
2f4a0 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73  ng page..  ** us
2f4b0 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65  ableSpace: Numbe
2f4c0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
2f4d0 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  ace available on
2f4e0 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20   each sibling.. 
2f4f0 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62   ** .  */.  usab
2f500 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75  leSpace = pBt->u
2f510 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b  sableSize - 12 +
2f520 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
2f530 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d  .  for(subtotal=
2f540 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  k=i=0; i<nCell; 
2f550 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
2f560 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( i<nMaxCells );
2f570 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d  .    subtotal +=
2f580 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a   szCell[i] + 2;.
2f590 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c      if( subtotal
2f5a0 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29   > usableSpace )
2f5b0 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d  {.      szNew[k]
2f5c0 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a   = subtotal - sz
2f5d0 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63  Cell[i];.      c
2f5e0 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20  ntNew[k] = i;.  
2f5f0 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61      if( leafData
2f600 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
2f610 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20   subtotal = 0;. 
2f620 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20       k++;.      
2f630 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63  if( k>NB+1 ){ rc
2f640 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2f650 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f  T; goto balance_
2f660 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d  cleanup; }.    }
2f670 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20  .  }.  szNew[k] 
2f680 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e  = subtotal;.  cn
2f690 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b  tNew[k] = nCell;
2f6a0 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20  .  k++;..  /*.  
2f6b0 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63  ** The packing c
2f6c0 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70  omputed by the p
2f6d0 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73  revious block is
2f6e0 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74   biased toward t
2f6f0 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a  he siblings.  **
2f700 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64   on the left sid
2f710 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62  e.  The left sib
2f720 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73  lings are always
2f730 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68   nearly full, wh
2f740 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67  ile the.  ** rig
2f750 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
2f760 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20  might be nearly 
2f770 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f  empty.  This blo
2f780 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d  ck of code attem
2f790 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75  pts.  ** to adju
2f7a0 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f  st the packing o
2f7b0 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65  f siblings to ge
2f7c0 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e  t a better balan
2f7d0 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
2f7e0 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
2f7f0 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70   more than an op
2f800 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65  timization.  The
2f810 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d   packing above m
2f820 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20  ight.  ** be so 
2f830 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61  out of balance a
2f840 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e  s to be illegal.
2f850 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
2f860 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
2f870 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  ** sibling might
2f880 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   be completely e
2f890 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75  mpty.  This adju
2f8a0 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70  stment is not op
2f8b0 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66  tional..  */.  f
2f8c0 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69  or(i=k-1; i>0; i
2f8d0 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52  --){.    int szR
2f8e0 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b  ight = szNew[i];
2f8f0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62    /* Size of sib
2f900 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68  ling on the righ
2f910 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  t */.    int szL
2f920 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d  eft = szNew[i-1]
2f930 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62  ; /* Size of sib
2f940 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74  ling on the left
2f950 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20   */.    int r;  
2f960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f970 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f  ndex of right-mo
2f980 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20  st cell in left 
2f990 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69  sibling */.    i
2f9a0 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20  nt d;           
2f9b0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
2f9c0 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65  irst cell to the
2f9d0 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73   left of right s
2f9e0 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72  ibling */..    r
2f9f0 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
2fa00 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20   1;.    d = r + 
2fa10 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
2fa20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78    assert( d<nMax
2fa30 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
2fa40 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73  ert( r<nMaxCells
2fa50 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73   );.    while( s
2fa60 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52  zRight==0 || szR
2fa70 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32  ight+szCell[d]+2
2fa80 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c  <=szLeft-(szCell
2fa90 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20  [r]+2) ){.      
2faa0 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c  szRight += szCel
2fab0 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[d] + 2;.      
2fac0 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c  szLeft -= szCell
2fad0 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63  [r] + 2;.      c
2fae0 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20  ntNew[i-1]--;.  
2faf0 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
2fb00 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64  -1] - 1;.      d
2fb10 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
2fb20 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ata;.    }.    s
2fb30 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68  zNew[i] = szRigh
2fb40 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31  t;.    szNew[i-1
2fb50 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a  ] = szLeft;.  }.
2fb60 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20  .  /* Either we 
2fb70 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  found one or mor
2fb80 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b  e cells (cntnew[
2fb90 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20  0])>0) or pPage 
2fba0 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61  is.  ** a virtua
2fbb0 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20  l root page.  A 
2fbc0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
2fbd0 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65  e is when the re
2fbe0 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67  al root.  ** pag
2fbf0 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20  e is page 1 and 
2fc00 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20  we are the only 
2fc10 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61  child of that pa
2fc20 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
2fc30 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c  t( cntNew[0]>0 |
2fc40 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  | (pParent->pgno
2fc50 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  ==1 && pParent->
2fc60 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20  nCell==0) );..  
2fc70 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2fc80 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20   old: %d %d %d  
2fc90 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d  ",.    apOld[0]-
2fca0 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64  >pgno, .    nOld
2fcb0 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e  >=2 ? apOld[1]->
2fcc0 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f  pgno : 0,.    nO
2fcd0 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d  ld>=3 ? apOld[2]
2fce0 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b  ->pgno : 0.  ));
2fcf0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
2fd00 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73  cate k new pages
2fd10 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67  .  Reuse old pag
2fd20 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c  es where possibl
2fd30 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 70  e..  */.  if( ap
2fd40 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20  Old[0]->pgno<=1 
2fd50 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2fd60 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
2fd70 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2fd80 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65  anup;.  }.  page
2fd90 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d  Flags = apOld[0]
2fda0 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f  ->aData[0];.  fo
2fdb0 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
2fdc0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
2fdd0 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e  New;.    if( i<n
2fde0 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  Old ){.      pNe
2fdf0 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61  w = apNew[i] = a
2fe00 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61  pOld[i];.      a
2fe10 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
2fe20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2fe30 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e  agerWrite(pNew->
2fe40 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2fe50 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nNew++;.      if
2fe60 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
2fe70 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2fe80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
2fe90 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
2fea0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
2feb0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2fec0 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e  pNew, &pgno, pgn
2fed0 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 0);.      if(
2fee0 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
2fef0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2ff00 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65    apNew[i] = pNe
2ff10 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  w;.      nNew++;
2ff20 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
2ff30 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
2ff40 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77  ntry for the new
2ff50 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
2ff60 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55  /.      if( ISAU
2ff70 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2ff80 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2ff90 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67  ut(pBt, pNew->pg
2ffa0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
2ffb0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
2ffc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2ffd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ffe0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
2fff0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
30000 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
30010 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
30020 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61   Free any old pa
30030 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
30040 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20  t reused as new 
30050 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  pages..  */.  wh
30060 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20  ile( i<nOld ){. 
30070 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
30080 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
30090 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
300a0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
300b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
300c0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pOld[i]);.    ap
300d0 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
300e0 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  i++;.  }..  /*. 
300f0 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20   ** Put the new 
30100 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
30110 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ng order.  This 
30120 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65  helps to.  ** ke
30130 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ep entries in th
30140 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f  e disk file in o
30150 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73  rder so that a s
30160 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  can.  ** of the 
30170 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61  table is a linea
30180 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
30190 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20  he file.  That. 
301a0 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70   ** in turn help
301b0 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  s the operating 
301c0 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65  system to delive
301d0 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f  r pages.  ** fro
301e0 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20  m the disk more 
301f0 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rapidly..  **.  
30200 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73  ** An O(n^2) ins
30210 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f  ertion sort algo
30220 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62  rithm is used, b
30230 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20  ut since.  ** n 
30240 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  is never more th
30250 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63  an NB (a small c
30260 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73  onstant), that s
30270 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62  hould.  ** not b
30280 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a  e a problem..  *
30290 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d  *.  ** When NB==
302a0 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69  3, this one opti
302b0 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74  mization makes t
302c0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
302d0 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65   about 25% faste
302e0 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65  r for large inse
302f0 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74  rtions and delet
30300 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
30310 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b  (i=0; i<k-1; i++
30320 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20  ){.    int minV 
30330 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  = apNew[i]->pgno
30340 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d  ;.    int minI =
30350 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   i;.    for(j=i+
30360 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<k; j++){.  
30370 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d      if( apNew[j]
30380 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64  ->pgno<(unsigned
30390 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20  )minV ){.       
303a0 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20   minI = j;.     
303b0 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b     minV = apNew[
303c0 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20  j]->pgno;.      
303d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
303e0 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
303f0 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d  int t;.      Mem
30400 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
30410 74 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67  t = apNew[i]->pg
30420 6e 6f 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61  no;.      pT = a
30430 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61  pNew[i];.      a
30440 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b  pNew[i] = apNew[
30450 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
30460 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20  ew[minI] = pT;. 
30470 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45     }.  }.  TRACE
30480 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25  (("new: %d(%d) %
30490 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
304a0 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20  %d) %d(%d)\n",. 
304b0 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e     apNew[0]->pgn
304c0 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20  o, szNew[0],.   
304d0 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77   nNew>=2 ? apNew
304e0 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [1]->pgno : 0, n
304f0 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31  New>=2 ? szNew[1
30500 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
30510 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70  =3 ? apNew[2]->p
30520 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  gno : 0, nNew>=3
30530 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
30540 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61  .    nNew>=4 ? a
30550 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[3]->pgno : 
30560 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e  0, nNew>=4 ? szN
30570 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[3] : 0,.    n
30580 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34  New>=5 ? apNew[4
30590 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
305a0 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20  w>=5 ? szNew[4] 
305b0 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  : 0));..  assert
305c0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
305d0 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
305e0 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
305f0 20 70 75 74 34 62 79 74 65 28 70 52 69 67 68 74   put4byte(pRight
30600 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  , apNew[nNew-1]-
30610 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20  >pgno);..  /*.  
30620 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69  ** Evenly distri
30630 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  bute the data in
30640 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73   apCell[] across
30650 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a   the new pages..
30660 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69    ** Insert divi
30670 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70  der cells into p
30680 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73  Parent as necess
30690 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20  ary..  */.  j = 
306a0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
306b0 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
306c0 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20  /* Assemble the 
306d0 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
306e0 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
306f0 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69   *pNew = apNew[i
30700 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  ];.    assert( j
30710 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
30720 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
30730 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20   pageFlags);.   
30740 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
30750 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c  ew, cntNew[i]-j,
30760 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a   &apCell[j], &sz
30770 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73  Cell[j]);.    as
30780 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c  sert( pNew->nCel
30790 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20  l>0 || (nNew==1 
307a0 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29  && cntNew[0]==0)
307b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
307c0 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  pNew->nOverflow=
307d0 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63  =0 );..    j = c
307e0 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f  ntNew[i];..    /
307f0 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
30800 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20   page assembled 
30810 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68  above was not th
30820 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  e right-most sib
30830 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73  ling,.    ** ins
30840 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65  ert a divider ce
30850 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ll into the pare
30860 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
30870 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e      assert( i<nN
30880 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c  ew-1 || j==nCell
30890 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43   );.    if( j<nC
308a0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ell ){.      u8 
308b0 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38  *pCell;.      u8
308c0 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69   *pTemp;.      i
308d0 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73  nt sz;..      as
308e0 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
308f0 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  s );.      pCell
30900 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20   = apCell[j];.  
30910 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b      sz = szCell[
30920 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  j] + leafCorrect
30930 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  ion;.      pTemp
30940 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69   = &aOvflSpace[i
30950 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20  OvflSpace];.    
30960 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61    if( !pNew->lea
30970 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  f ){.        mem
30980 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61  cpy(&pNew->aData
30990 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a  [8], pCell, 4);.
309a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
309b0 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
309c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72      /* If the tr
309d0 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74  ee is a leaf-dat
309e0 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20  a tree, and the 
309f0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61  siblings are lea
30a00 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a  ves, .        **
30a10 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
30a20 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  o divider cell i
30a30 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74  n apCell[]. Inst
30a40 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72  ead, the divider
30a50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c   .        ** cel
30a60 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  l consists of th
30a70 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  e integer key fo
30a80 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  r the right-most
30a90 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20   cell of .      
30aa0 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
30ab0 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20  -page assembled 
30ac0 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20  above only..    
30ad0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43      */.        C
30ae0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
30af0 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
30b00 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
30b10 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c  lPtr(pNew, apCel
30b20 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  l[j], &info);.  
30b30 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
30b40 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20  emp;.        sz 
30b50 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28  = 4 + putVarint(
30b60 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e  &pCell[4], info.
30b70 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70  nKey);.        p
30b80 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Temp = 0;.      
30b90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
30ba0 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20  Cell -= 4;.     
30bb0 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61     /* Obscure ca
30bc0 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d  se for non-leaf-
30bd0 64 61 74 61 20 74 72 65 65 73 3a 20 49 66 20 74  data trees: If t
30be0 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c  he cell at pCell
30bf0 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20   was.        ** 
30c00 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65  previously store
30c10 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65  d on a leaf node
30c20 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74  , and its report
30c30 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20  ed size was 4.  
30c40 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20        ** bytes, 
30c50 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75  then it may actu
30c60 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20  ally be smaller 
30c70 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20  than this .     
30c80 20 20 20 2a 2a 20 28 73 65 65 20 62 74 72 65 65     ** (see btree
30c90 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
30ca0 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20 6d  4 bytes is the m
30cb0 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20  inimum size of. 
30cc0 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65         ** any ce
30cd0 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20 69  ll). But it is i
30ce0 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73  mportant to pass
30cf0 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a   the correct siz
30d00 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a  e to .        **
30d10 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73   insertCell(), s
30d20 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63 65  o reparse the ce
30d30 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20  ll now..        
30d40 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f  **.        ** No
30d50 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6e  te that this can
30d60 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e   never happen in
30d70 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20   an SQLite data 
30d80 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20  file, as all.   
30d90 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72       ** cells ar
30da0 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  e at least 4 byt
30db0 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70  es. It only happ
30dc0 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75  ens in b-trees u
30dd0 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  sed.        ** t
30de0 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28  o evaluate "IN (
30df0 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64  SELECT ...)" and
30e00 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73   similar clauses
30e10 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
30e20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
30e30 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  j]==4 ){.       
30e40 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f     assert(leafCo
30e50 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20  rrection==4);.  
30e60 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
30e70 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
30e80 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  , pCell);.      
30e90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30ea0 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20    iOvflSpace += 
30eb0 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
30ec0 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ( sz<=pBt->pageS
30ed0 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61  ize/4 );.      a
30ee0 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63  ssert( iOvflSpac
30ef0 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
30f00 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69   );.      rc = i
30f10 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
30f20 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c  t, nxDiv, pCell,
30f30 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77   sz, pTemp, pNew
30f40 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
30f50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30f60 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
30f70 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
30f80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
30f90 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
30fa0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
30fb0 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a   );..      j++;.
30fc0 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20        nxDiv++;. 
30fd0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
30fe0 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20  t( j==nCell );. 
30ff0 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20   assert( nOld>0 
31000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
31010 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61  w>0 );.  if( (pa
31020 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45  geFlags & PTF_LE
31030 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38  AF)==0 ){.    u8
31040 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f   *zChild = &apCo
31050 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74  py[nOld-1]->aDat
31060 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  a[8];.    memcpy
31070 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  (&apNew[nNew-1]-
31080 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c  >aData[8], zChil
31090 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  d, 4);.  }..  if
310a0 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72  ( isRoot && pPar
310b0 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  ent->nCell==0 &&
310c0 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66   pParent->hdrOff
310d0 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e  set<=apNew[0]->n
310e0 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Free ){.    /* T
310f0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
31100 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63  the b-tree now c
31110 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
31120 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69  . The only sibli
31130 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69  ng.    ** page i
31140 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
31150 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e  d of the parent.
31160 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   Copy the conten
31170 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
31180 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f   child page into
31190 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63   the parent, dec
311a0 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72  reasing the over
311b0 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68  all height of th
311c0 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20  e.    ** b-tree 
311d0 73 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65  structure by one
311e0 2e 20 54 68 69 73 20 69 73 20 64 65 73 63 72 69  . This is descri
311f0 62 65 64 20 61 73 20 74 68 65 20 22 62 61 6c 61  bed as the "bala
31200 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20  nce-shallower". 
31210 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69     ** sub-algori
31220 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75  thm in some docu
31230 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  mentation..    *
31240 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  *.    ** If this
31250 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
31260 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  um database, the
31270 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64   call to copyNod
31280 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20  eContent() .    
31290 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e  ** sets all poin
312a0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
312b0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
312c0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
312d0 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f  pages .    ** fo
312e0 72 20 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e  r which the poin
312f0 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 77 69  ter is stored wi
31300 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  thin the content
31310 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20   being copied.. 
31320 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
31330 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62   second assert b
31340 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
31350 61 74 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  at the child pag
31360 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65  e is defragmente
31370 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73  d.    ** (it mus
31380 74 20 62 65 2c 20 61 73 20 69 74 20 77 61 73 20  t be, as it was 
31390 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74  just reconstruct
313a0 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c  ed using assembl
313b0 65 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20  ePage()). This. 
313c0 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61     ** is importa
313d0 6e 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74  nt if the parent
313e0 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f   page happens to
313f0 20 62 65 20 70 61 67 65 20 31 20 6f 66 20 74 68   be page 1 of th
31400 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
31410 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20  * image.  */.   
31420 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31   assert( nNew==1
31430 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
31440 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20  apNew[0]->nFree 
31450 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65 74  == .        (get
31460 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d  2byte(&apNew[0]-
31470 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77  >aData[5])-apNew
31480 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d  [0]->cellOffset-
31490 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a  apNew[0]->nCell*
314a0 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  2) .    );.    i
314b0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  f( SQLITE_OK==(r
314c0 63 20 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74  c = copyNodeCont
314d0 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50  ent(apNew[0], pP
314e0 61 72 65 6e 74 29 29 20 29 7b 0a 20 20 20 20 20  arent)) ){.     
314f0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 61   rc = freePage(a
31500 70 4e 65 77 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a  pNew[0]);.    }.
31510 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55    }else if( ISAU
31520 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
31530 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74  /* Fix the point
31540 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
31550 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73  or all the cells
31560 20 74 68 61 74 20 77 65 72 65 20 73 68 69 66 74   that were shift
31570 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20  ed around. .    
31580 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 76  ** There are sev
31590 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74  eral different t
315a0 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d  ypes of pointer-
315b0 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68 61 74  map entries that
315c0 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20   need to.    ** 
315d0 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
315e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53   this routine. S
315f0 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61 76  ome of these hav
31600 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61  e been set alrea
31610 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d  dy, but.    ** m
31620 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68  any have not. Th
31630 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
31640 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a   summary:.    **
31650 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65  .    **   1) The
31660 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
31670 74 65 64 20 77 69 74 68 20 6e 65 77 20 73 69 62  ted with new sib
31680 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61 74 20  ling pages that 
31690 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  were not.    ** 
316a0 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68       siblings wh
316b0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
316c0 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65   was called. The
316d0 73 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  se have already.
316e0 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e      **      been
316f0 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e   set. We don't n
31700 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f  eed to worry abo
31710 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20  ut old siblings 
31720 74 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a  that were.    **
31730 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74        moved to t
31740 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74  he free-list - t
31750 68 65 20 66 72 65 65 50 61 67 65 28 29 20 63 6f  he freePage() co
31760 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72  de has taken car
31770 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66  e.    **      of
31780 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20   those..    **. 
31790 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70     **   2) The p
317a0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
317b0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
317c0 74 68 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  th the first ove
317d0 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20  rflow.    **    
317e0 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76    page in any ov
317f0 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73  erflow chains us
31800 65 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65  ed by new divide
31810 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a  r cells. These .
31820 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65      **      have
31830 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65   also already be
31840 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66  en taken care of
31850 20 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65   by the insertCe
31860 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a  ll() code..    *
31870 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66  *.    **   3) If
31880 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
31890 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  es are not leave
318a0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
318b0 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a  d pages of.    *
318c0 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f  *      cells sto
318d0 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69  red on the sibli
318e0 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65  ng pages may nee
318f0 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  d to be updated.
31900 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
31910 20 34 29 20 49 66 20 74 68 65 20 73 69 62 6c 69   4) If the sibli
31920 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  ng pages are not
31930 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79   internal intkey
31940 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79   nodes, then any
31950 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65  .    **      ove
31960 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64  rflow pages used
31970 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20   by these cells 
31980 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75  may need to be u
31990 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20  pdated.    **   
319a0 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74     (internal int
319b0 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20  key nodes never 
319c0 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
319d0 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
319e0 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  es)..    **.    
319f0 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65 20 73  **   5) If the s
31a00 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
31a10 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
31a20 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
31a30 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e  p.    **      en
31a40 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 72 69  tries for the ri
31a50 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20  ght-child pages 
31a60 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20  of each sibling 
31a70 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
31a80 20 20 20 20 20 74 6f 20 62 65 20 75 70 64 61 74       to be updat
31a90 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
31aa0 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20 32 20  * Cases 1 and 2 
31ab0 61 72 65 20 64 65 61 6c 74 20 77 69 74 68 20 61  are dealt with a
31ac0 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f  bove by other co
31ad0 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20  de. The next.   
31ae0 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20   ** block deals 
31af0 77 69 74 68 20 63 61 73 65 73 20 33 20 61 6e 64  with cases 3 and
31b00 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61   4 and the one a
31b10 66 74 65 72 20 74 68 61 74 2c 20 63 61 73 65 20  fter that, case 
31b20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20  5. Since.    ** 
31b30 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65  setting a pointe
31b40 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61  r map entry is a
31b50 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65   relatively expe
31b60 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c  nsive operation,
31b70 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64   this.    ** cod
31b80 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e  e only sets poin
31b90 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
31ba0 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65  for child or ove
31bb0 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74  rflow pages that
31bc0 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74   have.    ** act
31bd0 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77  ually moved betw
31be0 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20  een pages.  */. 
31bf0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
31c00 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20   = apNew[0];.   
31c10 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
31c20 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20   apCopy[0];.    
31c30 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  int nOverflow = 
31c40 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
31c50 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c  .    int iNextOl
31c60 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20  d = pOld->nCell 
31c70 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  + nOverflow;.   
31c80 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d   int iOverflow =
31c90 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f   (nOverflow ? pO
31ca0 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ld->aOvfl[0].idx
31cb0 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20   : -1);.    j = 
31cc0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
31cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31ce0 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20  * Current 'old' 
31cf0 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a  sibling page */.
31d00 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20      k = 0;      
31d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
31d30 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20  t 'new' sibling 
31d40 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  page */.    for(
31d50 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 20 26 26 20  i=0; i<nCell && 
31d60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
31d70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
31d80 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20  sDivider = 0;.  
31d90 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e      while( i==iN
31da0 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  extOld ){.      
31db0 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74    /* Cell i is t
31dc0 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74  he cell immediat
31dd0 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
31de0 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f  e last cell on o
31df0 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  ld.        ** si
31e00 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66  bling page j. If
31e10 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
31e20 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73  e not leaf pages
31e30 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a   of an.        *
31e40 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c  * intkey b-tree,
31e50 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73   then cell i was
31e60 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e   a divider cell.
31e70 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c 64   */.        pOld
31e80 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a   = apCopy[++j];.
31e90 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64          iNextOld
31ea0 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61   = i + !leafData
31eb0 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b   + pOld->nCell +
31ec0 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
31ed0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
31ee0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  ld->nOverflow ){
31ef0 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72  .          nOver
31f00 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76  flow = pOld->nOv
31f10 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20  erflow;.        
31f20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20    iOverflow = i 
31f30 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f  + !leafData + pO
31f40 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ld->aOvfl[0].idx
31f50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31f60 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20      isDivider = 
31f70 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20 20  !leafData;  .   
31f80 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
31f90 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c  rt(nOverflow>0 |
31fa0 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b  | iOverflow<i );
31fb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f  .      assert(nO
31fc0 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c  verflow<2 || pOl
31fd0 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d  d->aOvfl[0].idx=
31fe0 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e  =pOld->aOvfl[1].
31ff0 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 61 73  idx-1);.      as
32000 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33  sert(nOverflow<3
32010 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b   || pOld->aOvfl[
32020 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f  1].idx==pOld->aO
32030 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20  vfl[2].idx-1);. 
32040 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65       if( i==iOve
32050 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
32060 20 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a   isDivider = 1;.
32070 20 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e          if( (--n
32080 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20  Overflow)>0 ){. 
32090 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c           iOverfl
320a0 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ow++;.        }.
320b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
320c0 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20  f( i==cntNew[k] 
320d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65  ){.        /* Ce
320e0 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c  ll i is the cell
320f0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
32100 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
32110 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20  cell on new.    
32120 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70      ** sibling p
32130 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69  age k. If the si
32140 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
32150 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a  eaf pages of an.
32160 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65          ** intke
32170 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63  y b-tree, then c
32180 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69 64  ell i is a divid
32190 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20  er cell.  */.   
321a0 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65       pNew = apNe
321b0 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  w[++k];.        
321c0 69 66 28 20 21 6c 65 61 66 44 61 74 61 20 29 20  if( !leafData ) 
321d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
321e0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
321f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
32200 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
32210 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61  <nOld );.      a
32220 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b  ssert( k<nNew );
32230 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
32240 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69  e cell was origi
32250 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65  nally divider ce
32260 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e  ll (and is not n
32270 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ow) or.      ** 
32280 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  an overflow cell
32290 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c  , or if the cell
322a0 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20   was located on 
322b0 61 20 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c  a different sibl
322c0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ing.      ** pag
322d0 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c  e before the bal
322e0 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65  ancing, then the
322f0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
32300 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ries associated.
32310 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e        ** with an
32320 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66  y child or overf
32330 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64 20 74  low pages need t
32340 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a  o be updated.  *
32350 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 44 69  /.      if( isDi
32360 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70  vider || pOld->p
32370 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20  gno!=pNew->pgno 
32380 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
32390 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29  leafCorrection )
323a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
323b0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
323c0 67 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b  get4byte(apCell[
323d0 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  i]), PTRMAP_BTRE
323e0 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a  E, pNew->pgno);.
323f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32400 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e    if( szCell[i]>
32410 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 26  pNew->minLocal &
32420 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
32430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
32440 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  = ptrmapPutOvflP
32450 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b  tr(pNew, apCell[
32460 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
32470 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
32480 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65    if( !leafCorre
32490 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66  ction ){.      f
324a0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
324b0 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 4e 65 77 3b  TE_OK && i<nNew;
324c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72   i++){.        r
324d0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 0a 09  c = ptrmapPut(..
324e0 20 20 20 20 70 42 74 2c 20 67 65 74 34 62 79 74      pBt, get4byt
324f0 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61  e(&apNew[i]->aDa
32500 74 61 5b 38 5d 29 2c 20 50 54 52 4d 41 50 5f 42  ta[8]), PTRMAP_B
32510 54 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e  TREE, apNew[i]->
32520 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pgno);.      }. 
32530 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20     }..#if 0.    
32540 2f 2a 20 54 68 65 20 70 74 72 6d 61 70 43 68 65  /* The ptrmapChe
32550 63 6b 50 61 67 65 73 28 29 20 63 6f 6e 74 61 69  ckPages() contai
32560 6e 73 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ns assert() stat
32570 65 6d 65 6e 74 73 20 74 68 61 74 20 76 65 72 69  ements that veri
32580 66 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61  fy that.    ** a
32590 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  ll pointer map p
325a0 61 67 65 73 20 61 72 65 20 73 65 74 20 63 6f 72  ages are set cor
325b0 72 65 63 74 6c 79 2e 20 54 68 69 73 20 69 73 20  rectly. This is 
325c0 68 65 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a 20  helpful while . 
325d0 20 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e     ** debugging.
325e0 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
325f0 20 64 69 73 61 62 6c 65 64 20 62 65 63 61 75 73   disabled becaus
32600 65 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  e a corrupt data
32610 62 61 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20  base may.    ** 
32620 63 61 75 73 65 20 61 6e 20 61 73 73 65 72 74 28  cause an assert(
32630 29 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 66  ) statement to f
32640 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72  ail.  */.    ptr
32650 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 61 70  mapCheckPages(ap
32660 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  New, nNew);.    
32670 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
32680 28 26 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23  (&pParent, 1);.#
32690 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73  endif.  }..  ass
326a0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73  ert( pParent->is
326b0 49 6e 69 74 20 29 3b 0a 20 20 54 52 41 43 45 28  Init );.  TRACE(
326c0 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73  ("BALANCE: finis
326d0 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d  hed: old=%d new=
326e0 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a  %d cells=%d\n",.
326f0 20 20 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20            nOld, 
32700 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a  nNew, nCell));..
32710 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75    /*.  ** Cleanu
32720 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  p before returni
32730 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65  ng..  */.balance
32740 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
32750 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61  te3ScratchFree(a
32760 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d  pCell);.  for(i=
32770 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
32780 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
32790 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a  (apOld[i]);.  }.
327a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
327b0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  w; i++){.    rel
327c0 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69  easePage(apNew[i
327d0 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ]);.  }..  retur
327e0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
327f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
32800 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
32810 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
32820 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
32830 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20   is.** overfull 
32840 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  (has one or more
32850 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29   overflow pages)
32860 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68  ..**.** A new ch
32870 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  ild page is allo
32880 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 63 6f  cated and the co
32890 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 75  ntents of the cu
328a0 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61  rrent root.** pa
328b0 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76  ge, including ov
328c0 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72  erflow cells, ar
328d0 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  e copied into th
328e0 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f  e child. The roo
328f0 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65  t.** page is the
32900 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20 74 6f  n overwritten to
32910 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d 70 74   make it an empt
32920 79 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20  y page with the 
32930 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20  right-child .** 
32940 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67  pointer pointing
32950 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
32960 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
32970 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f  eturning, all po
32980 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
32990 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  s corresponding 
329a0 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74 68 61  to pages .** tha
329b0 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 2d  t the new child-
329c0 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  page now contain
329d0 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 72  s pointers to ar
329e0 65 20 75 70 64 61 74 65 64 2e 20 54 68 65 0a 2a  e updated. The.*
329f0 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73 70 6f  * entry correspo
32a00 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77  nding to the new
32a10 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69   right-child poi
32a20 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74  nter of the root
32a30 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c 73 6f  .** page is also
32a40 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
32a50 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
32a60 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20 74  ppChild is set t
32a70 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 66 65  o contain a refe
32a80 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 68 69  rence to the chi
32a90 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20  ld .** page and 
32aa0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
32ab0 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  urned. In this c
32ac0 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 69  ase the caller i
32ad0 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
32ae0 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67   call releasePag
32af0 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20  e() on *ppChild 
32b00 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66  exactly once. If
32b10 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
32b20 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  ,.** an error co
32b30 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
32b40 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73  nd *ppChild is s
32b50 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74  et to 0..*/.stat
32b60 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  ic int balance_d
32b70 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  eeper(MemPage *p
32b80 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  Root, MemPage **
32b90 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20  ppChild){.  int 
32ba0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
32bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
32bc0 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
32bd0 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f  subprocedures */
32be0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69  .  MemPage *pChi
32bf0 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ld = 0;         
32c00 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
32c10 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
32c20 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43   */.  Pgno pgnoC
32c30 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
32c40 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
32c50 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ber of the new c
32c60 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42  hild page */.  B
32c70 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
32c80 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a  Root->pBt;    /*
32c90 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20   The BTree */.. 
32ca0 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
32cb0 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20  nOverflow>0 );. 
32cc0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
32cd0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
32ce0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
32cf0 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65   Make pRoot, the
32d00 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
32d10 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74 61 62  e b-tree, writab
32d20 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  le. Allocate a n
32d30 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20 74 68  ew .  ** page th
32d40 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
32d50 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69  he new right-chi
32d60 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43 6f 70  ld of pPage. Cop
32d70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20  y the contents. 
32d80 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65 20   ** of the node 
32d90 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20  stored on pRoot 
32da0 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63 68 69  into the new chi
32db0 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ld page..  */.  
32dc0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
32dd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32de0 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
32df0 62 50 61 67 65 29 29 0a 20 20 20 7c 7c 20 53 51  bPage)).   || SQ
32e00 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 61  LITE_OK!=(rc = a
32e10 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
32e20 28 70 42 74 2c 26 70 43 68 69 6c 64 2c 26 70 67  (pBt,&pChild,&pg
32e30 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70  noChild,pRoot->p
32e40 67 6e 6f 2c 30 29 29 0a 20 20 20 7c 7c 20 53 51  gno,0)).   || SQ
32e50 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 63  LITE_OK!=(rc = c
32e60 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70  opyNodeContent(p
32e70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 29 29 0a 20  Root, pChild)). 
32e80 20 20 7c 7c 20 28 49 53 41 55 54 4f 56 41 43 55    || (ISAUTOVACU
32e90 55 4d 20 26 26 20 0a 20 20 20 20 20 20 20 53 51  UM && .       SQ
32ea0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 70  LITE_OK!=(rc = p
32eb0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
32ec0 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41 50 5f  noChild, PTRMAP_
32ed0 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70 67  BTREE, pRoot->pg
32ee0 6e 6f 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 2a  no))).  ){.    *
32ef0 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20  ppChild = 0;.   
32f00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
32f10 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ild);.    return
32f20 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
32f30 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
32f40 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c  swriteable(pChil
32f50 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  d->pDbPage) );. 
32f60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
32f70 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
32f80 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
32f90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
32fa0 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f  hild->nCell==pRo
32fb0 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ot->nCell );..  
32fc0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
32fd0 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e   copy root %d in
32fe0 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d  to %d\n", pRoot-
32ff0 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70  >pgno, pChild->p
33000 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70  gno));..  /* Cop
33010 79 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  y the overflow c
33020 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20  ells from pRoot 
33030 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d  to pChild */.  m
33040 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f  emcpy(pChild->aO
33050 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66  vfl, pRoot->aOvf
33060 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66  l, pRoot->nOverf
33070 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74  low*sizeof(pRoot
33080 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20  ->aOvfl[0]));.  
33090 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
330a0 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72  w = pRoot->nOver
330b0 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f  flow;..  /* Zero
330c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
330d0 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73   pRoot. Then ins
330e0 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73 20 74  tall pChild as t
330f0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 2e 20  he right-child. 
33100 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52  */.  zeroPage(pR
33110 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  oot, pChild->aDa
33120 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41  ta[0] & ~PTF_LEA
33130 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  F);.  put4byte(&
33140 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
33150 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
33160 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20  , pgnoChild);.. 
33170 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68 69   *ppChild = pChi
33180 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ld;.  return SQL
33190 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
331a0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 70   The page that p
331b0 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  Cur currently po
331c0 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74  ints to has just
331d0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69   been modified i
331e0 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54  n.** some way. T
331f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67  his function fig
33200 75 72 65 73 20 6f 75 74 20 69 66 20 74 68 69 73  ures out if this
33210 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65   modification me
33220 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20  ans the.** tree 
33230 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61  needs to be bala
33240 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20  nced, and if so 
33250 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70  calls the approp
33260 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20  riate balancing 
33270 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c  .** routine. Bal
33280 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  ancing routines 
33290 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c  are:.**.**   bal
332a0 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20  ance_quick().** 
332b0 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72    balance_deeper
332c0 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f  ().**   balance_
332d0 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61  nonroot().*/.sta
332e0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
332f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
33300 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
33310 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69  TE_OK;.  const i
33320 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e  nt nMin = pCur->
33330 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
33340 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20 61 42  * 2 / 3;.  u8 aB
33350 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
33360 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65  [13];.  u8 *pFre
33370 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e  e = 0;..  TESTON
33380 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  LY( int balance_
33390 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30  quick_called = 0
333a0 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20   );.  TESTONLY( 
333b0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
333c0 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b  er_called = 0 );
333d0 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74  ..  do {.    int
333e0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
333f0 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67  Page;.    MemPag
33400 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
33410 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a  >apPage[iPage];.
33420 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3d 3d  .    if( iPage==
33430 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
33440 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
33450 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
33460 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
33470 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f 76 65  he b-tree is ove
33480 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63  rfull. In this c
33490 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20 20 20  ase call the.   
334a0 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f       ** balance_
334b0 64 65 65 70 65 72 28 29 20 66 75 6e 63 74 69 6f  deeper() functio
334c0 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  n to create a ne
334d0 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68 65 20  w child for the 
334e0 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20  root-page.      
334f0 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74 68    ** and copy th
33500 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
33510 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ts of the root-p
33520 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 0a 20  age to it. The. 
33530 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69         ** next i
33540 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
33550 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c  do-loop will bal
33560 61 6e 63 65 20 74 68 65 20 63 68 69 6c 64 20 70  ance the child p
33570 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20  age..        */ 
33580 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
33590 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72   (balance_deeper
335a0 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b  _called++)==0 );
335b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61  .        rc = ba
335c0 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61  lance_deeper(pPa
335d0 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ge, &pCur->apPag
335e0 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  e[1]);.        i
335f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
33610 75 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20  ur->iPage = 1;. 
33620 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
33630 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  iIdx[0] = 0;.   
33640 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
33650 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  dx[1] = 0;.     
33660 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
33670 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f  r->apPage[1]->nO
33680 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20  verflow );.     
33690 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
336a0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
336b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
336c0 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  se if( pPage->nO
336d0 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50  verflow==0 && pP
336e0 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e  age->nFree<=nMin
336f0 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
33700 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33710 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73    MemPage * cons
33720 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72  t pParent = pCur
33730 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d 31  ->apPage[iPage-1
33740 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e  ];.      int con
33750 73 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e  st iIdx = pCur->
33760 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a  aiIdx[iPage-1];.
33770 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
33780 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
33790 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
337a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
337b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e  QLITE_OK ){.#ifn
337c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
337d0 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20  QUICKBALANCE.   
337e0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
337f0 68 61 73 44 61 74 61 0a 20 20 20 20 20 20 20 20  hasData.        
33800 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   && pPage->nOver
33810 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20 20  flow==1.        
33820 20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c   && pPage->aOvfl
33830 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e  [0].idx==pPage->
33840 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 26  nCell.         &
33850 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21  & pParent->pgno!
33860 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =1.         && p
33870 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69  Parent->nCell==i
33880 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  Idx.        ){. 
33890 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c           /* Call
338a0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
338b0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
338c0 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50 61 67   sibling of pPag
338d0 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 20  e on which.     
338e0 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65       ** to store
338f0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
33900 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  ll. balance_quic
33910 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20 6e 65  k() inserts a ne
33920 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 20  w cell.         
33930 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e 74   ** into pParent
33940 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75 73  , which may caus
33950 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72 66 6c  e pParent overfl
33960 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20  ow. If this.    
33970 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73        ** happens
33980 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72  , the next inter
33990 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
339a0 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63  loop will balanc
339b0 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20 20 20  e pParent .     
339c0 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68       ** use eith
339d0 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  er balance_nonro
339e0 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f  ot() or balance_
339f0 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20  deeper(). Until 
33a00 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
33a10 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f  * happens, the o
33a20 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20  verflow cell is 
33a30 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42  stored in the aB
33a40 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
33a50 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  [].          ** 
33a60 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20 20 20  buffer. .       
33a70 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
33a80 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  ** The purpose o
33a90 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
33aa0 61 73 73 65 72 74 28 29 20 69 73 20 74 6f 20 63  assert() is to c
33ab0 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61  heck that only a
33ac0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
33ad0 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c  ngle call to bal
33ae0 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20  ance_quick() is 
33af0 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20 63 61  made for each ca
33b00 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20  ll to this.     
33b10 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
33b20 2e 20 49 66 20 74 68 69 73 20 77 65 72 65 20 6e  . If this were n
33b30 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61 20 73  ot verified, a s
33b40 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76  ubtle bug involv
33b50 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20 20 20  ing reuse.      
33b60 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 61 42      ** of the aB
33b70 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
33b80 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69  [] might sneak i
33b90 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  n..          */.
33ba0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
33bb0 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  ( (balance_quick
33bc0 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b  _called++)==0 );
33bd0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
33be0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50  balance_quick(pP
33bf0 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20 61 42  arent, pPage, aB
33c00 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
33c10 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
33c20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
33c30 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
33c40 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63 61 6c  n this case, cal
33c50 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  l balance_nonroo
33c60 74 28 29 20 74 6f 20 72 65 64 69 73 74 72 69 62  t() to redistrib
33c70 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20 20 20  ute cells.      
33c80 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 70      ** between p
33c90 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 32  Page and up to 2
33ca0 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e 67 20   of its sibling 
33cb0 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e 76 6f  pages. This invo
33cc0 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a  lves.          *
33cd0 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  * modifying the 
33ce0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 61 72  contents of pPar
33cf0 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63  ent, which may c
33d00 61 75 73 65 20 70 50 61 72 65 6e 74 20 74 6f 0a  ause pParent to.
33d10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
33d20 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  ome overfull or 
33d30 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e  underfull. The n
33d40 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
33d50 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20   the do-loop.   
33d60 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62         ** will b
33d70 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
33d80 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72 65 63  t page to correc
33d90 74 20 74 68 69 73 2e 0a 20 20 20 20 20 20 20 20  t this..        
33da0 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20    ** .          
33db0 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e 74  ** If the parent
33dc0 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76   page becomes ov
33dd0 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72  erfull, the over
33de0 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c  flow cell or cel
33df0 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ls.          ** 
33e00 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
33e10 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
33e20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69  allocated immedi
33e30 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20  ately below. .  
33e40 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 75 62          ** A sub
33e50 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f  sequent iteratio
33e60 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
33e70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 20   will deal with 
33e80 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20  this by.        
33e90 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c    ** calling bal
33ea0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28  ance_nonroot() (
33eb0 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
33ec0 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66   may be called f
33ed0 69 72 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  irst,.          
33ee0 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73 6e 27  ** but it doesn'
33ef0 74 20 64 65 61 6c 20 77 69 74 68 20 6f 76 65 72  t deal with over
33f00 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73  flow cells - jus
33f10 74 20 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f 20  t moves them to 
33f20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  a.          ** d
33f30 69 66 66 65 72 65 6e 74 20 70 61 67 65 29 2e 20  ifferent page). 
33f40 4f 6e 63 65 20 74 68 69 73 20 73 75 62 73 65 71  Once this subseq
33f50 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c  uent call to bal
33f60 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a  ance_nonroot() .
33f70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73            ** has
33f80 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20 69   completed, it i
33f90 73 20 73 61 66 65 20 74 6f 20 72 65 6c 65 61 73  s safe to releas
33fa0 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  e the pSpace buf
33fb0 66 65 72 20 75 73 65 64 20 62 79 0a 20 20 20 20  fer used by.    
33fc0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65        ** the pre
33fd0 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20 74  vious call, as t
33fe0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
33ff0 20 64 61 74 61 20 77 69 6c 6c 20 68 61 76 65 20   data will have 
34000 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 20 20  been .          
34010 2a 2a 20 63 6f 70 69 65 64 20 65 69 74 68 65 72  ** copied either
34020 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
34030 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
34040 65 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e 65  e or into the ne
34050 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  w.          ** p
34060 53 70 61 63 65 20 62 75 66 66 65 72 20 70 61 73  Space buffer pas
34070 73 65 64 20 74 6f 20 74 68 65 20 6c 61 74 74 65  sed to the latte
34080 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63  r call to balanc
34090 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20  e_nonroot()..   
340a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
340b0 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d      u8 *pSpace =
340c0 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
340d0 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61  oc(pCur->pBt->pa
340e0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
340f0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
34100 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c  nonroot(pParent,
34110 20 69 49 64 78 2c 20 70 53 70 61 63 65 2c 20 69   iIdx, pSpace, i
34120 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20  Page==1);.      
34130 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b      if( pFree ){
34140 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
34150 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20  If pFree is not 
34160 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20  NULL, it points 
34170 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75  to the pSpace bu
34180 66 66 65 72 20 75 73 65 64 20 0a 20 20 20 20 20  ffer used .     
34190 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70         ** by a p
341a0 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20  revious call to 
341b0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
341c0 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20  ). Its contents 
341d0 61 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  are.            
341e0 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69  ** now stored ei
341f0 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74  ther on real dat
34200 61 62 61 73 65 20 70 61 67 65 73 20 6f 72 20 77  abase pages or w
34210 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20  ithin the .     
34220 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53         ** new pS
34230 70 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20  pace buffer, so 
34240 69 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79  it may be safely
34250 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a   freed here. */.
34260 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
34270 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65  te3PageFree(pFre
34280 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
34290 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
342a0 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
342b0 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 66  will be freed af
342c0 74 65 72 20 74 68 65 20 6e 65 78 74 20 63 61 6c  ter the next cal
342d0 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  l to.          *
342e0 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  * balance_nonroo
342f0 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66  t(), or just bef
34300 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
34310 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68  n returns, which
34320 65 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ever.          *
34330 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a  * comes first. *
34340 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 65  /.          pFre
34350 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20  e = pSpace;.    
34360 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
34370 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65       pPage->nOve
34380 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20  rflow = 0;..    
34390 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 74    /* The next it
343a0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
343b0 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20  o-loop balances 
343c0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
343d0 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
343e0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
343f0 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d      pCur->iPage-
34400 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  -;.    }.  }whil
34410 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
34420 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72 65 65   );..  if( pFree
34430 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
34440 61 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a  ageFree(pFree);.
34450 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
34460 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  .}.../*.** Inser
34470 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
34480 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20  nto the BTree.  
34490 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e  The key is given
344a0 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a   by (pKey,nKey).
344b0 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20  ** and the data 
344c0 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61  is given by (pDa
344d0 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20  ta,nData).  The 
344e0 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f  cursor is used o
344f0 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65  nly to.** define
34500 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65 20   what table the 
34510 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65  record should be
34520 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20   inserted into. 
34530 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
34540 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
34550 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61  at a random loca
34560 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tion..**.** For 
34570 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c  an INTKEY table,
34580 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76   only the nKey v
34590 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20  alue of the key 
345a0 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69  is used.  pKey i
345b0 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46  s.** ignored.  F
345c0 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61  or a ZERODATA ta
345d0 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20 61  ble, the pData a
345e0 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74  nd nData are bot
345f0 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  h ignored..**.**
34600 20 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75   If the seekResu
34610 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  lt parameter is 
34620 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
34630 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c   successful call
34640 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70   to.** MovetoUnp
34650 61 63 6b 65 64 28 29 20 74 6f 20 73 65 65 6b 20  acked() to seek 
34660 63 75 72 73 6f 72 20 70 43 75 72 20 74 6f 20 28  cursor pCur to (
34670 70 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61 73 20  pKey, nKey) has 
34680 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
34690 70 65 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52  performed. seekR
346a0 65 73 75 6c 74 20 69 73 20 74 68 65 20 73 65 61  esult is the sea
346b0 72 63 68 20 72 65 73 75 6c 74 20 72 65 74 75 72  rch result retur
346c0 6e 65 64 20 28 61 20 6e 65 67 61 74 69 76 65 0a  ned (a negative.
346d0 2a 2a 20 6e 75 6d 62 65 72 20 69 66 20 70 43 75  ** number if pCu
346e0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65  r points at an e
346f0 6e 74 72 79 20 74 68 61 74 20 69 73 20 73 6d 61  ntry that is sma
34700 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b 65 79 2c  ller than (pKey,
34710 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20   nKey), or.** a 
34720 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
34730 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74  f pCur points at
34740 20 61 6e 20 65 74 72 79 20 74 68 61 74 20 69 73   an etry that is
34750 20 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a   larger than .**
34760 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20   (pKey, nKey)). 
34770 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
34780 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74  ekResult paramet
34790 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20 63 75  er is 0, then cu
347a0 72 73 6f 72 20 70 43 75 72 20 6d 61 79 20 70 6f  rsor pCur may po
347b0 69 6e 74 20 74 6f 20 61 6e 79 20 0a 2a 2a 20 65  int to any .** e
347c0 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e  ntry or to no en
347d0 74 72 79 20 61 74 20 61 6c 6c 2e 20 49 6e 20 74  try at all. In t
347e0 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75  his case this fu
347f0 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f 20 73 65  nction has to se
34800 65 6b 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  ek.** the cursor
34810 20 62 65 66 6f 72 65 20 74 68 65 20 6e 65 77 20   before the new 
34820 6b 65 79 20 63 61 6e 20 62 65 20 69 6e 73 65 72  key can be inser
34830 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
34840 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a  te3BtreeInsert(.
34850 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
34860 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
34870 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
34880 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f  into the table o
34890 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  f this cursor */
348a0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
348b0 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
348c0 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20    /* The key of 
348d0 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
348e0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
348f0 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
34900 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f  ,  /* The data o
34910 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
34920 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
34930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34940 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
34950 66 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20  f extra 0 bytes 
34960 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74  to append to dat
34970 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e  a */.  int appen
34980 64 42 69 61 73 2c 20 20 20 20 20 20 20 20 20 20  dBias,          
34990 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
349a0 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20   this is likely 
349b0 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69  an append */.  i
349c0 6e 74 20 73 65 65 6b 52 65 73 75 6c 74 20 20 20  nt seekResult   
349d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
349e0 20 52 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72   Result of prior
349f0 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28   MovetoUnpacked(
34a00 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69  ) call */.){.  i
34a10 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63  nt rc;.  int loc
34a20 20 3d 20 73 65 65 6b 52 65 73 75 6c 74 3b 0a 20   = seekResult;. 
34a30 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e   int szNew;.  in
34a40 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
34a50 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65   *pPage;.  Btree
34a60 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
34a70 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
34a80 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
34a90 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f  unsigned char *o
34aa0 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e  ldCell;.  unsign
34ab0 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c  ed char *newCell
34ac0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
34ad0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
34ae0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
34af0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
34b00 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
34b10 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
34b20 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
34b30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
34b40 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20  ur->wrFlag );.  
34b50 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65  assert( hasShare
34b60 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
34b70 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  p, pCur->pgnoRoo
34b80 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  t, pCur->pKeyInf
34b90 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 0a 20 20 2f  o!=0, 2) );..  /
34ba0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
34bb0 69 6e 73 65 72 74 20 69 6e 74 6f 20 61 20 74 61  insert into a ta
34bc0 62 6c 65 20 62 2d 74 72 65 65 2c 20 69 6e 76 61  ble b-tree, inva
34bd0 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
34be0 6c 6f 62 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72  lob .  ** cursor
34bf0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f  s open on the ro
34c00 77 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  w being replaced
34c10 20 28 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20   (assuming this 
34c20 69 73 20 61 20 72 65 70 6c 61 63 65 0a 20 20 2a  is a replace.  *
34c30 2a 20 6f 70 65 72 61 74 69 6f 6e 20 2d 20 69 66  * operation - if
34c40 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 20   it is not, the 
34c50 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e  following is a n
34c60 6f 2d 6f 70 29 2e 20 20 2a 2f 0a 20 20 69 66 28  o-op).  */.  if(
34c70 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d   pCur->pKeyInfo=
34c80 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69  =0 ){.    invali
34c90 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
34ca0 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e  ors(p, pCur->pgn
34cb0 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 30 29 3b  oRoot, nKey, 0);
34cc0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72  .  }..  if( pCur
34cd0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
34ce0 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
34cf0 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b  turn pCur->skip;
34d00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20  .  }..  /* Save 
34d10 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
34d20 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f   any other curso
34d30 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
34d40 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  table..  **.  **
34d50 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20   In some cases, 
34d60 74 68 65 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  the call to btre
34d70 65 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20  eMoveto() below 
34d80 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a  is a no-op. For.
34d90 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68    ** example, wh
34da0 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74  en inserting dat
34db0 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77  a into a table w
34dc0 69 74 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74  ith auto-generat
34dd0 65 64 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20  ed integer.  ** 
34de0 6b 65 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c  keys, the VDBE l
34df0 61 79 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c  ayer invokes sql
34e00 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 29 20  ite3BtreeLast() 
34e10 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  to figure out th
34e20 65 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  e .  ** integer 
34e30 6b 65 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74  key to use. It t
34e40 68 65 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66  hen calls this f
34e50 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61  unction to actua
34e60 6c 6c 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a  lly insert the .
34e70 20 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74    ** data into t
34e80 68 65 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65  he intkey B-Tree
34e90 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62  . In this case b
34ea0 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 72 65 63  treeMoveto() rec
34eb0 6f 67 6e 69 7a 65 73 0a 20 20 2a 2a 20 74 68 61  ognizes.  ** tha
34ec0 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
34ed0 61 6c 72 65 61 64 79 20 77 68 65 72 65 20 69 74  already where it
34ee0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e 64   needs to be and
34ef0 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74   returns without
34f00 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 6e 79 20  .  ** doing any 
34f10 77 6f 72 6b 2e 20 54 6f 20 61 76 6f 69 64 20 74  work. To avoid t
34f20 68 77 61 72 74 69 6e 67 20 74 68 65 73 65 20 6f  hwarting these o
34f30 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2c 20 69 74  ptimizations, it
34f40 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20   is important.  
34f50 2a 2a 20 6e 6f 74 20 74 6f 20 63 6c 65 61 72 20  ** not to clear 
34f60 74 68 65 20 63 75 72 73 6f 72 20 68 65 72 65 2e  the cursor here.
34f70 0a 20 20 2a 2f 0a 20 20 69 66 28 0a 20 20 20 20  .  */.  if(.    
34f80 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
34f90 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
34fa0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
34fb0 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c 20 28  oot, pCur)) || (
34fc0 21 6c 6f 63 20 26 26 0a 20 20 20 20 53 51 4c 49  !loc &&.    SQLI
34fd0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
34fe0 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
34ff0 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e  Key, nKey, appen
35000 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20  dBias, &loc)).  
35010 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  )){.    return r
35020 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
35030 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
35040 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28  URSOR_VALID || (
35050 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
35060 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 26 26 20  RSOR_INVALID && 
35070 6c 6f 63 29 20 29 3b 0a 0a 20 20 70 50 61 67 65  loc) );..  pPage
35080 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
35090 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
350a0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
350b0 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30  ntKey || nKey>=0
350c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
350d0 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50  age->leaf || !pP
350e0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  age->intKey );. 
350f0 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a   TRACE(("INSERT:
35100 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25   table=%d nkey=%
35110 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67  lld ndata=%d pag
35120 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
35130 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
35140 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74  Root, nKey, nDat
35150 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a  a, pPage->pgno,.
35160 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30            loc==0
35170 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a   ? "overwrite" :
35180 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a   "new entry"));.
35190 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
351a0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c  >isInit );.  all
351b0 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
351c0 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d  Bt);.  newCell =
351d0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
351e0 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
351f0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
35200 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
35210 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
35220 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
35230 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
35240 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e  ata, nZero, &szN
35250 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
35260 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
35270 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
35280 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
35290 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
352a0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
352b0 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
352c0 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70  Bt) );.  idx = p
352d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
352e0 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c  >iPage];.  if( l
352f0 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 31 36  oc==0 ){.    u16
35300 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65   szOld;.    asse
35310 72 74 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e  rt( idx<pPage->n
35320 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
35330 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
35340 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
35350 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
35360 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
35370 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20  _insert;.    }. 
35380 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e     oldCell = fin
35390 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
353a0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
353b0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
353c0 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c   memcpy(newCell,
353d0 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20   oldCell, 4);.  
353e0 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20    }.    szOld = 
353f0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
35400 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20  e, oldCell);.   
35410 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
35420 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
35430 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
35440 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
35450 20 20 20 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c     rc = dropCell
35460 28 70 50 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f  (pPage, idx, szO
35470 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ld);.    if( rc!
35480 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20  =SQLITE_OK ) {. 
35490 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e       goto end_in
354a0 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  sert;.    }.  }e
354b0 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26  lse if( loc<0 &&
354c0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
354d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
354e0 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
354f0 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
35500 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
35510 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e];.  }else{.   
35520 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
35530 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63  leaf );.  }.  rc
35540 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
35550 61 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c  age, idx, newCel
35560 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b  l, szNew, 0, 0);
35570 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
35580 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
35590 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50  e->nCell>0 || pP
355a0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
355b0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20   );..  /* If no 
355c0 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
355d0 64 20 61 6e 64 20 70 50 61 67 65 20 68 61 73 20  d and pPage has 
355e0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  an overflow cell
355f0 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29  , call balance()
35600 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64 69 73 74   .  ** to redist
35610 72 69 62 75 74 65 20 74 68 65 20 63 65 6c 6c 73  ribute the cells
35620 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 65 65   within the tree
35630 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e 63 65 28  . Since balance(
35640 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20  ) may move.  ** 
35650 74 68 65 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f  the cursor, zero
35660 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e   the BtCursor.in
35670 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74 43  fo.nSize and BtC
35680 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a  ursor.validNKey.
35690 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a    ** variables..
356a0 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f    **.  ** Previo
356b0 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  us versions of S
356c0 51 4c 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76  QLite called mov
356d0 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76  eToRoot() to mov
356e0 65 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a  e the cursor.  *
356f0 2a 20 62 61 63 6b 20 74 6f 20 74 68 65 20 72 6f  * back to the ro
35700 6f 74 20 70 61 67 65 20 61 73 20 62 61 6c 61 6e  ot page as balan
35710 63 65 28 29 20 75 73 65 64 20 74 6f 20 69 6e 76  ce() used to inv
35720 61 6c 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74  alidate the cont
35730 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43  ents.  ** of BtC
35740 75 72 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61  ursor.apPage[] a
35750 6e 64 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  nd BtCursor.aiId
35760 78 5b 5d 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  x[]. Instead of 
35770 64 6f 69 6e 67 20 74 68 61 74 2c 0a 20 20 2a 2a  doing that,.  **
35780 20 73 65 74 20 74 68 65 20 63 75 72 73 6f 72 20   set the cursor 
35790 73 74 61 74 65 20 74 6f 20 22 69 6e 76 61 6c 69  state to "invali
357a0 64 22 2e 20 54 68 69 73 20 6d 61 6b 65 73 20 63  d". This makes c
357b0 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74 20 6f 70 65  ommon insert ope
357c0 72 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c 69  rations.  ** sli
357d0 67 68 74 6c 79 20 66 61 73 74 65 72 2e 0a 20 20  ghtly faster..  
357e0 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65 20 69 73  **.  ** There is
357f0 20 61 20 73 75 62 74 6c 65 20 62 75 74 20 69 6d   a subtle but im
35800 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d 69 7a 61  portant optimiza
35810 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f 2e 20 57  tion here too. W
35820 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 0a 20 20  hen inserting.  
35830 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72 65 63 6f  ** multiple reco
35840 72 64 73 20 69 6e 74 6f 20 61 6e 20 69 6e 74 6b  rds into an intk
35850 65 79 20 62 2d 74 72 65 65 20 75 73 69 6e 67 20  ey b-tree using 
35860 61 20 73 69 6e 67 6c 65 20 63 75 72 73 6f 72 20  a single cursor 
35870 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20 68 61 70  (as can.  ** hap
35880 70 65 6e 20 77 68 69 6c 65 20 70 72 6f 63 65 73  pen while proces
35890 73 69 6e 67 20 61 6e 20 22 49 4e 53 45 52 54 20  sing an "INSERT 
358a0 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 22  INTO ... SELECT"
358b0 20 73 74 61 74 65 6d 65 6e 74 29 2c 20 69 74 0a   statement), it.
358c0 20 20 2a 2a 20 69 73 20 61 64 76 61 6e 74 61 67    ** is advantag
358d0 65 6f 75 73 20 74 6f 20 6c 65 61 76 65 20 74 68  eous to leave th
358e0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  e cursor pointin
358f0 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  g to the last en
35900 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  try in.  ** the 
35910 62 2d 74 72 65 65 20 69 66 20 70 6f 73 73 69 62  b-tree if possib
35920 6c 65 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f  le. If the curso
35930 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
35940 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 0a 20  ng to the last. 
35950 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65   ** entry in the
35960 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20   table, and the 
35970 6e 65 78 74 20 72 6f 77 20 69 6e 73 65 72 74 65  next row inserte
35980 64 20 68 61 73 20 61 6e 20 69 6e 74 65 67 65 72  d has an integer
35990 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72 67 65 72   key.  ** larger
359a0 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73   than the larges
359b0 74 20 65 78 69 73 74 69 6e 67 20 6b 65 79 2c 20  t existing key, 
359c0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
359d0 6f 20 69 6e 73 65 72 74 20 74 68 65 0a 20 20 2a  o insert the.  *
359e0 2a 20 72 6f 77 20 77 69 74 68 6f 75 74 20 73 65  * row without se
359f0 65 6b 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  eking the cursor
35a00 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20 61 20  . This can be a 
35a10 62 69 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  big performance 
35a20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 43  boost..  */.  pC
35a30 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
35a40 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
35a50 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28  dNKey = 0;.  if(
35a60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
35a70 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  & pPage->nOverfl
35a80 6f 77 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  ow ){.    rc = b
35a90 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20  alance(pCur);.. 
35aa0 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20     /* Must make 
35ab0 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69  sure nOverflow i
35ac0 73 20 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20  s reset to zero 
35ad0 65 76 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61  even if the bala
35ae0 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20 66 61 69  nce().    ** fai
35af0 6c 73 2e 20 49 6e 74 65 72 6e 61 6c 20 64 61 74  ls. Internal dat
35b00 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72  a structure corr
35b10 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  uption will resu
35b20 6c 74 20 6f 74 68 65 72 77 69 73 65 2e 20 0a 20  lt otherwise. . 
35b30 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 73 65 74 20     ** Also, set 
35b40 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
35b50 20 74 6f 20 69 6e 76 61 6c 69 64 2e 20 54 68 69   to invalid. Thi
35b60 73 20 73 74 6f 70 73 20 73 61 76 65 43 75 72 73  s stops saveCurs
35b70 6f 72 50 6f 73 69 74 69 6f 6e 28 29 0a 20 20 20  orPosition().   
35b80 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20   ** from trying 
35b90 74 6f 20 73 61 76 65 20 74 68 65 20 63 75 72 72  to save the curr
35ba0 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ent position of 
35bb0 74 68 65 20 63 75 72 73 6f 72 2e 20 20 2a 2f 0a  the cursor.  */.
35bc0 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
35bd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
35be0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
35bf0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
35c00 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
35c10 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
35c20 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
35c30 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66  ->iPage]->nOverf
35c40 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69  low==0 );..end_i
35c50 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20  nsert:.  return 
35c60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
35c70 65 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68  ete the entry th
35c80 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
35c90 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
35ca0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
35cb0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
35cc0 20 61 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63   a arbitrary loc
35cd0 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ation..*/.int sq
35ce0 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
35cf0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
35d00 7b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  {.  Btree *p = p
35d10 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
35d20 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
35d30 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
35d40 20 20 20 20 0a 20 20 69 6e 74 20 72 63 3b 20 20      .  int rc;  
35d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
35d70 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
35d80 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
35d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35da0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
35db0 64 65 6c 65 74 65 20 63 65 6c 6c 20 66 72 6f 6d  delete cell from
35dc0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
35dd0 68 61 72 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20  har *pCell;     
35de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
35df0 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 20 74 6f  inter to cell to
35e00 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74   delete */.  int
35e10 20 69 43 65 6c 6c 49 64 78 3b 20 20 20 20 20 20   iCellIdx;      
35e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e30 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65    /* Index of ce
35e40 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ll to delete */.
35e50 20 20 69 6e 74 20 69 43 65 6c 6c 44 65 70 74 68    int iCellDepth
35e60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35e70 20 20 20 20 20 20 20 2f 2a 20 44 65 70 74 68 20         /* Depth 
35e80 6f 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69  of node containi
35e90 6e 67 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20 20  ng pCell */ ..  
35ea0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
35eb0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
35ec0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
35ed0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
35ee0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
35ef0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
35f00 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73  eadOnly );.  ass
35f10 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61  ert( pCur->wrFla
35f20 67 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  g );.  assert( h
35f30 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
35f40 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e  leLock(p, pCur->
35f50 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e  pgnoRoot, pCur->
35f60 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20  pKeyInfo!=0, 2) 
35f70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 68 61  );.  assert( !ha
35f80 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
35f90 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
35fa0 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  ) );..  if( NEVE
35fb0 52 28 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  R(pCur->aiIdx[pC
35fc0 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72  ur->iPage]>=pCur
35fd0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
35fe0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20 0a 20  Page]->nCell) . 
35ff0 20 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d    || NEVER(pCur-
36000 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
36010 56 41 4c 49 44 29 0a 20 20 29 7b 0a 20 20 20 20  VALID).  ){.    
36020 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
36030 52 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65 74 68 69  ROR;  /* Somethi
36040 6e 67 20 68 61 73 20 67 6f 6e 65 20 61 77 72 79  ng has gone awry
36050 2e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  . */.  }..  /* I
36060 66 20 74 68 69 73 20 69 73 20 61 20 64 65 6c 65  f this is a dele
36070 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  te operation to 
36080 72 65 6d 6f 76 65 20 61 20 72 6f 77 20 66 72 6f  remove a row fro
36090 6d 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  m a table b-tree
360a0 2c 0a 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74  ,.  ** invalidat
360b0 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63  e any incrblob c
360c0 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
360d0 68 65 20 72 6f 77 20 62 65 69 6e 67 20 64 65 6c  he row being del
360e0 65 74 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20  eted.  */.  if( 
360f0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
36100 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  0 ){.    invalid
36110 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
36120 72 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  rs(p, pCur->pgno
36130 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 69 6e 66 6f  Root, pCur->info
36140 2e 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a  .nKey, 0);.  }..
36150 20 20 69 43 65 6c 6c 44 65 70 74 68 20 3d 20 70    iCellDepth = p
36160 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 69 43  Cur->iPage;.  iC
36170 65 6c 6c 49 64 78 20 3d 20 70 43 75 72 2d 3e 61  ellIdx = pCur->a
36180 69 49 64 78 5b 69 43 65 6c 6c 44 65 70 74 68 5d  iIdx[iCellDepth]
36190 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
361a0 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65  ->apPage[iCellDe
361b0 70 74 68 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20  pth];.  pCell = 
361c0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
361d0 69 43 65 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f 2a  iCellIdx);..  /*
361e0 20 49 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   If the page con
361f0 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 72  taining the entr
36200 79 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e  y to delete is n
36210 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20  ot a leaf page, 
36220 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75  move.  ** the cu
36230 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 72 67  rsor to the larg
36240 65 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  est entry in the
36250 20 74 72 65 65 20 74 68 61 74 20 69 73 20 73 6d   tree that is sm
36260 61 6c 6c 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20  aller than.  ** 
36270 74 68 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20  the entry being 
36280 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20 63 65  deleted. This ce
36290 6c 6c 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 20  ll will replace 
362a0 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67 20 64  the cell being d
362b0 65 6c 65 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d  eleted.  ** from
362c0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
362d0 64 65 2e 20 54 68 65 20 27 70 72 65 76 69 6f 75  de. The 'previou
362e0 73 27 20 65 6e 74 72 79 20 69 73 20 75 73 65 64  s' entry is used
362f0 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 65 61   for this instea
36300 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 27 6e  d.  ** of the 'n
36310 65 78 74 27 20 65 6e 74 72 79 2c 20 61 73 20 74  ext' entry, as t
36320 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
36330 79 20 69 73 20 61 6c 77 61 79 73 20 61 20 70 61  y is always a pa
36340 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  rt of the.  ** s
36350 75 62 2d 74 72 65 65 20 68 65 61 64 65 64 20 62  ub-tree headed b
36360 79 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  y the child page
36370 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 62 65 69   of the cell bei
36380 6e 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73  ng deleted. This
36390 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 62 61 6c 61   makes.  ** bala
363a0 6e 63 69 6e 67 20 74 68 65 20 74 72 65 65 20 66  ncing the tree f
363b0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 65 6c  ollowing the del
363c0 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 65 61  ete operation ea
363d0 73 69 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20  sier.  */.  if( 
363e0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
363f0 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b      int notUsed;
36400 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
36410 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
36420 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
36430 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 29 20  Cur, &notUsed)) 
36440 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
36450 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
36460 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
36470 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
36480 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  her cursors open
36490 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 62   on this table b
364a0 65 66 6f 72 65 0a 20 20 2a 2a 20 6d 61 6b 69 6e  efore.  ** makin
364b0 67 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  g any modificati
364c0 6f 6e 73 2e 20 4d 61 6b 65 20 74 68 65 20 70 61  ons. Make the pa
364d0 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
364e0 65 20 65 6e 74 72 79 20 74 6f 20 62 65 20 0a 20  e entry to be . 
364f0 20 2a 2a 20 64 65 6c 65 74 65 64 20 77 72 69 74   ** deleted writ
36500 61 62 6c 65 2e 20 54 68 65 6e 20 66 72 65 65 20  able. Then free 
36510 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
36520 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
36530 74 68 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 74  th the .  ** ent
36540 72 79 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 72  ry and finally r
36550 65 6d 6f 76 65 20 74 68 65 20 63 65 6c 6c 20 69  emove the cell i
36560 74 73 65 6c 66 20 66 72 6f 6d 20 77 69 74 68 69  tself from withi
36570 6e 20 74 68 65 20 70 61 67 65 2e 20 20 0a 20 20  n the page.  .  
36580 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  */.  rc = saveAl
36590 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
365a0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
365b0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ur);.  if( rc ) 
365c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
365d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
365e0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
365f0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
36600 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
36610 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67  = clearCell(pPag
36620 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28  e, pCell);.  if(
36630 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
36640 0a 20 20 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c  .  rc = dropCell
36650 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64 78  (pPage, iCellIdx
36660 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  , cellSizePtr(pP
36670 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20  age, pCell));.  
36680 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
36690 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  rc;..  /* If the
366a0 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20 77 61   cell deleted wa
366b0 73 20 6e 6f 74 20 6c 6f 63 61 74 65 64 20 6f 6e  s not located on
366c0 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68   a leaf page, th
366d0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20  en the cursor.  
366e0 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
366f0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
36700 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e  largest entry in
36710 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 68 65   the sub-tree he
36720 61 64 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  aded.  ** by the
36730 20 63 68 69 6c 64 2d 70 61 67 65 20 6f 66 20 74   child-page of t
36740 68 65 20 63 65 6c 6c 20 74 68 61 74 20 77 61 73  he cell that was
36750 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 66 72   just deleted fr
36760 6f 6d 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20  om an internal. 
36770 20 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20 63 65   ** node. The ce
36780 6c 6c 20 66 72 6f 6d 20 74 68 65 20 6c 65 61 66  ll from the leaf
36790 20 6e 6f 64 65 20 6e 65 65 64 73 20 74 6f 20 62   node needs to b
367a0 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 69  e moved to the i
367b0 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64  nternal.  ** nod
367c0 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65  e to replace the
367d0 20 64 65 6c 65 74 65 64 20 63 65 6c 6c 2e 20 20   deleted cell.  
367e0 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  */.  if( !pPage-
367f0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 4d 65 6d  >leaf ){.    Mem
36800 50 61 67 65 20 2a 70 4c 65 61 66 20 3d 20 70 43  Page *pLeaf = pC
36810 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
36820 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74  >iPage];.    int
36830 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 50 67 6e 6f   nCell;.    Pgno
36840 20 6e 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67   n = pCur->apPag
36850 65 5b 69 43 65 6c 6c 44 65 70 74 68 2b 31 5d 2d  e[iCellDepth+1]-
36860 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 6e 73 69 67  >pgno;.    unsig
36870 6e 65 64 20 63 68 61 72 20 2a 70 54 6d 70 3b 0a  ned char *pTmp;.
36880 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
36890 64 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65  dCell(pLeaf, pLe
368a0 61 66 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  af->nCell-1);.  
368b0 20 20 6e 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69    nCell = cellSi
368c0 7a 65 50 74 72 28 70 4c 65 61 66 2c 20 70 43 65  zePtr(pLeaf, pCe
368d0 6c 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ll);.    assert(
368e0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
368f0 74 29 3e 3d 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  t)>=nCell );..  
36900 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70    allocateTempSp
36910 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 70 54  ace(pBt);.    pT
36920 6d 70 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70  mp = pBt->pTmpSp
36930 61 63 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  ace;..    rc = s
36940 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36950 28 70 4c 65 61 66 2d 3e 70 44 62 50 61 67 65 29  (pLeaf->pDbPage)
36960 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
36970 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
36980 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
36990 61 67 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20 70  age, iCellIdx, p
369a0 43 65 6c 6c 2d 34 2c 20 6e 43 65 6c 6c 2b 34 2c  Cell-4, nCell+4,
369b0 20 70 54 6d 70 2c 20 6e 29 3b 0a 20 20 20 20 69   pTmp, n);.    i
369c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
369d0 63 3b 0a 20 20 20 20 72 63 20 3d 20 64 72 6f 70  c;.    rc = drop
369e0 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61  Cell(pLeaf, pLea
369f0 66 2d 3e 6e 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c  f->nCell-1, nCel
36a00 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
36a10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
36a20 0a 20 20 2f 2a 20 42 61 6c 61 6e 63 65 20 74 68  .  /* Balance th
36a30 65 20 74 72 65 65 2e 20 49 66 20 74 68 65 20 65  e tree. If the e
36a40 6e 74 72 79 20 64 65 6c 65 74 65 64 20 77 61 73  ntry deleted was
36a50 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 6c 65   located on a le
36a60 61 66 20 70 61 67 65 2c 0a 20 20 2a 2a 20 74 68  af page,.  ** th
36a70 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  en the cursor st
36a80 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ill points to th
36a90 61 74 20 70 61 67 65 2e 20 49 6e 20 74 68 69 73  at page. In this
36aa0 20 63 61 73 65 20 74 68 65 20 66 69 72 73 74 0a   case the first.
36ab0 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 61 6c    ** call to bal
36ac0 61 6e 63 65 28 29 20 72 65 70 61 69 72 73 20 74  ance() repairs t
36ad0 68 65 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65  he tree, and the
36ae0 20 69 66 28 2e 2e 2e 29 20 63 6f 6e 64 69 74 69   if(...) conditi
36af0 6f 6e 20 69 73 0a 20 20 2a 2a 20 6e 65 76 65 72  on is.  ** never
36b00 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   true..  **.  **
36b10 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
36b20 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74 65 64  he entry deleted
36b30 20 77 61 73 20 6f 6e 20 61 6e 20 69 6e 74 65 72   was on an inter
36b40 6e 61 6c 20 6e 6f 64 65 20 70 61 67 65 2c 20 74  nal node page, t
36b50 68 65 6e 0a 20 20 2a 2a 20 70 43 75 72 20 69 73  hen.  ** pCur is
36b60 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
36b70 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20   leaf page from 
36b80 77 68 69 63 68 20 61 20 63 65 6c 6c 20 77 61 73  which a cell was
36b90 20 72 65 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a   removed to.  **
36ba0 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 65 6c   replace the cel
36bb0 6c 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74  l deleted from t
36bc0 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
36bd0 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67 68 74  . This is slight
36be0 6c 79 0a 20 20 2a 2a 20 74 72 69 63 6b 79 20 61  ly.  ** tricky a
36bf0 73 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20  s the leaf node 
36c00 6d 61 79 20 62 65 20 75 6e 64 65 72 66 75 6c 6c  may be underfull
36c10 2c 20 61 6e 64 20 74 68 65 20 69 6e 74 65 72 6e  , and the intern
36c20 61 6c 20 6e 6f 64 65 20 6d 61 79 0a 20 20 2a 2a  al node may.  **
36c30 20 62 65 20 65 69 74 68 65 72 20 75 6e 64 65 72   be either under
36c40 20 6f 72 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e   or overfull. In
36c50 20 74 68 69 73 20 63 61 73 65 20 72 75 6e 20 74   this case run t
36c60 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 61 6c 67  he balancing alg
36c70 6f 72 69 74 68 6d 0a 20 20 2a 2a 20 6f 6e 20 74  orithm.  ** on t
36c80 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 66 69 72  he leaf node fir
36c90 73 74 2e 20 49 66 20 74 68 65 20 62 61 6c 61 6e  st. If the balan
36ca0 63 65 20 70 72 6f 63 65 65 64 73 20 66 61 72 20  ce proceeds far 
36cb0 65 6e 6f 75 67 68 20 75 70 20 74 68 65 0a 20 20  enough up the.  
36cc0 2a 2a 20 74 72 65 65 20 74 68 61 74 20 77 65 20  ** tree that we 
36cd0 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 61 74  can be sure that
36ce0 20 61 6e 79 20 70 72 6f 62 6c 65 6d 20 69 6e 20   any problem in 
36cf0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
36d00 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20  e has.  ** been 
36d10 63 6f 72 72 65 63 74 65 64 2c 20 73 6f 20 62 65  corrected, so be
36d20 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20   it. Otherwise, 
36d30 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20  after balancing 
36d40 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 2c 0a 20  the leaf node,. 
36d50 20 2a 2a 20 77 61 6c 6b 20 74 68 65 20 63 75 72   ** walk the cur
36d60 73 6f 72 20 75 70 20 74 68 65 20 74 72 65 65 20  sor up the tree 
36d70 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
36d80 6e 6f 64 65 20 61 6e 64 20 62 61 6c 61 6e 63 65  node and balance
36d90 20 69 74 20 61 73 20 0a 20 20 2a 2a 20 77 65 6c   it as .  ** wel
36da0 6c 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 62 61  l.  */.  rc = ba
36db0 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 20 20 69  lance(pCur);.  i
36dc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36dd0 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
36de0 69 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a 20 20  iCellDepth ){.  
36df0 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69    while( pCur->i
36e00 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74 68 20  Page>iCellDepth 
36e10 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
36e20 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
36e30 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d  e[pCur->iPage--]
36e40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
36e50 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b  = balance(pCur);
36e60 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
36e70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36e80 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
36e90 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
36ea0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
36eb0 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65 20  ate a new BTree 
36ec0 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e  table.  Write in
36ed0 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20  to *piTable the 
36ee0 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
36ef0 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  or the root page
36f00 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
36f10 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70  e..**.** The typ
36f20 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65 74  e of type is det
36f30 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66  ermined by the f
36f40 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20  lags parameter. 
36f50 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c   Only the.** fol
36f60 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66  lowing values of
36f70 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72 65   flags are curre
36f80 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74  ntly in use.  Ot
36f90 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a  her values for.*
36fa0 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f  * flags might no
36fb0 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20  t work:.**.**   
36fc0 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42    BTREE_INTKEY|B
36fd0 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20  TREE_LEAFDATA   
36fe0 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74    Used for SQL t
36ff0 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64  ables with rowid
37000 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52   keys.**     BTR
37010 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20  EE_ZERODATA     
37020 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65               Use
37030 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65  d for SQL indice
37040 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
37050 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  btreeCreateTable
37060 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
37070 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
37080 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  gs){.  BtShared 
37090 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
370a0 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
370b0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74  .  Pgno pgnoRoot
370c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
370d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
370e0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
370f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
37100 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
37110 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
37120 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
37130 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69  >readOnly );..#i
37140 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
37150 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63  _AUTOVACUUM.  rc
37160 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
37170 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74  Page(pBt, &pRoot
37180 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20  , &pgnoRoot, 1, 
37190 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
371a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
371b0 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70   }.#else.  if( p
371c0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
371d0 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d  {.    Pgno pgnoM
371e0 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76  ove;      /* Mov
371f0 65 20 61 20 70 61 67 65 20 68 65 72 65 20 74 6f  e a page here to
37200 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
37210 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a  he root-page */.
37220 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
37230 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70  geMove; /* The p
37240 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20  age to move to. 
37250 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  */..    /* Creat
37260 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
37270 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65 71  may probably req
37280 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65  uire moving an e
37290 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
372a0 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20  .    ** to make 
372b0 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77  room for the new
372c0 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61 67   tables root pag
372d0 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73 20  e. In case this 
372e0 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20 2a  page turns.    *
372f0 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20 6f  * out to be an o
37300 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64 65  verflow page, de
37310 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f  lete all overflo
37320 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68 65  w page-map cache
37330 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79  s.    ** held by
37340 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20   open cursors.. 
37350 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69     */.    invali
37360 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
37370 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20 20  ache(pBt);..    
37380 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c 75  /* Read the valu
37390 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f  e of meta[3] fro
373a0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  m the database t
373b0 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72  o determine wher
373c0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f  e the.    ** roo
373d0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65  t page of the ne
373e0 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67  w table should g
373f0 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68  o. meta[3] is th
37400 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
37410 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  age.    ** creat
37420 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68  ed so far, so th
37430 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20  e new root-page 
37440 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a  is (meta[3]+1)..
37450 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
37460 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
37470 2c 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f  , BTREE_LARGEST_
37480 52 4f 4f 54 5f 50 41 47 45 2c 20 26 70 67 6e 6f  ROOT_PAGE, &pgno
37490 52 6f 6f 74 29 3b 0a 20 20 20 20 70 67 6e 6f 52  Root);.    pgnoR
374a0 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54  oot++;..    /* T
374b0 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
374c0 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f   may not be allo
374d0 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74  cated on a point
374e0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72 20  er-map page, or 
374f0 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49  the.    ** PENDI
37500 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20 20  NG_BYTE page..  
37510 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
37520 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50  pgnoRoot==PTRMAP
37530 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e  _PAGENO(pBt, pgn
37540 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20  oRoot) ||.      
37550 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44    pgnoRoot==PEND
37560 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
37570 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  t) ){.      pgno
37580 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Root++;.    }.  
37590 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 52 6f    assert( pgnoRo
375a0 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a  ot>=3 );..    /*
375b0 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61 67 65   Allocate a page
375c0 2e 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  . The page that 
375d0 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69 64 65  currently reside
375e0 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69  s at pgnoRoot wi
375f0 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76  ll.    ** be mov
37600 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  ed to the alloca
37610 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65 73 73  ted page (unless
37620 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
37630 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20 20 20  age happens.    
37640 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61 74 20  ** to reside at 
37650 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a  pgnoRoot)..    *
37660 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  /.    rc = alloc
37670 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
37680 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20 26 70  , &pPageMove, &p
37690 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f  gnoMove, pgnoRoo
376a0 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 1);.    if( r
376b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
376c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
376d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
376e0 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f  pgnoMove!=pgnoRo
376f0 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  ot ){.      /* p
37700 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 70  gnoRoot is the p
37710 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  age that will be
37720 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 6f   used for the ro
37730 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20 20 20 20  ot-page of.     
37740 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c   ** the new tabl
37750 65 20 28 61 73 73 75 6d 69 6e 67 20 61 6e 20 65  e (assuming an e
37760 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f 63 63  rror did not occ
37770 75 72 29 2e 20 42 75 74 20 77 65 20 77 65 72 65  ur). But we were
37780 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61  .      ** alloca
37790 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66  ted pgnoMove. If
377a0 20 72 65 71 75 69 72 65 64 20 28 69 2e 65 2e 20   required (i.e. 
377b0 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c  if it was not al
377c0 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 2a 2a  located.      **
377d0 20 62 79 20 65 78 74 65 6e 64 69 6e 67 20 74 68   by extending th
377e0 65 20 66 69 6c 65 29 2c 20 74 68 65 20 63 75 72  e file), the cur
377f0 72 65 6e 74 20 70 61 67 65 20 61 74 20 70 6f 73  rent page at pos
37800 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20  ition pgnoMove. 
37810 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61       ** is alrea
37820 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20  dy journaled..  
37830 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 38 20      */.      u8 
37840 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67 6e  eType;.      Pgn
37850 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
37860 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
37870 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20  PageMove);..    
37880 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 70 61    /* Move the pa
37890 67 65 20 63 75 72 72 65 6e 74 6c 79 20 61 74 20  ge currently at 
378a0 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f  pgnoRoot to pgno
378b0 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72  Move. */.      r
378c0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
378d0 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
378e0 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
378f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37900 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
37910 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
37920 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  }.      rc = ptr
37930 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f  mapGet(pBt, pgno
37940 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69  Root, &eType, &i
37950 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
37960 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
37970 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54  P_ROOTPAGE || eT
37980 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
37990 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
379a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
379b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
379c0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
379d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
379e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
379f0 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
37a00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
37a10 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
37a20 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
37a30 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20  ROOTPAGE );.    
37a40 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21    assert( eType!
37a50 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
37a60 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   );.      rc = r
37a70 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
37a80 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69   pRoot, eType, i
37a90 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76  PtrPage, pgnoMov
37aa0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 6c  e, 0);.      rel
37ab0 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
37ac0 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  ..      /* Obtai
37ad0 6e 20 74 68 65 20 70 61 67 65 20 61 74 20 70 67  n the page at pg
37ae0 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20  noRoot */.      
37af0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37b00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
37b10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
37b20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
37b30 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
37b40 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
37b50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
37b60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37b70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37b80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
37b90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
37ba0 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
37bb0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
37bc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37bd0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
37be0 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
37bf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
37c10 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  se{.      pRoot 
37c20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20  = pPageMove;.   
37c30 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   } ..    /* Upda
37c40 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
37c50 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61  ap and meta-data
37c60 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f   with the new ro
37c70 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
37c80 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  */.    rc = ptrm
37c90 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52  apPut(pBt, pgnoR
37ca0 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  oot, PTRMAP_ROOT
37cb0 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
37cc0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
37cd0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
37ce0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
37cf0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
37d00 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
37d10 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70  dateMeta(p, 4, p
37d20 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  gnoRoot);.    if
37d30 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
37d40 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
37d50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
37d60 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  c;.    }..  }els
37d70 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  e{.    rc = allo
37d80 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
37d90 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
37da0 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Root, 1, 0);.   
37db0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
37dc0 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
37dd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
37de0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
37df0 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
37e00 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  ) );.  zeroPage(
37e10 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50  pRoot, flags | P
37e20 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69  TF_LEAF);.  sqli
37e30 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 52  te3PagerUnref(pR
37e40 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
37e50 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74   *piTable = (int
37e60 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74  )pgnoRoot;.  ret
37e70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
37e80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
37e90 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72  eCreateTable(Btr
37ea0 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61  ee *p, int *piTa
37eb0 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ble, int flags){
37ec0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
37ed0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
37ee0 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
37ef0 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69  reateTable(p, pi
37f00 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Table, flags);. 
37f10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
37f20 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
37f30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  rc;.}../*.** Era
37f40 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  se the given dat
37f50 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20 61  abase page and a
37f60 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e  ll its children.
37f70 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
37f80 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
37f90 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
37fa0 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61 73  int clearDatabas
37fb0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
37fc0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
37fd0 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74    /* The BTree t
37fe0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
37ff0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f   table */.  Pgno
38000 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
38010 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
38020 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 69   to clear */.  i
38030 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61 67 2c  nt freePageFlag,
38040 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61       /* Dealloca
38050 74 65 20 70 61 67 65 20 69 66 20 74 72 75 65 20  te page if true 
38060 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61 6e  */.  int *pnChan
38070 67 65 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ge.){.  MemPage 
38080 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
38090 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
380a0 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
380b0 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
380c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
380d0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
380e0 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70   );.  if( pgno>p
380f0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
38100 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
38110 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
38120 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  BKPT;.  }..  rc 
38130 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
38140 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61  (pBt, pgno, &pPa
38150 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
38160 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
38170 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f  sepage_out;.  fo
38180 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
38190 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
381a0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
381b0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
381c0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
381d0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
381e0 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
381f0 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
38200 70 43 65 6c 6c 29 2c 20 31 2c 20 70 6e 43 68 61  pCell), 1, pnCha
38210 6e 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nge);.      if( 
38220 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
38230 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
38240 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
38250 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
38260 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
38270 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
38280 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
38290 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
382a0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
382b0 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
382c0 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  sePage(pBt, get4
382d0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
382e0 74 61 5b 38 5d 29 2c 20 31 2c 20 70 6e 43 68 61  ta[8]), 1, pnCha
382f0 6e 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nge);.    if( rc
38300 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
38310 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
38320 20 7d 65 6c 73 65 20 69 66 28 20 70 6e 43 68 61   }else if( pnCha
38330 6e 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nge ){.    asser
38340 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
38350 20 29 3b 0a 20 20 20 20 2a 70 6e 43 68 61 6e 67   );.    *pnChang
38360 65 20 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e += pPage->nCel
38370 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65  l;.  }.  if( fre
38380 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20  ePageFlag ){.   
38390 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
383a0 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Page);.  }else i
383b0 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
383c0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
383d0 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29  ->pDbPage))==0 )
383e0 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  {.    zeroPage(p
383f0 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61  Page, pPage->aDa
38400 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46  ta[0] | PTF_LEAF
38410 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74  );.  }..cleardat
38420 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20  abasepage_out:. 
38430 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
38440 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
38450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
38460 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  e all informatio
38470 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  n from a single 
38480 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
38490 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69  abase.  iTable i
384a0 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  s.** the page nu
384b0 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74  mber of the root
384c0 20 6f 66 20 74 68 65 20 74 6