/ Hex Artifact Content
Login

Artifact 1c12a097a14ea756696a8a0857e587a1fc5533de:


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 35 32 20 32 30 30 39 2f 30  c,v 1.652 2009/0
0190: 37 2f 30 34 20 31 37 3a 31 36 3a 30 31 20 64 61  7/04 17:16:01 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 53 51 4c 49  LOCK..**.** SQLI
22f0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2300: 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  d if the lock is
2310: 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
2320: 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53 59  lly. SQLITE_BUSY
2330: 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e   and.** SQLITE_N
2340: 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65  OMEM may also be
2350: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2360: 61 74 69 63 20 69 6e 74 20 73 65 74 53 68 61 72  atic int setShar
2370: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2380: 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
2390: 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b  iTable, u8 eLock
23a0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
23b0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
23c0: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30  tLock *pLock = 0
23d0: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65  ;.  BtLock *pIte
23e0: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  r;..  assert( sq
23f0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2400: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
2410: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
2420: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
2430: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  WRITE_LOCK );.  
2440: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30  assert( p->db!=0
2450: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e   );..  /* A conn
2460: 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  ection with the 
2470: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
2480: 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e   flag set will n
2490: 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a  ever try to.  **
24a0: 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c   obtain a read-l
24b0: 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66  ock using this f
24c0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c  unction. The onl
24d0: 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61  y read-lock obta
24e0: 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63  ined.  ** by a c
24f0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61  onnection in rea
2500: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f  d-uncommitted mo
2510: 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c  de is on the sql
2520: 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a  ite_master .  **
2530: 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74   table, and that
2540: 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
2550: 64 20 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54  d in BtreeBeginT
2560: 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73  rans().  */.  as
2570: 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d  sert( 0==(p->db-
2580: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
2590: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c  adUncommitted) |
25a0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
25b0: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
25c0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
25d0: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
25e0: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
25f0: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
2600: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
2610: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2620: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51   }..  assert( SQ
2630: 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68  LITE_OK==querySh
2640: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
2650: 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c  ck(p, iTable, eL
2660: 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  ock) );..  /* Fi
2670: 72 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c  rst search the l
2680: 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ist for an exist
2690: 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73  ing lock on this
26a0: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72   table. */.  for
26b0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
26c0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
26d0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
26e0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54     if( pIter->iT
26f0: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
2700: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2710: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20   ){.      pLock 
2720: 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62  = pIter;.      b
2730: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2740: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f  .  /* If the abo
2750: 76 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f  ve search did no
2760: 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20  t find a BtLock 
2770: 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69  struct associati
2780: 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20  ng Btree p.  ** 
2790: 77 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c  with table iTabl
27a0: 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20  e, allocate one 
27b0: 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f  and link it into
27c0: 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a   the list..  */.
27d0: 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a    if( !pLock ){.
27e0: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c      pLock = (BtL
27f0: 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  ock *)sqlite3Mal
2800: 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
2810: 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28  tLock));.    if(
2820: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20   !pLock ){.     
2830: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2840: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
2850: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20  pLock->iTable = 
2860: 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63  iTable;.    pLoc
2870: 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  k->pBtree = p;. 
2880: 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20     pLock->pNext 
2890: 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
28a0: 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70    pBt->pLock = p
28b0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Lock;.  }..  /* 
28c0: 53 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65  Set the BtLock.e
28d0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f  Lock variable to
28e0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20   the maximum of 
28f0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b  the current lock
2900: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
2910: 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68  quested lock. Th
2920: 69 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72  is means if a wr
2930: 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72  ite-lock was alr
2940: 65 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61  eady held.  ** a
2950: 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72  nd a read-lock r
2960: 65 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e  equested, we don
2970: 27 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64  't incorrectly d
2980: 6f 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63  owngrade the loc
2990: 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  k..  */.  assert
29a0: 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41  ( WRITE_LOCK>REA
29b0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
29c0: 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f  eLock>pLock->eLo
29d0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d  ck ){.    pLock-
29e0: 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a  >eLock = eLock;.
29f0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
2a00: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2a10: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
2a20: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
2a30: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2a40: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2a50: 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  CHE./*.** Releas
2a60: 65 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20  e all the table 
2a70: 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74  locks (locks obt
2a80: 61 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20  ained via calls 
2a90: 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61  to.** the setSha
2aa0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2ab0: 6b 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68  k() procedure) h
2ac0: 65 6c 64 20 62 79 20 42 74 72 65 65 20 68 61 6e  eld by Btree han
2ad0: 64 6c 65 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  dle p..**.** Thi
2ae0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2af0: 65 73 20 74 68 61 74 20 68 61 6e 64 6c 65 20 70  es that handle p
2b00: 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61   has an open rea
2b10: 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74  d or write .** t
2b20: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69  ransaction. If i
2b30: 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e  t does not, then
2b40: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 69 73   the BtShared.is
2b50: 50 65 6e 64 69 6e 67 20 76 61 72 69 61 62 6c 65  Pending variable
2b60: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
2b70: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
2b80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
2b90: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
2ba0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
2bb0: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
2bc0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2bd0: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
2be0: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
2bf0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
2c00: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2c10: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
2c20: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
2c30: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
2c40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
2c50: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
2c60: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
2c70: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
2c80: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
2c90: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
2ca0: 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
2cb0: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
2cc0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a  Lock->pBtree );.
2cd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
2ce0: 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61  k->pBtree->inTra
2cf0: 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ns>=pLock->eLock
2d00: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63   );.    if( pLoc
2d10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  k->pBtree==p ){.
2d20: 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20        *ppIter = 
2d30: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
2d40: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
2d50: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20  k->iTable!=1 || 
2d60: 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20  pLock==&p->lock 
2d70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  );.      if( pLo
2d80: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b  ck->iTable!=1 ){
2d90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2da0: 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20  _free(pLock);.  
2db0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2dc0: 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20  .      ppIter = 
2dd0: 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20  &pLock->pNext;. 
2de0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
2df0: 72 74 28 20 70 42 74 2d 3e 69 73 50 65 6e 64 69  rt( pBt->isPendi
2e00: 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  ng==0 || pBt->pW
2e10: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
2e20: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
2e30: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
2e40: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
2e50: 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30  >isExclusive = 0
2e60: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  ;.    pBt->isPen
2e70: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ding = 0;.  }els
2e80: 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e  e if( pBt->nTran
2e90: 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20  saction==2 ){.  
2ea0: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
2eb0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
2ec0: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 69  n connection p i
2ed0: 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73  s concluding its
2ee0: 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
2ef0: 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20 63  tion. If there c
2f00: 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 20  urrently exists 
2f10: 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70 20  a writer, and p 
2f20: 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68  is not.    ** th
2f30: 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20  at writer, then 
2f40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f  the number of lo
2f50: 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e  cks held by conn
2f60: 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20  ections other.  
2f70: 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77 72    ** than the wr
2f80: 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62 6f  iter must be abo
2f90: 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65  ut to drop to ze
2fa0: 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ro. In this case
2fb0: 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20  .    ** set the 
2fc0: 69 73 50 65 6e 64 69 6e 67 20 66 6c 61 67 20 74  isPending flag t
2fd0: 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  o 0..    **.    
2fe0: 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  ** If there is n
2ff0: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77  ot currently a w
3000: 72 69 74 65 72 2c 20 74 68 65 6e 20 42 74 53 68  riter, then BtSh
3010: 61 72 65 64 2e 69 73 50 65 6e 64 69 6e 67 20 6d  ared.isPending m
3020: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3030: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3040: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3050: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3060: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3070: 20 20 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e     pBt->isPendin
3080: 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  g = 0;.  }.}../*
3090: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
30a0: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
30b0: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
30c0: 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 74  y connection p t
30d0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
30e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
30f0: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3100: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3110: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3120: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3130: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3140: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3150: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3160: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3170: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69   = 0;.    pBt->i
3180: 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30 3b 0a  sExclusive = 0;.
3190: 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e 64 69      pBt->isPendi
31a0: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ng = 0;.    for(
31b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
31c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
31d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
31e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
31f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3200: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3210: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3220: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3230: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3240: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3250: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3260: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3270: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3280: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3290: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
32a0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
32b0: 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  ../*.** Verify t
32c0: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
32d0: 6f 6c 64 73 20 61 20 6d 75 74 65 78 20 6f 6e 20  olds a mutex on 
32e0: 74 68 65 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a  the BtShared.*/.
32f0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
3300: 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72  tatic int cursor
3310: 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72  HoldsMutex(BtCur
3320: 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  sor *p){.  retur
3330: 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  n sqlite3_mutex_
3340: 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74  held(p->pBt->mut
3350: 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ex);.}.#endif...
3360: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3370: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a  MIT_INCRBLOB./*.
3380: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
3390: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
33a0: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 63  list cache for c
33b0: 75 72 73 6f 72 20 70 43 75 72 2c 20 69 66 20 61  ursor pCur, if a
33c0: 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ny..*/.static vo
33d0: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  id invalidateOve
33e0: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 43 75 72  rflowCache(BtCur
33f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
3400: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
3410: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
3420: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3430: 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b  Cur->aOverflow);
3440: 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  .  pCur->aOverfl
3450: 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ow = 0;.}../*.**
3460: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
3470: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
3480: 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c  st cache for all
3490: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a   cursors opened.
34a0: 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  ** on the shared
34b0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
34c0: 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pBt..*/.static 
34d0: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41  void invalidateA
34e0: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
34f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
3500: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
3510: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3520: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
3530: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
3540: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
3550: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
3560: 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  .    invalidateO
3570: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b  verflowCache(p);
3580: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3590: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
35a0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
35b0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
35c0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
35d0: 2a 20 62 2d 74 72 65 65 20 74 6f 20 69 6e 76 61  * b-tree to inva
35e0: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
35f0: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3600: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3610: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3620: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3630: 20 6d 6f 64 69 66 69 65 64 2e 20 41 72 67 75 6d   modified. Argum
3640: 65 6e 74 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20  ent pgnoRoot is 
3650: 74 68 65 20 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67  the .** root-pag
3660: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 62  e of the table b
3670: 2d 74 72 65 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  -tree. .**.** If
3680: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3690: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
36a0: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
36b0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
36c0: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
36d0: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
36e0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
36f0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
3700: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
3710: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
3720: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
3730: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
3740: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
3750: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
3760: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
3770: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
3780: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
3790: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
37a0: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
37b0: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
37c0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
37d0: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
37e0: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
37f0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
3800: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
3810: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3820: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3830: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
3840: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
3850: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3860: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
3870: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52   */.  Pgno pgnoR
3880: 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  oot,          /*
3890: 20 4c 6f 6f 6b 20 66 6f 72 20 72 65 61 64 20 63   Look for read c
38a0: 75 72 73 6f 72 73 20 6f 6e 20 74 68 69 73 20 62  ursors on this b
38b0: 74 72 65 65 20 2a 2f 0a 20 20 69 36 34 20 69 52  tree */.  i64 iR
38c0: 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ow,             
38d0: 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74    /* The rowid t
38e0: 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61  hat might be cha
38f0: 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  nging */.  int i
3900: 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20  sClearTable     
3910: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c     /* True if al
3920: 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67  l rows are being
3930: 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20   deleted */.){. 
3940: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
3950: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3960: 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61  pBtree->pBt;.  a
3970: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
3980: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42  reeHoldsMutex(pB
3990: 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70  tree) );.  for(p
39a0: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
39b0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
39c0: 20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e 63 72     if( p->isIncr
39d0: 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 28 69  blobHandle && (i
39e0: 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70  sClearTable || p
39f0: 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f  ->info.nKey==iRo
3a00: 77 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  w) ){.      p->e
3a10: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
3a20: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20  NVALID;.    }.  
3a30: 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 23 64 65  }.}..#else.  #de
3a40: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f  fine invalidateO
3a50: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a  verflowCache(x).
3a60: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
3a70: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
3a80: 61 63 68 65 28 78 29 0a 20 20 23 64 65 66 69 6e  ache(x).  #defin
3a90: 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  e invalidateIncr
3aa0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 77 2c 78 2c  blobCursors(w,x,
3ab0: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
3ac0: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
3ad0: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
3ae0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
3af0: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
3b00: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
3b10: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
3b20: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
3b30: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
3b40: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
3b50: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
3b60: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
3b70: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
3b80: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
3b90: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
3ba0: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
3bb0: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
3bc0: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
3bd0: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
3be0: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
3bf0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
3c00: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
3c10: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
3c20: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
3c30: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
3c40: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
3c50: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
3c60: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
3c70: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
3c80: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
3c90: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
3ca0: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
3cb0: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
3cc0: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
3cd0: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
3ce0: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
3cf0: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
3d00: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
3d10: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
3d20: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
3d30: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
3d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
3d50: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
3d60: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
3d70: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
3d80: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
3d90: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
3da0: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
3db0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
3dc0: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
3dd0: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
3de0: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
3df0: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
3e00: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
3e10: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
3e20: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
3e30: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
3e40: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
3e50: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
3e60: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
3e70: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
3e80: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
3e90: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
3ea0: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
3eb0: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
3ec0: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
3ed0: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
3ee0: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
3ef0: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
3f00: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
3f10: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
3f20: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
3f30: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
3f40: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
3f50: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
3f60: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
3f70: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
3f80: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
3f90: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
3fa0: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
3fb0: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
3fc0: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
3fd0: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
3fe0: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
3ff0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
4000: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
4010: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
4020: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
4030: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
4040: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4050: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4060: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
4070: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
4080: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4090: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
40a0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
40b0: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
40c0: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
40d0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
40e0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
40f0: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
4100: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
4110: 6f 76 65 20 69 73 20 6f 6d 6d 69 74 74 65 64 20  ove is ommitted 
4120: 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  if the correspon
4130: 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65  ding bit is alre
4140: 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74  ady.** set in Bt
4150: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4160: 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73  nt. The contents
4170: 20 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61   of the bitvec a
4180: 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74  re cleared.** at
4190: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
41a0: 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  y transaction..*
41b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
41c0: 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeSetHasContent(
41d0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
41e0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
41f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4200: 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61  .  if( !pBt->pHa
4210: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4220: 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 72  int nPage;.    r
4230: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
4240: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
4250: 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
4260: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
4270: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
4280: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4290: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
42a0: 72 65 61 74 65 28 28 75 33 32 29 6e 50 61 67 65  reate((u32)nPage
42b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 42  );.      if( !pB
42c0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29  t->pHasContent )
42d0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
42e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
42f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
4300: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4310: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
4320: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
4330: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
4340: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4350: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4360: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4370: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4380: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4390: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
43a0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
43b0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
43c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
43d0: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
43e0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
43f0: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
4400: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
4410: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
4420: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
4430: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
4440: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
4450: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4460: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4470: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4480: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4490: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
44a0: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
44b0: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
44c0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
44d0: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
44e0: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
44f0: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
4500: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
4510: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
4520: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
4530: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
4540: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
4550: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4560: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4570: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4580: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4590: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
45a0: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
45b0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
45c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
45d0: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
45e0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
45f0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4600: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4610: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4620: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4630: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
4640: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
4650: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
4660: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
4670: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
4680: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
4690: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
46a0: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
46b0: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
46c0: 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  ESEEK..*/.static
46d0: 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50   int saveCursorP
46e0: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
46f0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
4700: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55  c;..  assert( CU
4710: 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
4720: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
4730: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
4740: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
4750: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
4760: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63  x(pCur) );..  rc
4770: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
4780: 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43  eySize(pCur, &pC
4790: 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a  ur->nKey);..  /*
47a0: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
47b0: 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntKey table, the
47c0: 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c  n the above call
47d0: 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65   to BtreeKeySize
47e0: 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  ().  ** stores t
47f0: 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69  he integer key i
4800: 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e  n pCur->nKey. In
4810: 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
4820: 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c  value is.  ** al
4830: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
4840: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
4850: 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70  f pCur is not op
4860: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a  en on an intKey.
4870: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e    ** table, then
4880: 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f   malloc space fo
4890: 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  r and store the 
48a0: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
48b0: 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61   of key .  ** da
48c0: 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ta..  */.  if( r
48d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
48e0: 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  0==pCur->apPage[
48f0: 30 5d 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20 20 20  0]->intKey){.   
4900: 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71   void *pKey = sq
4910: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e  lite3Malloc( (in
4920: 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a  t)pCur->nKey );.
4930: 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
4940: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
4950: 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
4960: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
4970: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
4980: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4990: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
49a0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
49b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
49c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
49d0: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
49e0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
49f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4a00: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
4a10: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
4a20: 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
4a30: 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b  Key || !pCur->pK
4a40: 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ey );..  if( rc=
4a50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4a60: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
4a70: 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
4a80: 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
4a90: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
4aa0: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
4ab0: 20 20 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61        pCur->apPa
4ac0: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ge[i] = 0;.    }
4ad0: 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
4ae0: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d   = -1;.    pCur-
4af0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
4b00: 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20  _REQUIRESEEK;.  
4b10: 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  }..  invalidateO
4b20: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
4b30: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
4b40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  .}../*.** Save t
4b50: 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
4b60: 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65  all cursors exce
4b70: 70 74 20 70 45 78 63 65 70 74 20 6f 70 65 6e 20  pt pExcept open 
4b80: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a  on the table .**
4b90: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
4ba0: 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20  iRoot. Usually, 
4bb0: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a  this is called j
4bc0: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
4bd0: 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20  r.** pExcept is 
4be0: 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74  used to modify t
4bf0: 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44  he table (BtreeD
4c00: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
4c10: 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74  Insert())..*/.st
4c20: 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c  atic int saveAll
4c30: 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
4c40: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f   *pBt, Pgno iRoo
4c50: 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
4c60: 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  cept){.  BtCurso
4c70: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
4c80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
4c90: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
4ca0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63  ;.  assert( pExc
4cb0: 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70  ept==0 || pExcep
4cc0: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
4cd0: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
4ce0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
4cf0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
4d00: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
4d10: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
4d20: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a  oot==iRoot) && .
4d30: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
4d40: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
4d50: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
4d60: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
4d70: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69  tion(p);.      i
4d80: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
4d90: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4da0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
4db0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4dc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4dd0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
4de0: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
4df0: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  osition..*/.void
4e00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
4e10: 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  arCursor(BtCurso
4e20: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
4e30: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4e40: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
4e50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
4e60: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
4e70: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
4e80: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
4e90: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
4ea0: 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68  /*.** Restore th
4eb0: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
4ec0: 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20  position it was 
4ed0: 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20  in (or as close 
4ee0: 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a  to as possible).
4ef0: 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73  ** when saveCurs
4f00: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73  orPosition() was
4f10: 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68   called. Note th
4f20: 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c  at this call del
4f30: 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76  etes the .** sav
4f40: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  ed position info
4f50: 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43   stored by saveC
4f60: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c  ursorPosition(),
4f70: 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65   so there can be
4f80: 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  .** at most one 
4f90: 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72  effective restor
4fa0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
4fb0: 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63  ) call after eac
4fc0: 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72  h .** saveCursor
4fd0: 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 69  Position()..*/.i
4fe0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
4ff0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
5000: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
5010: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
5020: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
5030: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
5040: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
5050: 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
5060: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
5070: 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
5080: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
5090: 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
50a0: 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
50b0: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
50c0: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
50d0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
50e0: 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  BtreeMoveto(pCur
50f0: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
5100: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43  ur->nKey, 0, &pC
5110: 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28  ur->skip);.  if(
5120: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5130: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
5140: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
5150: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
5160: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
5170: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
5180: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
5190: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
51a0: 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20  OR_INVALID );.  
51b0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
51c0: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
51d0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
51e0: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
51f0: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
5200: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
5210: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
5220: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
5230: 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20  tion(p) : \.    
5240: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a       SQLITE_OK).
5250: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
5260: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
5270: 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76  a cursor has mov
5280: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69  ed from the posi
5290: 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c  tion it.** was l
52a0: 61 73 74 20 70 6c 61 63 65 64 20 61 74 2e 20 20  ast placed at.  
52b0: 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65  Cursors can move
52c0: 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68   when the row th
52d0: 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a  ey are pointing.
52e0: 2a 2a 20 61 74 20 69 73 20 64 65 6c 65 74 65 64  ** at is deleted
52f0: 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
5300: 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  them..**.** This
5310: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
5320: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
5330: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
5340: 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20   wrong.  The.** 
5350: 69 6e 74 65 67 65 72 20 2a 70 48 61 73 4d 6f 76  integer *pHasMov
5360: 65 64 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  ed is set to one
5370: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 68   if the cursor h
5380: 61 73 20 6d 6f 76 65 64 20 61 6e 64 20 30 20 69  as moved and 0 i
5390: 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  f not..*/.int sq
53a0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
53b0: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
53c0: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 48  r *pCur, int *pH
53d0: 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20  asMoved){.  int 
53e0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73 74  rc;..  rc = rest
53f0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
5400: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
5410: 63 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f  c ){.    *pHasMo
5420: 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  ved = 1;.    ret
5430: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
5440: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
5450: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
5460: 70 43 75 72 2d 3e 73 6b 69 70 21 3d 30 20 29 7b  pCur->skip!=0 ){
5470: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
5480: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
5490: 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30    *pHasMoved = 0
54a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
54b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
54c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
54d0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
54e0: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
54f0: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
5500: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
5510: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
5520: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
5530: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
5540: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
5550: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
5560: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
5570: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  ge number..*/.st
5580: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
5590: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
55a0: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
55b0: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
55c0: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
55d0: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
55e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
55f0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
5600: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61  >mutex) );.  nPa
5610: 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20  gesPerMapPage = 
5620: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
5630: 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70  /5)+1;.  iPtrMap
5640: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
5650: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
5660: 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e  ret = (iPtrMap*n
5670: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29  PagesPerMapPage)
5680: 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74   + 2; .  if( ret
5690: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
56a0: 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
56b0: 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ret++;.  }.  ret
56c0: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
56d0: 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79  * Write an entry
56e0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
56f0: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
5700: 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65  s routine update
5710: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
5720: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
5730: 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a   number 'key'.**
5740: 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73   so that it maps
5750: 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27   to type 'eType'
5760: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
5770: 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a   number 'pgno'..
5780: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
5790: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
57a0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
57b0: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
57c0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
57d0: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50  atic int ptrmapP
57e0: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
57f0: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
5800: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
5810: 74 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  t){.  DbPage *pD
5820: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
5830: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
5840: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
5850: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
5860: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
5870: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
5880: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
5890: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
58a0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
58b0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
58c0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
58d0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
58e0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
58f0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5900: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
5910: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
5920: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
5930: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
5940: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
5950: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
5960: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
5970: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
5980: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
5990: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
59a0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
59b0: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
59c0: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
59d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
59e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
59f0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
5a00: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
5a10: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
5a20: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
5a30: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
5a40: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
5a50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5a60: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
5a70: 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  rc;.  }.  offset
5a80: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
5a90: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
5aa0: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
5ab0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
5ac0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
5ad0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d  KPT;.  }.  pPtrm
5ae0: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
5af0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
5b00: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
5b10: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
5b20: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
5b30: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
5b40: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
5b50: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
5b60: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
5b70: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
5b80: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
5b90: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
5ba0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
5bb0: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
5bc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5bd0: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
5be0: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
5bf0: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
5c00: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
5c10: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
5c20: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
5c30: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
5c40: 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
5c50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
5c60: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
5c70: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
5c80: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5c90: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
5ca0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
5cb0: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
5cc0: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
5cd0: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
5ce0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
5cf0: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
5d00: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
5d10: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
5d20: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
5d30: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
5d40: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
5d50: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
5d60: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
5d70: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
5d80: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
5d90: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
5da0: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
5db0: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
5dc0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
5dd0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
5de0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
5df0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
5e00: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
5e10: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
5e20: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
5e30: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
5e40: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
5e50: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
5e60: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
5e70: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
5e80: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5e90: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
5ea0: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
5eb0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
5ec0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
5ed0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
5ee0: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
5ef0: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
5f00: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
5f10: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
5f20: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
5f30: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
5f40: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
5f50: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
5f60: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
5f70: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
5f80: 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28   key);.  assert(
5f90: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
5fa0: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
5fb0: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
5fc0: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
5fd0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
5fe0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
5ff0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
6000: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
6010: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
6020: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
6030: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6040: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
6050: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6060: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
6070: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
6080: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
6090: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
60a0: 75 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  ut(w,x,y,z) SQLI
60b0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
60c0: 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c  ptrmapGet(w,x,y,
60d0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
60e0: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
60f0: 4f 76 66 6c 50 74 72 28 78 2c 20 79 29 20 53 51  OvflPtr(x, y) SQ
6100: 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
6110: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
6120: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
6130: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
6140: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
6150: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
6160: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
6170: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
6180: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
6190: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
61a0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
61b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
61c0: 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  tine works only 
61d0: 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64  for pages that d
61e0: 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76  o not contain ov
61f0: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
6200: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
6210: 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d  l(P,I) \.  ((P)-
6220: 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d  >aData + ((P)->m
6230: 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79  askPage & get2by
6240: 74 65 28 26 28 50 29 2d 3e 61 44 61 74 61 5b 28  te(&(P)->aData[(
6250: 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  P)->cellOffset+2
6260: 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a 20  *(I)])))../*.** 
6270: 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70  This a more comp
6280: 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66  lex version of f
6290: 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77  indCell() that w
62a0: 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65  orks for.** page
62b0: 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69  s that do contai
62c0: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
62d0: 2e 20 20 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f  .  See insert.*/
62e0: 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64  .static u8 *find
62f0: 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d  OverflowCell(Mem
6300: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
6310: 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69   iCell){.  int i
6320: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6330: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6340: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
6350: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61  ) );.  for(i=pPa
6360: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b  ge->nOverflow-1;
6370: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
6380: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75   int k;.    stru
6390: 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f  ct _OvflCell *pO
63a0: 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d  vfl;.    pOvfl =
63b0: 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69   &pPage->aOvfl[i
63c0: 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c  ];.    k = pOvfl
63d0: 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b  ->idx;.    if( k
63e0: 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  <=iCell ){.     
63f0: 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b   if( k==iCell ){
6400: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6410: 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20  pOvfl->pCell;.  
6420: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c      }.      iCel
6430: 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  l--;.    }.  }. 
6440: 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c   return findCell
6450: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a  (pPage, iCell);.
6460: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61  }../*.** Parse a
6470: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c   cell content bl
6480: 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20  ock and fill in 
6490: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72  the CellInfo str
64a0: 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a  ucture.  There.*
64b0: 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f  * are two versio
64c0: 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ns of this funct
64d0: 69 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42 74 72  ion.  sqlite3Btr
64e0: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61  eeParseCell() ta
64f0: 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69  kes a .** cell i
6500: 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f  ndex as the seco
6510: 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  nd argument and 
6520: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
6530: 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74  eCellPtr() .** t
6540: 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  akes a pointer t
6550: 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
6560: 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65  e cell as its se
6570: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
6580: 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73  *.** Within this
6590: 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65   file, the parse
65a0: 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e  Cell() macro can
65b0: 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
65c0: 61 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  ad of.** sqlite3
65d0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
65e0: 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20  r(). Using some 
65f0: 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20  compilers, this 
6600: 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a  will be faster..
6610: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
6620: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
6630: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
6640: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
6650: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
6660: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
6670: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
6680: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
6690: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
66a0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
66b0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
66c0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
66d0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
66e0: 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20   u16 n;         
66f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6700: 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  er bytes in cell
6710: 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20   content header 
6720: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
6730: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
6740: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
6750: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
6760: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
6770: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6780: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
6790: 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d  ex) );..  pInfo-
67a0: 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  >pCell = pCell;.
67b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
67c0: 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67  >leaf==0 || pPag
67d0: 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20  e->leaf==1 );.  
67e0: 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  n = pPage->child
67f0: 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  PtrSize;.  asser
6800: 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d  t( n==4-4*pPage-
6810: 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70  >leaf );.  if( p
6820: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
6830: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
6840: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
6850: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
6860: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
6870: 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  load);.    }else
6880: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
6890: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
68a0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  n += getVarint(&
68b0: 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29  pCell[n], (u64*)
68c0: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
68d0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20     pInfo->nData 
68e0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  = nPayload;.  }e
68f0: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  lse{.    pInfo->
6900: 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e  nData = 0;.    n
6910: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
6920: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c  &pCell[n], nPayl
6930: 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  oad);.    pInfo-
6940: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
6950: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
6960: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
6970: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65  ad;.  pInfo->nHe
6980: 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20  ader = n;.  if( 
6990: 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c  likely(nPayload<
69a0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
69b0: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  ) ){.    /* This
69c0: 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63   is the (easy) c
69d0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
69e0: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c   the entire payl
69f0: 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20  oad fits.    ** 
6a00: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
6a10: 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20  e.  No overflow 
6a20: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
6a30: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a   */.    int nSiz
6a40: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
6a50: 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c  otal size of cel
6a60: 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74  l content in byt
6a70: 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a 65 20  es */.    nSize 
6a80: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a  = nPayload + n;.
6a90: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
6aa0: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
6ab0: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f  d;.    pInfo->iO
6ac0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
6ad0: 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20 7e 33   if( (nSize & ~3
6ae0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53  )==0 ){.      nS
6af0: 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20 20  ize = 4;        
6b00: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
6b10: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 20  size is 4 */.   
6b20: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53   }.    pInfo->nS
6b30: 69 7a 65 20 3d 20 28 75 31 36 29 6e 53 69 7a 65  ize = (u16)nSize
6b40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
6b50: 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64  * If the payload
6b60: 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f   will not fit co
6b70: 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20  mpletely on the 
6b80: 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68  local page, we h
6b90: 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65  ave.    ** to de
6ba0: 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f  cide how much to
6bb0: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61   store locally a
6bc0: 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  nd how much to s
6bd0: 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a  pill onto.    **
6be0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
6bf0: 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69    The strategy i
6c00: 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68  s to minimize th
6c10: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73  e amount of unus
6c20: 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  ed.    ** space 
6c30: 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
6c40: 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20  s while keeping 
6c50: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f  the amount of lo
6c60: 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20  cal storage.    
6c70: 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69  ** in between mi
6c80: 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f  nLocal and maxLo
6c90: 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  cal..    **.    
6ca0: 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61  ** Warning:  cha
6cb0: 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76  nging the way ov
6cc0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69  erflow payload i
6cd0: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  s distributed in
6ce0: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20   any.    ** way 
6cf0: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
6d00: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66  n incompatible f
6d10: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20  ile format..    
6d20: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  */.    int minLo
6d30: 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  cal;  /* Minimum
6d40: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
6d50: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
6d60: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f  */.    int maxLo
6d70: 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  cal;  /* Maximum
6d80: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
6d90: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
6da0: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c  */.    int surpl
6db0: 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  us;   /* Overflo
6dc0: 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61  w payload availa
6dd0: 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74  ble for local st
6de0: 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69  orage */..    mi
6df0: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
6e00: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61  minLocal;.    ma
6e10: 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  xLocal = pPage->
6e20: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75  maxLocal;.    su
6e30: 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c  rplus = minLocal
6e40: 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d   + (nPayload - m
6e50: 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d  inLocal)%(pPage-
6e60: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
6e70: 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20 73   - 4);.    if( s
6e80: 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63  urplus <= maxLoc
6e90: 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66  al ){.      pInf
6ea0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
6eb0: 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65  )surplus;.    }e
6ec0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f  lse{.      pInfo
6ed0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
6ee0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a  minLocal;.    }.
6ef0: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
6f00: 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70 49 6e  flow = (u16)(pIn
6f10: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b  fo->nLocal + n);
6f20: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
6f30: 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72  e = pInfo->iOver
6f40: 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a  flow + 4;.  }.}.
6f50: 23 64 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c  #define parseCel
6f60: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
6f70: 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c 69 74  pInfo) \.  sqlit
6f80: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
6f90: 50 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e  Ptr((pPage), fin
6fa0: 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28  dCell((pPage), (
6fb0: 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29  iCell)), (pInfo)
6fc0: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  ).void sqlite3Bt
6fd0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
6fe0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
6ff0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
7000: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
7010: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
7020: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
7030: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
7040: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
7050: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
7060: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
7070: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
7080: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
7090: 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50  {.  parseCell(pP
70a0: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
70b0: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
70c0: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
70d0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
70e0: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
70f0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
7100: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
7110: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
7120: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
7130: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
7140: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
7150: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
7160: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
7170: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
7180: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
7190: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
71a0: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
71b0: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
71c0: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
71d0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
71e0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
71f0: 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68  &pCell[pPage->ch
7200: 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75  ildPtrSize];.  u
7210: 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65  32 nSize;..#ifde
7220: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
7230: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
7240: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
7250: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
7260: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
7270: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
7280: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
7290: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
72a0: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
72b0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
72c0: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
72d0: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
72e0: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
72f0: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
7300: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
7310: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
7320: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
7330: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
7340: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
7350: 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 42  info;.  sqlite3B
7360: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7370: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
7380: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
7390: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
73a0: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75  >intKey ){.    u
73b0: 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28  8 *pEnd;.    if(
73c0: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
73d0: 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b  ){.      pIter +
73e0: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
73f0: 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  ter, nSize);.   
7400: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53   }else{.      nS
7410: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ize = 0;.    }..
7420: 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77      /* pIter now
7430: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36   points at the 6
7440: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65  4-bit integer ke
7450: 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61  y value, a varia
7460: 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20  ble length .    
7470: 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20  ** integer. The 
7480: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
7490: 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70  moves pIter to p
74a0: 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73  oint at the firs
74b0: 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61  t byte.    ** pa
74c0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
74d0: 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a  e key value. */.
74e0: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
74f0: 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  r[9];.    while(
7500: 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30   (*pIter++)&0x80
7510: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
7520: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
7530: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
7540: 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65  t32(pIter, nSize
7550: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 53  );.  }..  if( nS
7560: 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ize>pPage->maxLo
7570: 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  cal ){.    int m
7580: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
7590: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e  >minLocal;.    n
75a0: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  Size = minLocal 
75b0: 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f  + (nSize - minLo
75c0: 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70  cal) % (pPage->p
75d0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
75e0: 20 34 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69   4);.    if( nSi
75f0: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
7600: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
7610: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
7620: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
7630: 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20   4;.  }.  nSize 
7640: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
7650: 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54   pCell);..  /* T
7660: 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
7670: 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34  of any cell is 4
7680: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28   bytes. */.  if(
7690: 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20   nSize<4 ){.    
76a0: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a  nSize = 4;.  }..
76b0: 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d    assert( nSize=
76c0: 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65  =debuginfo.nSize
76d0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
76e0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 23 69 66 6e 64  6)nSize;.}.#ifnd
76f0: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
7700: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
7710: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
7720: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
7730: 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  rn cellSizePtr(p
7740: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
7750: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
7760: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
7770: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7780: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
7790: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
77a0: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
77b0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
77c0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
77d0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
77e0: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
77f0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
7800: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
7810: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
7820: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
7830: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d  apPutOvflPtr(Mem
7840: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
7850: 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49  *pCell){.  CellI
7860: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73 65  nfo info;.  asse
7870: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
7880: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
7890: 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
78a0: 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
78b0: 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f  .  assert( (info
78c0: 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
78d0: 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
78e0: 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f  y))==info.nPaylo
78f0: 61 64 20 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  ad );.  if( info
7900: 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
7910: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
7920: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
7930: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
7940: 20 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61      return ptrma
7950: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
7960: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
7970: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
7980: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
7990: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
79a0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
79b0: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
79c0: 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20  age given.  All 
79d0: 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20  Cells are moved 
79e0: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
79f0: 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c   the page and al
7a00: 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20  l free space is 
7a10: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f  collected into o
7a20: 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c  ne.** big FreeBl
7a30: 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  k that occurs in
7a40: 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61   between the hea
7a50: 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20  der and cell.** 
7a60: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e  pointer array an
7a70: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
7a80: 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74  nt area..*/.stat
7a90: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
7aa0: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
7ab0: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ad0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
7ae0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b00: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
7b10: 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  f a i-th cell */
7b20: 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7b40: 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
7b50: 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c   byte after cell
7b60: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
7b70: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b90: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
7ba0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
7bb0: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7bd0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
7be0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
7bf0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7c00: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
7c10: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
7c20: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
7c30: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
7c40: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
7c50: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
7c60: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
7c70: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
7c80: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
7c90: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
7ca0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
7cb0: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
7cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7cd0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
7ce0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
7cf0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
7d00: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
7d10: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
7d20: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
7d30: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
7d40: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
7d50: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
7d60: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
7d70: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
7d80: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
7d90: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
7da0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
7db0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
7dc0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
7dd0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
7de0: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
7df0: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
7e00: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
7e10: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7e20: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
7e30: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
7e40: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
7e50: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
7e60: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
7e70: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
7e80: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
7e90: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
7ea0: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
7eb0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
7ec0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
7ed0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
7ee0: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
7ef0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
7f00: 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
7f10: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
7f20: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62  usableSize;.  cb
7f30: 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
7f40: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d  ata[hdr+5]);.  m
7f50: 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b  emcpy(&temp[cbrk
7f60: 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  ], &data[cbrk], 
7f70: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72  usableSize - cbr
7f80: 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61  k);.  cbrk = usa
7f90: 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69  bleSize;.  for(i
7fa0: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
7fb0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
7fc0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
7fd0: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
7fe0: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
7ff0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
8000: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
8010: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
8020: 0a 20 20 20 20 69 66 28 20 70 63 3e 3d 75 73 61  .    if( pc>=usa
8030: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
8040: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8050: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8060: 20 7d 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65   }.    size = ce
8070: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
8080: 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20   &temp[pc]);.   
8090: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20   cbrk -= size;. 
80a0: 20 20 20 69 66 28 20 63 62 72 6b 3c 63 65 6c 6c     if( cbrk<cell
80b0: 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 7c  Offset+2*nCell |
80c0: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
80d0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
80e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
80f0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
8100: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
8110: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
8120: 65 20 26 26 20 63 62 72 6b 3e 3d 30 20 29 3b 0a  e && cbrk>=0 );.
8130: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
8140: 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  [cbrk], &temp[pc
8150: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
8160: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
8170: 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  rk);.  }.  asser
8180: 74 28 20 63 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66  t( cbrk>=cellOff
8190: 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20  set+2*nCell );. 
81a0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
81b0: 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20  hdr+5], cbrk);. 
81c0: 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30   data[hdr+1] = 0
81d0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20  ;.  data[hdr+2] 
81e0: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
81f0: 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d  7] = 0;.  addr =
8200: 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43   cellOffset+2*nC
8210: 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ell;.  memset(&d
8220: 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 63 62  ata[addr], 0, cb
8230: 72 6b 2d 61 64 64 72 29 3b 0a 20 20 61 73 73 65  rk-addr);.  asse
8240: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
8250: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
8260: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
8270: 20 69 66 28 20 63 62 72 6b 2d 61 64 64 72 21 3d   if( cbrk-addr!=
8280: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
8290: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
82a0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
82b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
82c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
82d0: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
82e0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
82f0: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42  rom within the B
8300: 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65  -Tree page passe
8310: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
8320: 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  t argument. Retu
8330: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  rn the index int
8340: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
8350: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 69 72 73   of the .** firs
8360: 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61  t byte of alloca
8370: 74 65 64 20 73 70 61 63 65 2e 20 0a 2a 2a 0a 2a  ted space. .**.*
8380: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
8390: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
83a0: 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 74   space between t
83b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 65  he end of the ce
83c0: 6c 6c 2d 6f 66 66 73 65 74 20 0a 2a 2a 20 61 72  ll-offset .** ar
83d0: 72 61 79 20 61 6e 64 20 74 68 65 20 73 74 61 72  ray and the star
83e0: 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  t of the cell-co
83f0: 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 61 74  ntent area is at
8400: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
8410: 65 73 0a 2a 2a 20 69 6e 20 73 69 7a 65 2e 20 53  es.** in size. S
8420: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  o this routine c
8430: 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a  an never fail..*
8440: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
8450: 65 20 61 6c 72 65 61 64 79 20 36 30 20 6f 72 20  e already 60 or 
8460: 6d 6f 72 65 20 62 79 74 65 73 20 6f 66 20 66 72  more bytes of fr
8470: 61 67 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74  agments within t
8480: 68 65 20 70 61 67 65 2c 0a 2a 2a 20 74 68 65 20  he page,.** the 
8490: 70 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65  page is defragme
84a0: 6e 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  nted before retu
84b0: 72 6e 69 6e 67 2e 20 49 66 20 74 68 69 73 20 77  rning. If this w
84c0: 65 72 65 20 6e 6f 74 20 64 6f 6e 65 20 74 68 65  ere not done the
84d0: 72 65 0a 2a 2a 20 69 73 20 61 20 63 68 61 6e 63  re.** is a chanc
84e0: 65 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  e that the numbe
84f0: 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20  r of fragmented 
8500: 62 79 74 65 73 20 63 6f 75 6c 64 20 65 76 65 6e  bytes could even
8510: 74 75 61 6c 6c 79 20 0a 2a 2a 20 6f 76 65 72 66  tually .** overf
8520: 6c 6f 77 20 74 68 65 20 73 69 6e 67 6c 65 2d 62  low the single-b
8530: 79 74 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  yte field of the
8540: 20 70 61 67 65 2d 68 65 61 64 65 72 20 69 6e 20   page-header in 
8550: 77 68 69 63 68 20 74 68 69 73 20 76 61 6c 75 65  which this value
8560: 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a  .** is stored..*
8570: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
8580: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
8590: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
85a0: 42 79 74 65 29 7b 0a 20 20 63 6f 6e 73 74 20 69  Byte){.  const i
85b0: 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
85c0: 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  hdrOffset;    /*
85d0: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
85e0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
85f0: 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
8600: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
8610: 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  Data;      /* Lo
8620: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
8630: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69  ge->aData */.  i
8640: 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20  nt nFrag;       
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8670: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
8680: 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  s on pPage */.  
8690: 69 6e 74 20 74 6f 70 3b 0a 20 20 0a 20 20 61 73  int top;.  .  as
86a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
86b0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
86c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
86d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
86e0: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
86f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8700: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
8710: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
8720: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
8730: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
8740: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
8750: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8760: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
8770: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8780: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
8790: 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
87a0: 68 61 74 20 74 68 65 20 73 70 61 63 65 20 62 65  hat the space be
87b0: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 2d 6f  tween the cell-o
87c0: 66 66 73 65 74 20 61 72 72 61 79 20 61 6e 64 20  ffset array and 
87d0: 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 2d 63  the .  ** cell-c
87e0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 67  ontent area is g
87f0: 72 65 61 74 65 72 20 74 68 61 6e 20 6e 42 79 74  reater than nByt
8800: 65 20 62 79 74 65 73 2e 0a 20 20 2a 2f 0a 20 20  e bytes..  */.  
8810: 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 3d  assert( nByte <=
8820: 20 28 0a 20 20 20 20 20 20 67 65 74 32 62 79 74   (.      get2byt
8830: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 2d  e(&data[hdr+5])-
8840: 28 68 64 72 2b 38 2b 28 70 50 61 67 65 2d 3e 6c  (hdr+8+(pPage->l
8850: 65 61 66 3f 30 3a 34 29 2b 32 2a 67 65 74 32 62  eaf?0:4)+2*get2b
8860: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
8870: 29 29 0a 20 20 29 29 3b 0a 0a 20 20 6e 46 72 61  )).  ));..  nFra
8880: 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b  g = data[hdr+7];
8890: 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30  .  if( nFrag>=60
88a0: 20 29 7b 0a 20 20 20 20 64 65 66 72 61 67 6d 65   ){.    defragme
88b0: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
88c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53   }else{.    /* S
88d0: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69  earch the freeli
88e0: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
88f0: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
8900: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
8910: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71   .    ** the req
8920: 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61  uest. The alloca
8930: 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f  tion is made fro
8940: 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  m the first free
8950: 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a   slot in .    **
8960: 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69   the list that i
8970: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
8980: 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e  o accomadate it.
8990: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
89a0: 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f  pc, addr;.    fo
89b0: 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70  r(addr=hdr+1; (p
89c0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
89d0: 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64  ta[addr]))>0; ad
89e0: 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e  dr=pc){.      in
89f0: 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74  t size = get2byt
8a00: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 20  e(&data[pc+2]); 
8a10: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 66      /* Size of f
8a20: 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20  ree slot */.    
8a30: 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74    if( size>=nByt
8a40: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e ){.        int
8a50: 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74   x = size - nByt
8a60: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  e;.        if( x
8a70: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
8a80: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c  /* Remove the sl
8a90: 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ot from the free
8aa0: 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68  -list. Update th
8ab0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
8ac0: 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e        ** fragmen
8ad0: 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e  ted bytes within
8ae0: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
8af0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
8b00: 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74  data[addr], &dat
8b10: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
8b20: 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d       data[hdr+7]
8b30: 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20   = (u8)(nFrag + 
8b40: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  x);.        }els
8b50: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
8b60: 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73  The slot remains
8b70: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
8b80: 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69  t. Reduce its si
8b90: 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20  ze to account.  
8ba0: 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
8bb0: 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20  he portion used 
8bc0: 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  by the new alloc
8bd0: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
8be0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
8bf0: 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20  ta[pc+2], x);.  
8c00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8c10: 72 65 74 75 72 6e 20 70 63 20 2b 20 78 3b 0a 20  return pc + x;. 
8c20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8c30: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
8c40: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
8c50: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
8c60: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
8c70: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
8c80: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
8c90: 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  area..  */.  top
8ca0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
8cb0: 61 5b 68 64 72 2b 35 5d 29 20 2d 20 6e 42 79 74  a[hdr+5]) - nByt
8cc0: 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  e;.  put2byte(&d
8cd0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
8ce0: 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a  ;.  return top;.
8cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8d00: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
8d10: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
8d20: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
8d30: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
8d40: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
8d50: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
8d60: 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a  >aDisk[start].**
8d70: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
8d80: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73   the block is "s
8d90: 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ize" bytes..**.*
8da0: 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66  * Most of the ef
8db0: 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76  fort here is inv
8dc0: 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69  olved in coalesi
8dd0: 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66  ng adjacent.** f
8de0: 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20  ree blocks into 
8df0: 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65  a single big fre
8e00: 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e block..*/.stat
8e10: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
8e20: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
8e30: 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20   int start, int 
8e40: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  size){.  int add
8e50: 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a  r, pbegin, hdr;.
8e60: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
8e70: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
8e80: 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  Data;..  assert(
8e90: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
8ea0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
8eb0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
8ec0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
8ed0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
8ee0: 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68   start>=pPage->h
8ef0: 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67  drOffset+6+(pPag
8f00: 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a  e->leaf?0:4) );.
8f10: 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72 74    assert( (start
8f20: 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d   + size)<=pPage-
8f30: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
8f40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
8f50: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8f60: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
8f70: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
8f80: 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a   size>=0 );   /*
8f90: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
8fa0: 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23 69 66 64  ze is 4 */..#ifd
8fb0: 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
8fc0: 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65  _DELETE.  /* Ove
8fd0: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
8fe0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
8ff0: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53  zeros when the S
9000: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20  ECURE_DELETE .  
9010: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
9020: 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
9030: 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  time */.  memset
9040: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
9050: 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  , size);.#endif.
9060: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70  .  /* Add the sp
9070: 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ace back into th
9080: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
9090: 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20   freeblocks */. 
90a0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
90b0: 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20  rOffset;.  addr 
90c0: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69  = hdr + 1;.  whi
90d0: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
90e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
90f0: 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62  r]))<start && pb
9100: 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73  egin>0 ){.    as
9110: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
9120: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
9130: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 69 66  Size-4 );.    if
9140: 28 20 70 62 65 67 69 6e 3c 3d 61 64 64 72 20 29  ( pbegin<=addr )
9150: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
9160: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9170: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
9180: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
9190: 7d 0a 20 20 69 66 20 28 20 70 62 65 67 69 6e 3e  }.  if ( pbegin>
91a0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
91b0: 6c 65 53 69 7a 65 2d 34 20 29 20 7b 0a 20 20 20  leSize-4 ) {.   
91c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
91d0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
91e0: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
91f0: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
9200: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
9210: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
9220: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
9230: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
9240: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
9250: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
9260: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
9270: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67  ge->nFree = pPag
9280: 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31 36 29  e->nFree + (u16)
9290: 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c  size;..  /* Coal
92a0: 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72  esce adjacent fr
92b0: 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61  ee blocks */.  a
92c0: 64 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  ddr = pPage->hdr
92d0: 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20 20 77 68  Offset + 1;.  wh
92e0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
92f0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
9300: 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69  dr]))>0 ){.    i
9310: 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c  nt pnext, psize,
9320: 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   x;.    assert( 
9330: 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20  pbegin>addr );. 
9340: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
9350: 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  n<=pPage->pBt->u
9360: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
9370: 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62     pnext = get2b
9380: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
9390: 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20  ]);.    psize = 
93a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
93b0: 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69  begin+2]);.    i
93c0: 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a  f( pbegin + psiz
93d0: 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26  e + 3 >= pnext &
93e0: 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20  & pnext>0 ){.   
93f0: 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e     int frag = pn
9400: 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73  ext - (pbegin+ps
9410: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
9420: 28 66 72 61 67 3c 30 29 20 7c 7c 20 28 66 72 61  (frag<0) || (fra
9430: 67 3e 28 69 6e 74 29 64 61 74 61 5b 70 50 61 67  g>(int)data[pPag
9440: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 29  e->hdrOffset+7])
9450: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
9460: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9470: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
9480: 20 20 20 20 20 20 64 61 74 61 5b 70 50 61 67 65        data[pPage
9490: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d  ->hdrOffset+7] -
94a0: 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20 20 20  = (u8)frag;.    
94b0: 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26    x = get2byte(&
94c0: 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20  data[pnext]);.  
94d0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
94e0: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a  ta[pbegin], x);.
94f0: 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78 74 20        x = pnext 
9500: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
9510: 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70 62 65  [pnext+2]) - pbe
9520: 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74 32 62  gin;.      put2b
9530: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
9540: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c  +2], x);.    }el
9550: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  se{.      addr =
9560: 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20   pbegin;.    }. 
9570: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
9580: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
9590: 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  a begins with a 
95a0: 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76  freeblock, remov
95b0: 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64  e it. */.  if( d
95c0: 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61  ata[hdr+1]==data
95d0: 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b  [hdr+5] && data[
95e0: 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+2]==data[hdr
95f0: 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74  +6] ){.    int t
9600: 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d  op;.    pbegin =
9610: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9620: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d  hdr+1]);.    mem
9630: 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  cpy(&data[hdr+1]
9640: 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  , &data[pbegin],
9650: 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   2);.    top = g
9660: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
9670: 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79 74 65  r+5]) + get2byte
9680: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
9690: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
96a0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
96b0: 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  p);.  }.  assert
96c0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
96d0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
96e0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  >pDbPage) );.  r
96f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
9710: 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
9720: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
9730: 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
9740: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
9750: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
9760: 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
9770: 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
9780: 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f  rdingly..**.** O
9790: 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nly the followin
97a0: 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  g combinations a
97b0: 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41  re supported.  A
97c0: 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  nything differen
97d0: 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61  t.** indicates a
97e0: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
97f0: 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  e files:.**.**  
9800: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
9810: 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  ATA.**         P
9820: 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54  TF_ZERODATA | PT
9830: 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20  F_LEAF.**       
9840: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
9850: 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20   PTF_INTKEY.**  
9860: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
9870: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
9880: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73   | PTF_LEAF.*/.s
9890: 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65  tatic int decode
98a0: 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
98b0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
98c0: 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
98d0: 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
98e0: 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
98f0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
9900: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
9910: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
9920: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
9930: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9940: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
9950: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
9960: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  );.  pPage->leaf
9970: 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65   = (u8)(flagByte
9980: 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50  >>3);  assert( P
9990: 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20  TF_LEAF == 1<<3 
99a0: 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d  );.  flagByte &=
99b0: 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50   ~PTF_LEAF;.  pP
99c0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
99d0: 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c  e = 4-4*pPage->l
99e0: 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  eaf;.  pBt = pPa
99f0: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
9a00: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
9a10: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
9a20: 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61 67  KEY) ){.    pPag
9a30: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
9a40: 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74     pPage->hasDat
9a50: 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b  a = pPage->leaf;
9a60: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
9a70: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
9a80: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
9a90: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
9aa0: 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65  minLeaf;.  }else
9ab0: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50   if( flagByte==P
9ac0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20  TF_ZERODATA ){. 
9ad0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
9ae0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
9af0: 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20 20  >hasData = 0;.  
9b00: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
9b10: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  l = pBt->maxLoca
9b20: 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  l;.    pPage->mi
9b30: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
9b40: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b  nLocal;.  }else{
9b50: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9b60: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9b70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
9b80: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
9b90: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
9ba0: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
9bb0: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
9bc0: 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  k block..**.** R
9bd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
9be0: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
9bf0: 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20  we see that the 
9c00: 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  page does.** not
9c10: 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d   contain a well-
9c20: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
9c30: 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72  page, then retur
9c40: 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  n .** SQLITE_COR
9c50: 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74  RUPT.  Note that
9c60: 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
9c70: 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a  ITE_OK does not.
9c80: 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ** guarantee tha
9c90: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65  t the page is we
9ca0: 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f  ll-formed.  It o
9cb0: 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a  nly shows that.*
9cc0: 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64  * we failed to d
9cd0: 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70  etect any corrup
9ce0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
9cf0: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
9d00: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
9d10: 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  ){..  assert( pP
9d20: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
9d30: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9d40: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
9d50: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
9d60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
9d70: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
9d80: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
9d90: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9da0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9db0: 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
9dc0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
9dd0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
9de0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
9df0: 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
9e00: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
9e10: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
9e20: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73    if( !pPage->is
9e30: 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20  Init ){.    u16 
9e40: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pc;            /
9e50: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66  * Address of a f
9e60: 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20  reeblock within 
9e70: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a  pPage->aData[] *
9e80: 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20  /.    u8 hdr;   
9e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
9ea0: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
9eb0: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
9ec0: 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20  /.    u8 *data; 
9ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
9ee0: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
9ef0: 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65  a */.    BtShare
9f00: 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  d *pBt;        /
9f10: 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
9f20: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
9f30: 20 20 75 31 36 20 75 73 61 62 6c 65 53 69 7a 65    u16 usableSize
9f40: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
9f50: 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
9f60: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
9f70: 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65     u16 cellOffse
9f80: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
9f90: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
9fa0: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
9fb0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
9fc0: 75 31 36 20 6e 46 72 65 65 3b 20 20 20 20 20 20  u16 nFree;      
9fd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9fe0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
9ff0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
a000: 75 31 36 20 74 6f 70 3b 20 20 20 20 20 20 20 20  u16 top;        
a010: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
a020: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
a030: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20  tent area */..  
a040: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
a050: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
a060: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
a070: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
a080: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66  e->aData;.    if
a090: 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50  ( decodeFlags(pP
a0a0: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20  age, data[hdr]) 
a0b0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
a0c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a0d0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
a0e0: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
a0f0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33  pBt->pageSize<=3
a100: 32 37 36 38 20 29 3b 0a 20 20 20 20 70 50 61 67  2768 );.    pPag
a110: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42  e->maskPage = pB
a120: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b  t->pageSize - 1;
a130: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  .    pPage->nOve
a140: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75  rflow = 0;.    u
a150: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
a160: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20  >usableSize;.   
a170: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
a180: 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  et = cellOffset 
a190: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
a1a0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
a1b0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
a1c0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
a1d0: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
a1e0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a1f0: 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28  hdr+3]);.    if(
a200: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
a210: 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
a220: 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63      /* To many c
a230: 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ells for a singl
a240: 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  e page.  The pag
a250: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
a260: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
a270: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
a280: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
a290: 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64    /* A malformed
a2a0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
a2b0: 69 67 68 74 20 63 61 75 73 65 20 75 73 65 20 74  ight cause use t
a2c0: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
a2d0: 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61  end.    ** of pa
a2e0: 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ge when parsing 
a2f0: 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a  a cell.  .    **
a300: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
a310: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
a320: 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
a330: 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
a340: 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a  l extends.    **
a350: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
a360: 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79   a page boundary
a370: 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49   and causes SQLI
a380: 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65  TE_CORRUPT to be
a390: 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65   .    ** returne
a3a0: 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  d if it does..  
a3b0: 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
a3c0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
a3d0: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
a3e0: 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  CK).    {.      
a3f0: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
a400: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
a410: 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  able cell index 
a420: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 65  */.      int iCe
a430: 6c 6c 4c 61 73 74 3b 20 20 20 20 2f 2a 20 4c 61  llLast;    /* La
a440: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
a450: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
a460: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
a470: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
a480: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
a490: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20   array */.      
a4a0: 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
a4b0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
a4c0: 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 43  ell */..      iC
a4d0: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
a4e0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
a4f0: 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 20 20 69 43  >nCell;.      iC
a500: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
a510: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 20 20  Size - 4;.      
a520: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
a530: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
a540: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
a550: 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
a560: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20  ++){.        pc 
a570: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a580: 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d  [cellOffset+i*2]
a590: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
a5a0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
a5b0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
a5c0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
a5d0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
a5e0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
a5f0: 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
a600: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
a610: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
a620: 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73      if( pc+sz>us
a630: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
a640: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a650: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a660: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a670: 20 20 7d 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64    }.    }  .#end
a680: 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  if..    /* Compu
a690: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65  te the total fre
a6a0: 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
a6b0: 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20  age */.    pc = 
a6c0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
a6d0: 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65  dr+1]);.    nFre
a6e0: 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  e = data[hdr+7] 
a6f0: 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65  + top;.    while
a700: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
a710: 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u16 next, size;.
a720: 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61        if( pc>usa
a730: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
a740: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
a750: 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61  ck is off the pa
a760: 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ge */.        re
a770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a780: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
a790: 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20   }.      next = 
a7a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
a7b0: 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  c]);.      size 
a7c0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a7d0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
a7e0: 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78  f( next>0 && nex
a7f0: 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a  t<=pc+size+3 ){.
a800: 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
a810: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
a820: 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
a830: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  r */.        ret
a840: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
a850: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
a860: 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  }.      nFree = 
a870: 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20  nFree + size;.  
a880: 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
a890: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
a8a0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
a8b0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
a8c0: 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
a8d0: 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
a8e0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c    ** of the cell
a8f0: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c  -content area pl
a900: 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  us the number of
a910: 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68   free bytes with
a920: 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65  in.    ** the ce
a930: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll-content area.
a940: 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61   If this is grea
a950: 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61  ter than the usa
a960: 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20  ble-size.    ** 
a970: 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
a980: 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
a990: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
a9a0: 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
a9b0: 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
a9c0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
a9d0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
a9e0: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
a9f0: 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72  ontent.    ** ar
aa00: 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ea, according to
aa10: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
aa20: 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68  , lies within th
aa30: 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  e page..    */. 
aa40: 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61     if( nFree>usa
aa50: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
aa60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
aa70: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
aa80: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e    }.    pPage->n
aa90: 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2d 20 28  Free = nFree - (
aaa0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
aab0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 0a 23  Page->nCell);..#
aac0: 69 66 20 30 0a 20 20 2f 2a 20 43 68 65 63 6b 20  if 0.  /* Check 
aad0: 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6f 66 66  that all the off
aae0: 73 65 74 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  sets in the cell
aaf0: 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 61 72   offset array ar
ab00: 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20  e within range. 
ab10: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 6d 69 74  .  ** .  ** Omit
ab20: 74 69 6e 67 20 74 68 69 73 20 63 6f 6e 73 69 73  ting this consis
ab30: 74 65 6e 63 79 20 63 68 65 63 6b 20 61 6e 64 20  tency check and 
ab40: 75 73 69 6e 67 20 74 68 65 20 70 50 61 67 65 2d  using the pPage-
ab50: 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73 6b 0a 20  >maskPage mask. 
ab60: 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 6f   ** to prevent o
ab70: 76 65 72 72 75 6e 6e 69 6e 67 20 74 68 65 20 70  verrunning the p
ab80: 61 67 65 20 62 75 66 66 65 72 20 69 6e 20 66 69  age buffer in fi
ab90: 6e 64 43 65 6c 6c 28 29 20 72 65 73 75 6c 74 73  ndCell() results
aba0: 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e 35 25 20   in a.  ** 2.5% 
abb0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 67 61 69 6e  performance gain
abc0: 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75  ..  */.  {.    u
abd0: 38 20 2a 70 4f 66 66 3b 20 20 20 20 20 20 20 20  8 *pOff;        
abe0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
abf0: 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20 63 65   to check all ce
ac00: 6c 6c 20 6f 66 66 73 65 74 73 20 61 72 65 20 69  ll offsets are i
ac10: 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 75  n range */.    u
ac20: 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *pEnd;        
ac30: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e  /* Pointer to en
ac40: 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74  d of cell offset
ac50: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 75 38   array */.    u8
ac60: 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f   mask;         /
ac70: 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74  * Mask of bits t
ac80: 68 61 74 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  hat must be zero
ac90: 20 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c 6c 20   in MSB of cell 
aca0: 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20 20 20 6d  offsets */.    m
acb0: 61 73 6b 20 3d 20 7e 28 28 28 75 38 29 28 70 42  ask = ~(((u8)(pB
acc0: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 29  t->pageSize>>8))
acd0: 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20  -1);.    pEnd = 
ace0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
acf0: 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2a   + pPage->nCell*
ad00: 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4f 66 66  2];.    for(pOff
ad10: 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  =&data[cellOffse
ad20: 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e 64 20 26  t]; pOff!=pEnd &
ad30: 26 20 21 28 28 2a 70 4f 66 66 29 26 6d 61 73 6b  & !((*pOff)&mask
ad40: 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a 20 20 20  ); pOff+=2);.   
ad50: 20 69 66 28 20 70 4f 66 66 21 3d 70 45 6e 64 20   if( pOff!=pEnd 
ad60: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
ad70: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
ad80: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  KPT;.    }.  }.#
ad90: 65 6e 64 69 66 0a 0a 20 20 20 20 70 50 61 67 65  endif..    pPage
ada0: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
adb0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
adc0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
add0: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
ade0: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
adf0: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
ae00: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
ae10: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
ae20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
ae30: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
ae40: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
ae50: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
ae60: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
ae70: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
ae80: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
ae90: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
aea0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
aeb0: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
aec0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
aed0: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
aee0: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
aef0: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
af00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
af10: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
af20: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
af30: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
af40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
af50: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
af60: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
af70: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
af80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
af90: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
afa0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
afb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
afc0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
afd0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
afe0: 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68  /*memset(&data[h
aff0: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
b000: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 2a  bleSize - hdr);*
b010: 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  /.  data[hdr] = 
b020: 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66  (char)flags;.  f
b030: 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  irst = hdr + 8 +
b040: 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   4*((flags&PTF_L
b050: 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20  EAF)==0 ?1:0);. 
b060: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
b070: 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
b080: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
b090: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
b0a0: 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
b0b0: 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
b0c0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d  ge->nFree = pBt-
b0d0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
b0e0: 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  rst;.  decodeFla
b0f0: 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
b100: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
b110: 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50  fset = hdr;.  pP
b120: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
b130: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
b140: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
b150: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
b160: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
b170: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
b180: 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67 65  32768 );.  pPage
b190: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74  ->maskPage = pBt
b1a0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a  ->pageSize - 1;.
b1b0: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
b1c0: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
b1d0: 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
b1e0: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
b1f0: 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
b200: 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
b210: 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
b220: 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
b230: 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
b240: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
b250: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
b260: 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
b270: 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
b280: 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
b290: 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
b2a0: 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
b2b0: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
b2c0: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
b2d0: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
b2e0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
b2f0: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
b300: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
b310: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
b320: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
b330: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
b340: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
b350: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
b360: 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75   100 : 0;.  retu
b370: 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
b380: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
b390: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
b3a0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
b3b0: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
b3c0: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
b3d0: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
b3e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
b3f0: 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
b400: 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
b410: 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
b420: 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
b430: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
b440: 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
b450: 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
b460: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
b470: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
b480: 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
b490: 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
b4a0: 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
b4b0: 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
b4c0: 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
b4d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
b4e0: 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
b4f0: 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
b500: 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
b510: 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
b520: 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
b530: 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
b540: 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
b550: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
b560: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
b570: 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
b580: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
b590: 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
b5a0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
b5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b5c0: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
b5d0: 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
b5e0: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
b5f0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
b600: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
b610: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
b620: 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
b630: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64    /* Do not load
b640: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66   page content if
b650: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
b660: 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
b670: 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
b680: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b690: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
b6a0: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
b6b0: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
b6c0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
b6d0: 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
b6e0: 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  DbPage, noConten
b6f0: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
b700: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
b710: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
b720: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
b730: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
b740: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b750: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
b760: 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
b770: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
b780: 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
b790: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
b7a0: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
b7b0: 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
b7c0: 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
b7d0: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
b7e0: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
b7f0: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
b800: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
b810: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
b820: 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
b830: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
b840: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
b850: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
b860: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b870: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
b880: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
b890: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
b8a0: 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
b8b0: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
b8c0: 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
b8d0: 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
b8e0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
b8f0: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
b900: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
b910: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
b920: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
b930: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b940: 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
b950: 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
b960: 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
b970: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
b980: 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
b990: 63 20 50 67 6e 6f 20 70 61 67 65 72 50 61 67 65  c Pgno pagerPage
b9a0: 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
b9b0: 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  pBt){.  int nPag
b9c0: 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63  e = -1;.  int rc
b9d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
b9e0: 3e 70 50 61 67 65 31 20 29 3b 0a 20 20 72 63 20  >pPage1 );.  rc 
b9f0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
ba00: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
ba10: 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
ba20: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
ba30: 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d 3d  TE_OK || nPage==
ba40: 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  -1 );.  return (
ba50: 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a 2f  Pgno)nPage;.}../
ba60: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
ba70: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
ba80: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
ba90: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
baa0: 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e  ** is just a con
bab0: 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72  venience wrapper
bac0: 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65   around separate
bad0: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
bae0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
baf0: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74  () and sqlite3Bt
bb00: 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
bb10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
bb20: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
bb30: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
bb40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
bb50: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
bb60: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
bb70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bb80: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
bb90: 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
bba0: 2a 2a 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20  **ppPage     /* 
bbb0: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
bbc0: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29  ointer here */.)
bbd0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
bbe0: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
bbf0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
bc00: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
bc10: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
bc20: 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
bc30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bc40: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d  RRUPT_BKPT; .  }
bc50: 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6f 66 74  ..  /* It is oft
bc60: 65 6e 20 74 68 65 20 63 61 73 65 20 74 68 61 74  en the case that
bc70: 20 74 68 65 20 70 61 67 65 20 77 65 20 77 61 6e   the page we wan
bc80: 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
bc90: 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49 66 20 73  cache..  ** If s
bca0: 6f 2c 20 67 65 74 20 69 74 20 64 69 72 65 63 74  o, get it direct
bcb0: 6c 79 2e 20 20 54 68 69 73 20 73 61 76 65 73 20  ly.  This saves 
bcc0: 75 73 20 66 72 6f 6d 20 68 61 76 69 6e 67 20 74  us from having t
bcd0: 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70 61 67 65  o call.  ** page
bce0: 72 50 61 67 65 63 6f 75 6e 74 28 29 20 74 6f 20  rPagecount() to 
bcf0: 6d 61 6b 65 20 73 75 72 65 20 70 67 6e 6f 20 69  make sure pgno i
bd00: 73 20 77 69 74 68 69 6e 20 6c 69 6d 69 74 73 2c  s within limits,
bd10: 20 77 68 69 63 68 20 72 65 73 75 6c 74 73 0a 20   which results. 
bd20: 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73 75 72 65   ** in a measure
bd30: 61 62 6c 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  able performance
bd40: 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73 2e 0a 20   improvements.. 
bd50: 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   */.  *ppPage = 
bd60: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
bd70: 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 70 67 6e  eLookup(pBt, pgn
bd80: 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 20  o);.  if( pPage 
bd90: 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65 20 69  ){.    /* Page i
bda0: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  s already in cac
bdb0: 68 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  he */.    rc = S
bdc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
bdd0: 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65 20 6e  e{.    /* Page n
bde0: 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 20 41 63  ot in cache.  Ac
bdf0: 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20  quire it. */.   
be00: 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50   if( pgno>pagerP
be10: 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
be20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
be30: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
be40: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  T; .    }.    rc
be50: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
be60: 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
be70: 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , ppPage, 0);.  
be80: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
be90: 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 20  n rc;.    pPage 
bea0: 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 7d 0a 20  = *ppPage;.  }. 
beb0: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49   if( !pPage->isI
bec0: 6e 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nit ){.    rc = 
bed0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
bee0: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
bef0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
bf00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65  E_OK ){.    rele
bf10: 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
bf20: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
bf30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bf40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
bf50: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
bf60: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
bf70: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
bf80: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
bf90: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
bfa0: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
bfb0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
bfc0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
bfd0: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
bfe0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bff0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
c000: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
c010: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
c020: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3e  pPage->pDbPage)>
c030: 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
c040: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
c050: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
c060: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61  ge->pBt );.    a
c070: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
c080: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
c090: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
c0a0: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
c0b0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
c0c0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
c0d0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
c0e0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
c0f0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
c100: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
c110: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
c120: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
c130: 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
c140: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
c150: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  }../*.** During 
c160: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
c170: 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
c180: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
c190: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
c1a0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
c1b0: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
c1c0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
c1d0: 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
c1e0: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
c1f0: 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
c200: 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
c210: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
c220: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
c230: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
c240: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
c250: 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
c260: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
c270: 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
c280: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
c290: 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
c2a0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
c2b0: 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
c2c0: 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
c2d0: 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
c2e0: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
c2f0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c300: 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
c310: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
c320: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
c330: 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
c340: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
c350: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
c360: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
c370: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
c380: 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
c390: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
c3a0: 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
c3b0: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
c3c0: 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
c3d0: 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
c3e0: 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
c3f0: 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
c400: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
c410: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
c420: 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
c430: 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
c440: 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
c450: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
c460: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
c470: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  BtreeInitPage() 
c480: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
c490: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c4a0: 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
c4b0: 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
c4c0: 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
c4d0: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
c4e0: 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
c4f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
c500: 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65  tPage() be calle
c510: 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  d on every btree
c520: 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65   page so we make
c530: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61  .      ** the ca
c540: 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67  ll for every pag
c550: 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20  e that comes in 
c560: 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20  for re-initing. 
c570: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
c580: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
c590: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
c5a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
c5b0: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
c5c0: 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
c5d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
c5e0: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
c5f0: 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  er(void *pArg){.
c600: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
c610: 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
c620: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
c630: 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
c640: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
c650: 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
c660: 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
c670: 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
c680: 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
c690: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29  db->busyHandler)
c6a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
c6b0: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
c6c0: 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .** .** zFilenam
c6d0: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
c6e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c6f0: 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d  le.  If zFilenam
c700: 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e  e is NULL.** a n
c710: 65 77 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ew database with
c720: 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69   a random name i
c730: 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 69 73  s created.  This
c740: 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a   randomly named.
c750: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
c760: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
c770: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
c780: 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
c790: 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  led..** If zFile
c7a0: 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
c7b0: 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65  :" then an in-me
c7c0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73  mory database is
c7d0: 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74   created.** that
c7e0: 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
c7f0: 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e  y destroyed when
c800: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
c810: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
c820: 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
c830: 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61  opened in the sa
c840: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
c850: 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65  ection.** and we
c860: 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63   are in shared c
c870: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20  ache mode, then 
c880: 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61  the open will fa
c890: 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  il with an.** SQ
c8a0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
c8b0: 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f  error.  We canno
c8c0: 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d  t allow two or m
c8d0: 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20  ore BtShared.** 
c8e0: 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
c8f0: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
c900: 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f  nection since do
c910: 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64  ing so will lead
c920: 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20  .** to problems 
c930: 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  with locking..*/
c940: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
c950: 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  eOpen(.  const c
c960: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
c970: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
c980: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
c990: 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61  the BTree databa
c9a0: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  se */.  sqlite3 
c9b0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
c9c0: 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61  /* Associated da
c9d0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
c9e0: 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72  .  Btree **ppBtr
c9f0: 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ee,        /* Po
ca00: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72  inter to new Btr
ca10: 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65  ee object writte
ca20: 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
ca30: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
ca40: 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a      /* Options *
ca50: 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ca70: 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
ca80: 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
ca90: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
caa0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
cab0: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20  pVfs;           
cac0: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74 6f 20    /* The VFS to 
cad0: 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 74 72  use for this btr
cae0: 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ee */.  BtShared
caf0: 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20   *pBt = 0;      
cb00: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
cb10: 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
cb20: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
cb30: 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb50: 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  Handle to return
cb60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
cb70: 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d  tex *mutexOpen =
cb80: 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73   0;  /* Prevents
cb90: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
cba0: 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20  n. Ticket #3537 
cbb0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
cbc0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
cbd0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
cbe0: 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  de from this fun
cbf0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52  ction */.  u8 nR
cc00: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
cc10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
cc20: 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  e of unused spac
cc30: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
cc40: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
cc50: 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d  r zDbHeader[100]
cc60: 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68  ;  /* Database h
cc70: 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f  eader content */
cc80: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
cc90: 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
cca0: 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
ccb0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
ccc0: 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
ccd0: 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
cce0: 65 64 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ed database. Thi
ccf0: 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79  s symbol is only
cd00: 20 72 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a   required if.  *
cd10: 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  * either of the 
cd20: 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61  shared-data or a
cd30: 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72  utovacuum featur
cd40: 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20  es are compiled 
cd50: 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
cd60: 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66  ibrary..  */.#if
cd70: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
cd80: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
cd90: 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  HE) || !defined(
cda0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
cdb0: 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66  VACUUM).  #ifdef
cdc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
cdd0: 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20  ORYDB.    const 
cde0: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
cdf0: 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e  .  #else.    con
ce00: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
ce10: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73   zFilename && !s
ce20: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
ce30: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20   ":memory:");.  
ce40: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
ce50: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
ce60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
ce70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
ce80: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
ce90: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
cea0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
ceb0: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
cec0: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
ced0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
cee0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
cef0: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
cf00: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
cf10: 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64  ->db = db;.#ifnd
cf20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
cf30: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d  HARED_CACHE.  p-
cf40: 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70  >lock.pBtree = p
cf50: 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62  ;.  p->lock.iTab
cf60: 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  le = 1;.#endif..
cf70: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
cf80: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
cf90: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
cfa0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
cfb0: 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a  ISKIO).  /*.  **
cfc0: 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69   If this Btree i
cfd0: 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
cfe0: 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20  r shared cache, 
cff0: 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20  try to find an. 
d000: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53   ** existing BtS
d010: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61  hared object tha
d020: 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77  t we can share w
d030: 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ith.  */.  if( i
d040: 73 4d 65 6d 64 62 3d 3d 30 20 26 26 20 7a 46 69  sMemdb==0 && zFi
d050: 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
d060: 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66  ame[0] ){.    if
d070: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
d080: 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
d090: 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  eEnabled ){.    
d0a0: 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e    int nFullPathn
d0b0: 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
d0c0: 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20  thname+1;.      
d0d0: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
d0e0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
d0f0: 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  loc(nFullPathnam
d100: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
d110: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
d120: 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73  ared;.      p->s
d130: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
d140: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
d150: 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61 63  SQLITE_SharedCac
d160: 68 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  he;.      if( !z
d170: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
d180: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
d190: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
d1a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
d1b0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
d1c0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c      sqlite3OsFul
d1d0: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
d1e0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c  zFilename, nFull
d1f0: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
d200: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
d210: 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69  mutexOpen = sqli
d220: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
d230: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
d240: 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73  C_OPEN);.      s
d250: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
d260: 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  er(mutexOpen);. 
d270: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
d280: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
d290: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
d2a0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
d2b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
d2c0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
d2d0: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
d2e0: 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
d2f0: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
d300: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
d310: 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
d320: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
d330: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
d340: 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
d350: 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
d360: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
d370: 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
d380: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20  (pBt->pPager)). 
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
d3b0: 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
d3c0: 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
d3d0: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
d3e0: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
d3f0: 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
d400: 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
d410: 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
d420: 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
d430: 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
d440: 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
d450: 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
d460: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
d470: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d480: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
d490: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d4b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
d4c0: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
d4d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d4e0: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
d4f0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
d500: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
d510: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
d520: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d530: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
d540: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d550: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d560: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
d570: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
d580: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
d590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
d5a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
d5b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
d5c0: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
d5d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
d5e0: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
d5f0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
d600: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
d610: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
d620: 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
d630: 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
d640: 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
d650: 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
d660: 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
d670: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
d680: 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
d690: 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
d6a0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
d6b0: 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
d6c0: 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
d6d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d6e0: 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
d6f0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
d700: 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
d710: 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
d720: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
d730: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
d740: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
d750: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
d760: 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
d770: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
d780: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
d790: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
d7a0: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
d7b0: 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
d7c0: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
d7d0: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
d7e0: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
d7f0: 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
d800: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
d810: 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
d820: 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
d830: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
d840: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
d850: 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
d860: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d870: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
d880: 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
d890: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d8a0: 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
d8b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
d8c0: 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
d8d0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
d8e0: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
d8f0: 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
d900: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
d910: 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
d920: 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
d930: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
d940: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
d950: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
d960: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
d970: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
d980: 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
d990: 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
d9a0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
d9c0: 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  TRA_SIZE, flags,
d9d0: 20 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20   vfsFlags);.    
d9e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d9f0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
da00: 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
da10: 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e  Fileheader(pBt->
da20: 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44  pPager,sizeof(zD
da30: 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64  bHeader),zDbHead
da40: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  er);.    }.    i
da50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
da60: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
da70: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
da80: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 64 62     }.    pBt->db
da90: 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74   = db;.    sqlit
daa0: 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
dab0: 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65  ndler(pBt->pPage
dac0: 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  r, btreeInvokeBu
dad0: 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b  syHandler, pBt);
dae0: 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42  .    p->pBt = pB
daf0: 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65  t;.  .    sqlite
db00: 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65  3PagerSetReinite
db10: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  r(pBt->pPager, p
db20: 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20  ageReinit);.    
db30: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
db40: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
db50: 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  1 = 0;.    pBt->
db60: 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74  readOnly = sqlit
db70: 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
db80: 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  y(pBt->pPager);.
db90: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
dba0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44  e = get2byte(&zD
dbb0: 62 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20  bHeader[16]);.  
dbc0: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
dbd0: 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e  ize<512 || pBt->
dbe0: 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
dbf0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20  MAX_PAGE_SIZE.  
dc00: 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
dc10: 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
dc20: 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
dc30: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  {.      pBt->pag
dc40: 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eSize = 0;.#ifnd
dc50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
dc60: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
dc70: 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
dc80: 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
dc90: 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
dca0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
dcb0: 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
dcc0: 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
dcd0: 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
dce0: 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
dcf0: 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
dd00: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
dd10: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
dd20: 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
dd30: 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
dd40: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
dd50: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
dd60: 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
dd70: 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
dd80: 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
dd90: 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
dda0: 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
ddb0: 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
ddc0: 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
ddd0: 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
dde0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
ddf0: 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
de00: 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
de10: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
de20: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
de30: 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
de40: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
de50: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
de60: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
de70: 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
de80: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
de90: 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
dea0: 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
deb0: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65  lse{.      nRese
dec0: 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
ded0: 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
dee0: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
def0: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
df00: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
df10: 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
df20: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
df30: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
df40: 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
df50: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
df60: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
df70: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
df80: 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
df90: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
dfa0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
dfb0: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
dfc0: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
dfd0: 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
dfe0: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
dff0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
e000: 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
e010: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
e020: 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
e030: 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
e040: 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
e050: 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
e060: 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
e070: 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
e080: 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
e090: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
e0a0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
e0b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
e0c0: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
e0d0: 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
e0e0: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
e0f0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
e100: 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
e110: 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
e120: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
e130: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e140: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
e150: 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  red;.      pBt->
e160: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
e170: 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
e180: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
e190: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
e1a0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
e1b0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
e1c0: 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
e1d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
e1e0: 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
e1f0: 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
e200: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
e210: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
e220: 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
e230: 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
e240: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
e250: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
e260: 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  M;.          db-
e270: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
e280: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  0;.          got
e290: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
e2a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e2b0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
e2c0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
e2d0: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
e2e0: 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
e2f0: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
e300: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
e310: 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
e320: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
e330: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
e340: 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
e350: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
e360: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
e370: 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
e380: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
e390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e3a0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
e3b0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
e3c0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
e3d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
e3e0: 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
e3f0: 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
e400: 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
e410: 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
e420: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
e430: 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
e440: 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
e450: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
e460: 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
e470: 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
e480: 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
e490: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
e4a0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
e4b0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
e4c0: 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
e4d0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
e4e0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
e4f0: 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
e500: 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
e510: 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
e520: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
e530: 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
e540: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
e550: 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
e560: 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
e570: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
e580: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
e590: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
e5a0: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
e5b0: 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
e5c0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
e5d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
e5e0: 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
e5f0: 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
e600: 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
e610: 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
e620: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
e630: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e640: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
e650: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
e660: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
e670: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
e680: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
e690: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
e6a0: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
e6b0: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
e6c0: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
e6d0: 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
e6e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
e6f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
e700: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
e710: 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
e720: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
e730: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e740: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
e750: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
e760: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
e770: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
e780: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
e790: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e7a0: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
e7b0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
e7c0: 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  pBtree = 0;.  }.
e7d0: 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20    if( mutexOpen 
e7e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
e7f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e800: 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a  d(mutexOpen) );.
e810: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
e820: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
e830: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
e840: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
e850: 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
e860: 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
e870: 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
e880: 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
e890: 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
e8a0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
e8b0: 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
e8c0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
e8d0: 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
e8e0: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
e8f0: 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
e900: 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
e910: 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
e920: 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
e930: 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
e940: 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
e950: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
e960: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e970: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
e980: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
e990: 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72  Master;.  BtShar
e9a0: 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  ed *pList;.  int
e9b0: 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20   removed = 0;.. 
e9c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e9d0: 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70  _mutex_notheld(p
e9e0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
e9f0: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
ea00: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
ea10: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
ea20: 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74  MASTER);.  sqlit
ea30: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
ea40: 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
ea50: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
ea60: 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
ea70: 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53    if( GLOBAL(BtS
ea80: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
ea90: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d  aredCacheList)==
eaa0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f  pBt ){.      GLO
eab0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
eac0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
ead0: 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65  List) = pBt->pNe
eae0: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
eaf0: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f       pList = GLO
eb00: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
eb10: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
eb20: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
eb30: 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  le( ALWAYS(pList
eb40: 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  ) && pList->pNex
eb50: 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t!=pBt ){.      
eb60: 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70    pList=pList->p
eb70: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
eb80: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
eb90: 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
eba0: 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pList->pNext = 
ebb0: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
ebc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
ebd0: 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
ebe0: 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  AFE ){.      sql
ebf0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
ec00: 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
ec10: 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d   }.    removed =
ec20: 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
ec30: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
ec40: 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
ec50: 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a   removed;.#else.
ec60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
ec70: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
ec80: 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
ec90: 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
eca0: 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
ecb0: 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
ecc0: 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a  (pBt) bytes..*/.
ecd0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f  static void allo
ece0: 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74  cateTempSpace(Bt
ecf0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
ed00: 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70  if( !pBt->pTmpSp
ed10: 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
ed20: 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
ed30: 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70  te3PageMalloc( p
ed40: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
ed50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
ed60: 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
ed70: 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
ed80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
ed90: 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
eda0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
edb0: 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20  qlite3PageFree( 
edc0: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
edd0: 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  .  pBt->pTmpSpac
ede0: 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
edf0: 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
ee00: 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
ee10: 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
ee20: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
ee30: 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
ee40: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
ee50: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
ee60: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
ee70: 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
ee80: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
ee90: 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
eea0: 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
eeb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
eec0: 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
eed0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
eee0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
eef0: 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
ef00: 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
ef10: 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
ef20: 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
ef30: 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
ef40: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
ef50: 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
ef60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ef70: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
ef80: 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
ef90: 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
efa0: 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
efb0: 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
efc0: 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
efd0: 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
efe0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
eff0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
f000: 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
f010: 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
f020: 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
f030: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
f040: 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20  eeRollback(p);. 
f050: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
f060: 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ve(p);..  /* If 
f070: 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  there are still 
f080: 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e  other outstandin
f090: 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
f0a0: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
f0b0: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  .  ** structure,
f0c0: 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65   return now. The
f0d0: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
f0e0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
f0f0: 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ans .  ** up the
f100: 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20   shared-btree.. 
f110: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
f120: 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26  >wantToLock==0 &
f130: 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  & p->locked==0 )
f140: 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72  ;.  if( !p->shar
f150: 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72  able || removeFr
f160: 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42  omSharingList(pB
f170: 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  t) ){.    /* The
f180: 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   pBt is no longe
f190: 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67  r on the sharing
f1a0: 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e   list, so we can
f1b0: 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69   access.    ** i
f1c0: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
f1d0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
f1e0: 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
f1f0: 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20  * Clean out and 
f200: 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61  delete the BtSha
f210: 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20  red object..    
f220: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
f230: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
f240: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
f250: 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
f260: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  r);.    if( pBt-
f270: 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20  >xFreeSchema && 
f280: 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
f290: 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65        pBt->xFree
f2a0: 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68  Schema(pBt->pSch
f2b0: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
f2c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
f2d0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
f2e0: 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
f2f0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
f300: 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  free(pBt);.  }..
f310: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f320: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
f330: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
f340: 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  ntToLock==0 );. 
f350: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
f360: 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed==0 );.  if( p
f370: 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72  ->pPrev ) p->pPr
f380: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
f390: 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  Next;.  if( p->p
f3a0: 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d  Next ) p->pNext-
f3b0: 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
f3c0: 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  v;.#endif..  sql
f3d0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
f3e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f3f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
f400: 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74  e the limit on t
f410: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
f420: 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68  es allowed in th
f430: 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
f440: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
f450: 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73  r of cache pages
f460: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61   is set to the a
f470: 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65  bsolute.** value
f480: 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20   of mxPage.  If 
f490: 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  mxPage is negati
f4a0: 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69  ve, the pager wi
f4b0: 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73  ll.** operate as
f4c0: 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69  ynchronously - i
f4d0: 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20  t will not stop 
f4e0: 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a  to do fsync()s.*
f4f0: 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61  * to insure data
f500: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
f510: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20  he disk surface 
f520: 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e  before.** contin
f530: 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69  uing.  Transacti
f540: 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69  ons still work i
f550: 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  f synchronous is
f560: 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65   off,.** and the
f570: 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
f580: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66   be corrupted if
f590: 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a   this program.**
f5a0: 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69   crashes.  But i
f5b0: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
f5c0: 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f  system crashes o
f5d0: 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  r there is.** an
f5e0: 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61   abrupt power fa
f5f0: 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68  ilure when synch
f600: 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74  ronous is off, t
f610: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
f620: 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20  ould be left in 
f630: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
f640: 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c  and unrecoverabl
f650: 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63  e state..** Sync
f660: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79  hronous is on by
f670: 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61   default so data
f680: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
f690: 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c  is not.** normal
f6a0: 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69  ly a worry..*/.i
f6b0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
f6c0: 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
f6d0: 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
f6e0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
f6f0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
f700: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
f710: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
f720: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
f730: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
f740: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
f750: 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
f760: 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
f770: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
f780: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
f790: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f7a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
f7b0: 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
f7c0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
f7d0: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
f7e0: 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
f7f0: 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
f800: 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
f810: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
f820: 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
f830: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
f840: 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
f850: 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
f860: 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
f870: 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
f880: 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
f890: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
f8a0: 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
f8b0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
f8c0: 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
f8d0: 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
f8e0: 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
f8f0: 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
f900: 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
f910: 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
f920: 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
f930: 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
f940: 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
f950: 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
f960: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f970: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
f980: 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
f990: 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65  reeSetSafetyLeve
f9a0: 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  l(Btree *p, int 
f9b0: 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53  level, int fullS
f9c0: 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ync){.  BtShared
f9d0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
f9e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f9f0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
fa00: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
fa10: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
fa20: 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
fa30: 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
fa40: 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  el(pBt->pPager, 
fa50: 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29  level, fullSync)
fa60: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
fa70: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
fa80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fa90: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
faa0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
fab0: 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20   given btree is 
fac0: 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65  set to safety le
fad0: 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72  vel 1.  In other
fae0: 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72  .** words, retur
faf0: 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e  n TRUE if no syn
fb00: 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  c() occurs on th
fb10: 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f  e disk files..*/
fb20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
fb30: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74  eSyncDisabled(Bt
fb40: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
fb50: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
fb60: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  t;.  int rc;.  a
fb70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
fb80: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
fb90: 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73  >mutex) );  .  s
fba0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
fbb0: 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
fbc0: 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
fbd0: 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  r );.  rc = sqli
fbe0: 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70  te3PagerNosync(p
fbf0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73  Bt->pPager);.  s
fc00: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
fc10: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
fc20: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
fc30: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
fc40: 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
fc50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
fc60: 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a  OMIT_VACUUM)./*.
fc70: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
fc80: 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
fc90: 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
fca0: 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
fcb0: 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f  s per page..** O
fcc0: 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  r, if the page s
fcd0: 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ize has already 
fce0: 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75  been fixed, retu
fcf0: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
fd00: 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63  LY .** without c
fd10: 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67  hanging anything
fd20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
fd30: 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20   size must be a 
fd40: 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65  power of 2 betwe
fd50: 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36  en 512 and 65536
fd60: 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a  .  If the page.*
fd70: 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20  * size supplied 
fd80: 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68  does not meet th
fd90: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68  is constraint th
fda0: 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  en the page size
fdb0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67   is not.** chang
fdc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73  ed..**.** Page s
fdd0: 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61  izes are constra
fde0: 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77  ined to be a pow
fdf0: 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61  er of two so tha
fe00: 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20  t the region.** 
fe10: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
fe20: 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  file used for lo
fe30: 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67  cking (beginning
fe40: 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   at PENDING_BYTE
fe50: 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62  ,.** the first b
fe60: 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42  yte past the 1GB
fe70: 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30   boundary, 0x400
fe80: 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20  00000) needs to 
fe90: 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20  occur.** at the 
fea0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70  beginning of a p
feb0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  age..**.** If pa
fec0: 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65  rameter nReserve
fed0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
fee0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ro, then the num
fef0: 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a  ber of reserved.
ff00: 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ** bytes per pag
ff10: 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  e is left unchan
ff20: 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ged..**.** If th
ff30: 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74  e iFix!=0 then t
ff40: 68 65 20 70 61 67 65 53 69 7a 65 46 69 78 65 64  he pageSizeFixed
ff50: 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20   flag is set so 
ff60: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69  that the page si
ff70: 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61  ze.** and autova
ff80: 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f  cuum mode can no
ff90: 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67   longer be chang
ffa0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
ffb0: 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
ffc0: 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
ffd0: 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e   pageSize, int n
ffe0: 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69  Reserve, int iFi
fff0: 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  x){.  int rc = S
10000 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68  QLITE_OK;.  BtSh
10010 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
10020 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52  Bt;.  assert( nR
10030 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52  eserve>=-1 && nR
10040 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
10050 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
10060 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74  er(p);.  if( pBt
10070 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
10080 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
10090 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
100a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
100b0 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
100c0 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b  f( nReserve<0 ){
100d0 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20  .    nReserve = 
100e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
100f0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
10100 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
10110 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
10120 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
10130 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
10140 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
10150 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
10160 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
10170 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
10180 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
10190 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
101a0 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
101b0 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
101c0 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d  >pPage1 && !pBt-
101d0 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
101e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
101f0 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u16)pageSize;. 
10200 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
10210 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  (pBt);.  }.  rc 
10220 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
10230 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
10240 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
10250 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
10260 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  ;.  pBt->usableS
10270 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
10280 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65  ize - (u16)nRese
10290 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20  rve;.  if( iFix 
102a0 29 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ) pBt->pageSizeF
102b0 69 78 65 64 20 3d 20 31 3b 0a 20 20 73 71 6c 69  ixed = 1;.  sqli
102c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
102d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
102e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
102f0 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
10300 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
10310 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
10320 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
10330 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
10340 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
10350 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ze;.}../*.** Ret
10360 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
10370 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
10380 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
10390 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a  very page that.*
103a0 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c  * are intentuall
103b0 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20  y left unused.  
103c0 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73  This is the "res
103d0 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61  erved" space tha
103e0 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65  t is.** sometime
103f0 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73  s used by extens
10400 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ions..*/.int sql
10410 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
10420 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
10430 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
10440 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
10450 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61    n = p->pBt->pa
10460 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
10470 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73  >usableSize;.  s
10480 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
10490 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
104a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
104b0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
104c0 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62  ount for a datab
104d0 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ase if mxPage is
104e0 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f   positive..** No
104f0 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
10500 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30  e if mxPage is 0
10510 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   or negative..**
10520 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
10530 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  he value of mxPa
10540 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d  ge, return the m
10550 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
10560 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
10570 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75  3BtreeMaxPageCou
10580 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
10590 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
105a0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
105b0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
105c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
105d0 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74  PageCount(p->pBt
105e0 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
105f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
10600 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
10610 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn n;.}.#endif 
10620 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
10630 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
10640 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
10650 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
10660 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ACUUM) */../*.**
10670 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
10680 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
10690 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
106a0 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
106b0 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
106c0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
106d0 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
106e0 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
106f0 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
10700 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
10710 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
10720 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
10730 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
10740 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
10750 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
10760 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
10770 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
10780 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
10790 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
107a0 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
107b0 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
107c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
107d0 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
107e0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
107f0 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
10800 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
10810 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10820 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
10830 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
10840 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
10850 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r(p);.  if( pBt-
10860 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 26  >pageSizeFixed &
10870 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74  & (av ?1:0)!=pBt
10880 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
10890 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
108a0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73  READONLY;.  }els
108b0 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  e{.    pBt->auto
108c0 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30  Vacuum = av ?1:0
108d0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
108e0 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31  acuum = av==2 ?1
108f0 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  :0;.  }.  sqlite
10900 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
10910 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
10920 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
10930 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
10940 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
10950 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20  m' property. If 
10960 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a  auto-vacuum is .
10970 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20  ** enabled 1 is 
10980 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
10990 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ise 0..*/.int sq
109a0 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74  lite3BtreeGetAut
109b0 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
109c0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
109d0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
109e0 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f  .  return BTREE_
109f0 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b  AUTOVACUUM_NONE;
10a00 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
10a10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
10a20 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
10a30 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  (.    (!p->pBt->
10a40 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45  autoVacuum)?BTRE
10a50 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
10a60 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d  E:.    (!p->pBt-
10a70 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52  >incrVacuum)?BTR
10a80 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55  EE_AUTOVACUUM_FU
10a90 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55  LL:.    BTREE_AU
10aa0 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20  TOVACUUM_INCR.  
10ab0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
10ac0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
10ad0 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
10ae0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72  .../*.** Get a r
10af0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67  eference to pPag
10b00 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  e1 of the databa
10b10 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77  se file.  This w
10b20 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75  ill.** also acqu
10b30 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f  ire a readlock o
10b40 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a  n that file..**.
10b50 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
10b60 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
10b70 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c  ess.  If the fil
10b80 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65  e is not a.** we
10b90 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
10ba0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51  se file, then SQ
10bb0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20  LITE_CORRUPT is 
10bc0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c  returned..** SQL
10bd0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
10be0 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61  rned if the data
10bf0 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20  base is locked. 
10c00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
10c10 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
10c20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65  we run out of me
10c30 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  mory. .*/.static
10c40 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42   int lockBtree(B
10c50 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
10c60 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
10c70 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
10c80 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  t nPage;..  asse
10c90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10ca0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
10cb0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
10cc0 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
10cd0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
10ce0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
10cf0 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
10d00 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
10d10 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
10d20 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
10d30 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
10d40 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
10d50 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
10d60 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
10d70 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
10d80 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  . .  */.  rc = s
10d90 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
10da0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
10db0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  , &nPage);.  if(
10dc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10dd0 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31  {.    goto page1
10de0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
10df0 7d 65 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3e  }else if( nPage>
10e00 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 61 67  0 ){.    int pag
10e10 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75  eSize;.    int u
10e20 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75  sableSize;.    u
10e30 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
10e40 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
10e50 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
10e60 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  ;.    if( memcmp
10e70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
10e80 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
10e90 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
10ea0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
10eb0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
10ec0 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[18]>1 ){.     
10ed0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
10ee0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
10ef0 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
10f00 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
10f10 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
10f20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
10f30 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65   maximum embedde
10f40 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
10f50 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20  be exactly 25%. 
10f60 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d   And the minimum
10f70 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64  .    ** embedded
10f80 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
10f90 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68  e 12.5% for both
10fa0 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e   leaf-data and n
10fb0 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20  on-leaf-data..  
10fc0 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
10fd0 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
10fe0 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
10ff0 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
11000 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
11010 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
11020 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
11030 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
11040 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
11050 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
11060 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
11070 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
11080 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
11090 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
110a0 3d 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65  = get2byte(&page
110b0 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  1[16]);.    if( 
110c0 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
110d0 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61  geSize)!=0 || pa
110e0 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20  geSize<512 ||.  
110f0 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41        (SQLITE_MA
11100 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36  X_PAGE_SIZE<3276
11110 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51  8 && pageSize>SQ
11120 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
11130 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ZE).    ){.     
11140 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
11150 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
11160 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
11170 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
11180 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
11190 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
111a0 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  1[20];.    if( p
111b0 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61  ageSize!=pBt->pa
111c0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
111d0 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67  /* After reading
111e0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
111f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
11200 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20  assuming a page 
11210 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  size.      ** of
11220 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69   BtShared.pageSi
11230 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63  ze, we have disc
11240 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20  overed that the 
11250 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20  page-size is.   
11260 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70     ** actually p
11270 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20  ageSize. Unlock 
11280 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65  the database, le
11290 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
112a0 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  at.      ** zero
112b0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
112c0 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65  TE_OK. The calle
112d0 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73  r will call this
112e0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
112f0 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68  ** again with th
11300 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73  e correct page-s
11310 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
11320 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
11330 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70  pPage1);.      p
11340 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
11350 20 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65   (u16)usableSize
11360 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
11370 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67  eSize = (u16)pag
11380 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
11390 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
113a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
113b0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
113c0 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
113d0 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
113e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11400 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
11410 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
11420 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 70 61  if( rc ) goto pa
11430 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
11440 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
11450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
11460 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
11470 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67  e<480 ){.      g
11480 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
11490 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
114a0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
114b0 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
114c0 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
114d0 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c  ize = (u16)usabl
114e0 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
114f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
11500 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
11510 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
11520 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
11530 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
11540 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
11550 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
11560 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
11570 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
11580 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
11590 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
115a0 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
115b0 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
115c0 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
115d0 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
115e0 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
115f0 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
11600 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
11610 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
11620 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
11630 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
11640 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
11650 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
11660 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
11670 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
11680 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
11690 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
116a0 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
116b0 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
116c0 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
116d0 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
116e0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
116f0 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
11700 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
11710 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
11720 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
11730 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
11740 62 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68  byte poiner, a h
11750 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
11760 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
11770 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
11780 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
11790 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
117a0 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
117b0 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
117c0 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
117d0 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
117e0 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
117f0 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32  e-12)*64/255 - 2
11800 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  3;.  pBt->minLoc
11810 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  al = (pBt->usabl
11820 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
11830 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61   - 23;.  pBt->ma
11840 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73 61  xLeaf = pBt->usa
11850 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20  bleSize - 35;.  
11860 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28  pBt->minLeaf = (
11870 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
11880 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b  12)*32/255 - 23;
11890 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
118a0 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20  maxLeaf + 23 <= 
118b0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
118c0 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  ) );.  pBt->pPag
118d0 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72  e1 = pPage1;.  r
118e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
118f0 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  ..page1_init_fai
11900 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  led:.  releasePa
11910 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ge(pPage1);.  pB
11920 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
11930 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11940 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11950 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63  e works like loc
11960 6b 42 74 72 65 65 28 29 20 65 78 63 65 70 74 20  kBtree() except 
11970 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e 76  that it also inv
11980 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73 79  okes the.** busy
11990 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
119a0 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65  re is lock conte
119b0 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ntion..*/.static
119c0 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57 69   int lockBtreeWi
119d0 74 68 52 65 74 72 79 28 42 74 72 65 65 20 2a 70  thRetry(Btree *p
119e0 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Ref){.  int rc =
119f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
11a00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
11a10 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 52  reeHoldsMutex(pR
11a20 65 66 29 20 29 3b 0a 20 20 69 66 28 20 70 52 65  ef) );.  if( pRe
11a30 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  f->inTrans==TRAN
11a40 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38  S_NONE ){.    u8
11a50 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d   inTransaction =
11a60 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72   pRef->pBt->inTr
11a70 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62  ansaction;.    b
11a80 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52  treeIntegrity(pR
11a90 65 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ef);.    rc = sq
11aa0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
11ab0 72 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a 20  rans(pRef, 0);. 
11ac0 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e     pRef->pBt->in
11ad0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e  Transaction = in
11ae0 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20  Transaction;.   
11af0 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d   pRef->inTrans =
11b00 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
11b10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11b20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65 66  OK ){.      pRef
11b30 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ->pBt->nTransact
11b40 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ion--;.    }.   
11b50 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
11b60 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pRef);.  }.  ret
11b70 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20  urn rc;.}.      
11b80 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72   ../*.** If ther
11b90 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
11ba0 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
11bb0 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
11bc0 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
11bd0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
11be0 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
11bf0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
11c00 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
11c10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
11c20 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
11c30 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
11c40 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
11c50 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
11c60 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
11c70 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
11c80 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
11c90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
11ca0 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
11cb0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
11cc0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
11cd0 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
11ce0 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
11cf0 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
11d00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11d10 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
11d20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
11d30 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70  >pCursor==0 || p
11d40 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
11d50 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  n>TRANS_NONE );.
11d60 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
11d70 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
11d80 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61  NONE && pBt->pPa
11d90 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  ge1!=0 ){.    as
11da0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
11db0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
11dc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
11dd0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
11de0 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a  ->pPager)==1 );.
11df0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
11e00 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
11e10 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
11e20 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a  e(pBt->pPage1);.
11e30 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
11e40 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
11e50 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 64  * Create a new d
11e60 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
11e70 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
11e80 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  t page of the.**
11e90 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
11ea0 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
11eb0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
11ec0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
11ed0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
11ee0 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
11ef0 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a  ;.  int nPage;..
11f00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11f10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
11f20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
11f30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
11f40 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
11f50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
11f60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11f70 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b  OK || nPage>0 ){
11f80 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
11f90 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d    }.  pP1 = pBt-
11fa0 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72  >pPage1;.  asser
11fb0 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64  t( pP1!=0 );.  d
11fc0 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61  ata = pP1->aData
11fd0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
11fe0 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e  PagerWrite(pP1->
11ff0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
12000 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
12010 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a    memcpy(data, z
12020 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a  MagicHeader, siz
12030 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
12040 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69  ));.  assert( si
12050 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
12060 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32  r)==16 );.  put2
12070 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20  byte(&data[16], 
12080 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
12090 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
120a0 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
120b0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
120c0 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e  sableSize<=pBt->
120d0 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d  pageSize && pBt-
120e0 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e  >usableSize+255>
120f0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  =pBt->pageSize);
12100 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75  .  data[20] = (u
12110 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
12120 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
12130 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ze);.  data[21] 
12140 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
12150 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
12160 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
12170 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
12180 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
12190 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
121a0 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
121b0 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
121c0 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
121d0 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
121e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
121f0 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70  CUUM.  assert( p
12200 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
12210 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61  1 || pBt->autoVa
12220 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  cuum==0 );.  ass
12230 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61  ert( pBt->incrVa
12240 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
12250 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b  incrVacuum==0 );
12260 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
12270 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74  a[36 + 4*4], pBt
12280 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
12290 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
122a0 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 7*4], pBt->
122b0 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e  incrVacuum);.#en
122c0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
122d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
122e0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
122f0 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
12300 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
12310 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
12320 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
12330 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
12340 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
12350 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
12360 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
12370 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12380 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
12390 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
123a0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
123b0 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
123c0 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
123d0 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
123e0 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
123f0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
12400 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
12410 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
12420 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
12430 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
12440 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
12450 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
12460 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
12470 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
12480 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
12490 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
124a0 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
124b0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
124c0 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
124d0 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
124e0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
124f0 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
12500 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
12510 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
12520 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
12530 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
12540 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
12550 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
12560 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
12570 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
12580 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
12590 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
125a0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
125b0 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
125c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
125d0 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
125e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
125f0 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
12600 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
12610 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
12620 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
12630 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
12640 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
12650 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
12660 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
12670 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
12680 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
12690 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
126a0 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
126b0 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
126c0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
126d0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
126e0 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
126f0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
12700 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
12710 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
12720 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
12730 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
12740 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
12750 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
12760 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
12770 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
12780 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
12790 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
127a0 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
127b0 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
127c0 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
127d0 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
127e0 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
127f0 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
12800 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
12810 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
12820 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
12830 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
12840 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
12850 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
12860 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
12870 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
12880 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
12890 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
128a0 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
128b0 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
128c0 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
128d0 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
128e0 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
128f0 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
12900 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
12910 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
12920 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
12930 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
12940 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
12950 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
12960 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
12970 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12980 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
12990 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
129a0 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ag){.  sqlite3 *
129b0 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  pBlock = 0;.  Bt
129c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
129d0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
129e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
129f0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12a00 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
12a10 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
12a20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
12a30 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
12a40 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
12a50 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
12a60 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
12a70 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
12a80 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
12a90 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
12aa0 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
12ab0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
12ac0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
12ad0 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
12ae0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
12af0 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
12b00 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
12b10 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20  ns_begun;.  }.. 
12b20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
12b30 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
12b40 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
12b50 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
12b60 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65  */.  if( pBt->re
12b70 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67  adOnly && wrflag
12b80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
12b90 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
12ba0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
12bb0 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  un;.  }..#ifndef
12bc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
12bd0 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49  RED_CACHE.  /* I
12be0 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61  f another databa
12bf0 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c  se handle has al
12c00 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77  ready opened a w
12c10 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
12c20 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73   .  ** on this s
12c30 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
12c40 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
12c50 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
12c60 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71  tion is.  ** req
12c70 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
12c80 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
12c90 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67  */.  if( (wrflag
12ca0 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
12cb0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
12cc0 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73 50  ITE) || pBt->isP
12cd0 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70 42  ending ){.    pB
12ce0 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69  lock = pBt->pWri
12cf0 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  ter->db;.  }else
12d00 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
12d10 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  .    BtLock *pIt
12d20 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65  er;.    for(pIte
12d30 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
12d40 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
12d50 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
12d60 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
12d70 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
12d80 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e  pBlock = pIter->
12d90 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
12da0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12db0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
12dc0 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20  f( pBlock ){.   
12dd0 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
12de0 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
12df0 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63   pBlock);.    rc
12e00 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
12e10 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
12e20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
12e30 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  un;.  }.#endif..
12e40 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e    /* Any read-on
12e50 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65  ly or read-write
12e60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70   transaction imp
12e70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  lies a read-lock
12e80 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31   on .  ** page 1
12e90 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68  . So if some oth
12ea0 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
12eb0 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68  client already h
12ec0 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  as a write-lock 
12ed0 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c  .  ** on page 1,
12ee0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12ef0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
12f00 64 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  d. */.  if( SQLI
12f10 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 71 75 65  TE_OK!=(rc = que
12f20 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
12f30 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
12f40 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
12f50 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  )) ){.    goto t
12f60 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
12f70 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43  .  do {.    /* C
12f80 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  all lockBtree() 
12f90 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74  until either pBt
12fa0 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75  ->pPage1 is popu
12fb0 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20  lated or.    ** 
12fc0 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75  lockBtree() retu
12fd0 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74  rns something ot
12fe0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
12ff0 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a  OK. lockBtree().
13000 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72      ** may retur
13010 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  n SQLITE_OK but 
13020 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
13030 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66  1 set to 0 if af
13040 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  ter.    ** readi
13050 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73  ng page 1 it dis
13060 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20  covers that the 
13070 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
13080 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
13090 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42  * file is not pB
130a0 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20  t->pageSize. In 
130b0 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74  this case lockBt
130c0 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74  ree() will updat
130d0 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61  e.    ** pBt->pa
130e0 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61  geSize to the pa
130f0 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ge-size of the f
13100 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20  ile on disk..   
13110 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
13120 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26  Bt->pPage1==0 &&
13130 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
13140 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29  = lockBtree(pBt)
13150 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ) );..    if( rc
13160 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
13170 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  rflag ){.      i
13180 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
13190 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
131a0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
131b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
131c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
131d0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
131e0 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67  t->pPager,wrflag
131f0 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  >1,sqlite3TempIn
13200 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
13210 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
13220 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13230 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
13240 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
13250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13260 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
13270 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13280 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
13290 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
132a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
132b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
132c0 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  Y && pBt->inTran
132d0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
132e0 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  ONE &&.         
132f0 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
13300 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a  Handler(pBt) );.
13310 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13320 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
13330 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
13340 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
13350 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
13360 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  n++;.#ifndef SQL
13370 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
13380 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20  CACHE.      if( 
13390 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 09  p->sharable ){..
133a0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e  assert( p->lock.
133b0 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e  pBtree==p && p->
133c0 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29  lock.iTable==1 )
133d0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
133e0 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c  k.eLock = READ_L
133f0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  OCK;.        p->
13400 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74  lock.pNext = pBt
13410 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  ->pLock;.       
13420 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70   pBt->pLock = &p
13430 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ->lock;.      }.
13440 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
13450 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
13460 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
13470 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
13480 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
13490 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
134a0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
134b0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
134c0 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
134d0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
134e0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
134f0 43 41 43 48 45 0a 20 20 20 20 69 66 28 20 77 72  CACHE.    if( wr
13500 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61 73  flag ){.      as
13510 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69  sert( !pBt->pWri
13520 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ter );.      pBt
13530 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20  ->pWriter = p;. 
13540 20 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c       pBt->isExcl
13550 75 73 69 76 65 20 3d 20 28 75 38 29 28 77 72 66  usive = (u8)(wrf
13560 6c 61 67 3e 31 29 3b 0a 20 20 20 20 7d 0a 23 65  lag>1);.    }.#e
13570 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73  ndif.  }...trans
13580 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63  _begun:.  if( rc
13590 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
135a0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20  rflag ){.    /* 
135b0 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20  This call makes 
135c0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
135d0 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72  ger has the corr
135e0 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  ect number of.  
135f0 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f    ** open savepo
13600 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63  ints. If the sec
13610 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
13620 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
13630 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  and.    ** the s
13640 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  ub-journal is no
13650 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
13660 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20  then it will be 
13670 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20  opened here..   
13680 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
13690 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
136a0 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
136b0 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  er, p->db->nSave
136c0 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  point);.  }..  b
136d0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
136e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
136f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13700 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
13710 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13720 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
13730 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
13740 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
13750 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
13760 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
13770 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
13780 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
13790 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
137a0 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
137b0 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
137c0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
137d0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
137e0 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
137f0 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
13800 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
13810 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
13820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13840 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
13850 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
13860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
13880 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
13890 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
138a0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
138d0 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
138e0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
138f0 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72  t;.  u8 isInitOr
13900 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
13910 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  it;.  Pgno pgno 
13920 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
13930 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13940 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
13950 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
13960 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
13970 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
13980 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
13990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
139a0 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
139b0 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
139c0 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
139d0 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
139e0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
139f0 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
13a00 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
13a10 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63  age, i);..    rc
13a20 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
13a30 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
13a40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
13a50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13a60 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
13a70 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
13a80 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
13a90 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
13aa0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
13ab0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
13ac0 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ll);.      rc = 
13ad0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
13ae0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
13af0 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
13b00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
13b10 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65  ITE_OK ) goto se
13b20 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
13b30 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
13b40 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
13b50 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
13b60 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
13b70 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
13b80 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
13b90 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d  et+8]);.    rc =
13ba0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
13bb0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
13bc0 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a  P_BTREE, pgno);.
13bd0 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
13be0 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
13bf0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
13c00 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
13c10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13c20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
13c30 67 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61  ge, which is gua
13c40 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  ranteed to be a 
13c50 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20  btree page, not 
13c60 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  an overflow.** p
13c70 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65  age, is a pointe
13c80 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e  r to page iFrom.
13c90 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
13ca0 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20  nter so that it 
13cb0 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f  points to.** iTo
13cc0 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
13cd0 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
13ce0 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
13cf0 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  to be modified, 
13d00 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a  as .** follows:.
13d10 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
13d20 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
13d30 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
13d40 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
13d50 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d70 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
13d80 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
13d90 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
13da0 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
13db0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
13dc0 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
13dd0 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
13de0 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
13df0 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
13e00 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
13e10 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
13e20 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
13e30 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
13e40 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
13e50 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
13e60 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
13e70 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
13e80 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
13e90 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
13ea0 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
13eb0 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
13ec0 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
13ed0 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
13ee0 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
13ef0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13f00 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
13f10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
13f20 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
13f30 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
13f40 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
13f50 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
13f60 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
13f70 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
13f80 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
13f90 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
13fa0 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
13fb0 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
13fc0 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
13fd0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
13fe0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
13ff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
14000 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
14010 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
14020 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
14030 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
14040 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
14050 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
14060 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
14070 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69  nCell;..    sqli
14080 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
14090 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65  (pPage);.    nCe
140a0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
140b0 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
140c0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
140d0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
140e0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
140f0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
14100 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
14110 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
14120 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
14130 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14140 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
14150 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
14160 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
14170 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
14180 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  low ){.         
14190 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34   if( iFrom==get4
141a0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
141b0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a  .iOverflow]) ){.
141c0 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
141d0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
141e0 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f  .iOverflow], iTo
141f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
14200 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14210 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
14220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14230 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
14240 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
14250 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
14260 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
14270 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
14280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14290 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
142a0 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
142b0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
142c0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
142d0 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
142e0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
142f0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
14300 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
14310 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
14320 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
14330 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
14340 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
14350 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
14360 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
14370 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  To);.    }..    
14380 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
14390 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a  isInitOrig;.  }.
143a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
143b0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
143c0 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
143d0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
143e0 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
143f0 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
14400 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
14410 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
14420 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
14430 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14440 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
14450 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
14460 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
14470 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
14480 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
14490 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
144a0 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
144b0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
144c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
144d0 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
144e0 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
144f0 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
14500 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
14510 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
14520 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
14530 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
14540 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20  reePage,        
14550 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
14560 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
14570 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73  e to */.  int is
14580 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50  Commit.){.  MemP
14590 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
145a0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
145b0 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
145c0 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
145d0 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
145e0 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
145f0 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
14600 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
14610 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
14620 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
14630 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
14640 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
14650 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
14660 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
14670 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
14680 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
14690 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
146a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
146b0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
146c0 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
146d0 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
146e0 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
146f0 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
14700 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
14710 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
14720 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
14730 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
14740 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
14750 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
14760 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
14770 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
14780 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
14790 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
147a0 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
147b0 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
147c0 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
147d0 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
147e0 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
147f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
14800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
14810 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
14820 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
14830 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
14840 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
14850 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
14860 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
14870 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
14880 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
14890 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
148a0 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
148b0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
148c0 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
148d0 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
148e0 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
148f0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
14900 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
14910 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
14920 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
14930 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
14940 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
14950 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
14960 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
14970 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
14980 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
14990 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
149a0 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
149b0 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
149c0 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
149d0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
149e0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
149f0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
14a00 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
14a10 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
14a20 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
14a30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14a40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14a50 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
14a60 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
14a70 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
14a80 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
14a90 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
14aa0 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  fl!=0 ){.      r
14ab0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
14ac0 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
14ad0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
14ae0 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20  FreePage);.     
14af0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14b00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
14b10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
14b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14b30 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
14b40 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
14b50 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
14b60 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
14b70 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
14b80 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
14b90 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
14ba0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
14bb0 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
14bc0 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
14bd0 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
14be0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
14bf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
14c00 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
14c10 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
14c20 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
14c30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14c40 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14c50 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
14c60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
14c70 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
14c80 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
14c90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14ca0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
14cb0 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
14cc0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14cd0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
14ce0 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
14cf0 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
14d00 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
14d10 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
14d20 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
14d30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
14d40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14d50 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
14d60 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
14d70 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29  eType, iPtrPage)
14d80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
14d90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
14da0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
14db0 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
14dc0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
14dd0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
14de0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
14df0 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
14e00 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
14e10 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
14e20 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
14e30 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
14e40 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
14e50 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
14e60 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49  ,.** return SQLI
14e70 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
14e80 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
14e90 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
14ea0 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63  no.** point in c
14eb0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
14ec0 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
14ed0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
14ee0 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
14ef0 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e  ificly, this fun
14f00 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
14f10 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
14f20 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73  e .** database s
14f30 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  o that the last 
14f40 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
14f50 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
14f60 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e.** is no longe
14f70 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
14f80 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61  If the nFin para
14f90 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
14fa0 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  o, the implement
14fb0 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a  ation assumes.**
14fc0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
14fd0 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
14fe0 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
14ff0 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20  p() until.** it 
15000 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
15010 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c  ONE or an error,
15020 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69   and that nFin i
15030 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
15040 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74  of pages the dat
15050 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
15060 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68  contain after th
15070 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  is .** process i
15080 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73  s complete..*/.s
15090 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
150a0 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
150b0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
150c0 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29  n, Pgno iLastPg)
150d0 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
150e0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
150f0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
15100 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
15110 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
15120 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15130 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
15140 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
15150 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
15160 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
15170 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
15180 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
15190 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
151a0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
151b0 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65  int rc;.    u8 e
151c0 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
151d0 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
151e0 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
151f0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
15200 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
15210 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
15220 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
15230 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
15240 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
15250 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
15260 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
15270 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
15280 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15290 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
152a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
152b0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
152c0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
152d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
152e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
152f0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
15300 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
15310 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
15320 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
15330 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
15340 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
15350 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
15360 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
15370 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
15380 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e  * if nFin is non
15390 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
153a0 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
153b0 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
153c0 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
153d0 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
153e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
153f0 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
15400 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
15410 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
15420 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
15430 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
15440 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
15450 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
15460 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
15470 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
15480 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
15490 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
154a0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
154b0 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b  Pg, iLastPg, 1);
154c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
154d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
154e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
154f0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
15500 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
15510 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
15520 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
15530 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
15540 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
15550 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
15560 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
15570 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
15580 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
15590 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
155a0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
155b0 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72  LastPg;..      r
155c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
155d0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
155e0 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
155f0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
15600 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15610 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
15620 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15630 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a   /* If nFin is z
15640 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
15650 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
15660 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
15670 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
15680 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
15690 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
156a0 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
156b0 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
156c0 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
156d0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
156e0 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72   nFin is greater
156f0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
15700 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
15710 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
15720 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
15730 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
15740 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
15750 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
15760 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
15770 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a    */.      do {.
15780 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
15790 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
157a0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
157b0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
157c0 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
157d0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
157e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
157f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
15800 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
15810 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
15820 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
15830 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
15840 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
15850 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
15860 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65   nFin!=0 && iFre
15870 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
15880 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
15890 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
158a0 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73     .      rc = s
158b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
158c0 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67  (pLastPg->pDbPag
158d0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
158e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
158f0 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
15900 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
15910 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
15920 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
15930 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20   nFin!=0);.     
15940 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
15950 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
15960 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15970 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
15990 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
159a0 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
159b0 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a  .    iLastPg--;.
159c0 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74      while( iLast
159d0 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
159e0 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d  _PAGE(pBt)||PTRM
159f0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
15a00 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
15a10 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
15a20 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
15a30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
15a40 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  age *pPg;.      
15a50 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
15a60 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
15a70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50  Bt, iLastPg, &pP
15a80 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 0);.        i
15a90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
15ab0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
15ac0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
15ad0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
15ae0 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
15af0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
15b00 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
15b10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15b20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15b30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
15b40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15b50 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
15b60 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
15b70 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
15b80 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
15b90 20 69 4c 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20   iLastPg);.  }. 
15ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15bb0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  K;.}../*.** A wr
15bc0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
15bd0 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
15be0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
15bf0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
15c00 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
15c10 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
15c20 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
15c30 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
15c40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
15c50 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
15c60 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
15c70 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
15c80 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
15c90 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
15ca0 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
15cb0 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
15cc0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
15cd0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
15ce0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
15cf0 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
15d00 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
15d10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15d20 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
15d30 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
15d40 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
15d50 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
15d60 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15d70 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
15d80 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
15d90 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
15da0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
15db0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
15dc0 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
15dd0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
15de0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
15df0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69  else{.    invali
15e00 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
15e10 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72  ache(pBt);.    r
15e20 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
15e30 65 70 28 70 42 74 2c 20 30 2c 20 70 61 67 65 72  ep(pBt, 0, pager
15e40 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b  Pagecount(pBt));
15e50 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
15e60 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15e70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15e80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15e90 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
15ea0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
15eb0 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
15ec0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
15ed0 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61  ommited for an a
15ee0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
15ef0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
15f00 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
15f10 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
15f20 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
15f30 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
15f40 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
15f50 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
15f60 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
15f70 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
15f80 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
15f90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
15fa0 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
15fb0 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
15fc0 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
15fd0 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
15fe0 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
15ff0 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
16000 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
16010 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
16020 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
16030 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
16040 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
16050 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
16060 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
16070 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
16080 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
16090 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
160a0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
160b0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
160c0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
160d0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
160e0 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
160f0 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
16100 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
16110 20 6e 46 69 6e 3b 0a 20 20 20 20 50 67 6e 6f 20   nFin;.    Pgno 
16120 6e 46 72 65 65 3b 0a 20 20 20 20 50 67 6e 6f 20  nFree;.    Pgno 
16130 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 50 67 6e  nPtrmap;.    Pgn
16140 6f 20 69 46 72 65 65 3b 0a 20 20 20 20 63 6f 6e  o iFree;.    con
16150 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42  st int pgsz = pB
16160 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  t->pageSize;.   
16170 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 70 61   Pgno nOrig = pa
16180 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
16190 29 3b 0a 0a 20 20 20 20 69 66 28 20 50 54 52 4d  );..    if( PTRM
161a0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
161b0 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
161c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
161d0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
161e0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
161f0 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
16200 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
16210 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
16220 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
16230 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
16240 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
16250 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
16260 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
16270 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
16280 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
16290 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
162a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
162b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
162c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
162d0 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
162e0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
162f0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
16300 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e      nPtrmap = (n
16310 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
16320 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
16330 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67  rig)+pgsz/5)/(pg
16340 73 7a 2f 35 29 3b 0a 20 20 20 20 6e 46 69 6e 20  sz/5);.    nFin 
16350 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20  = nOrig - nFree 
16360 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69  - nPtrmap;.    i
16370 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
16380 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
16390 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
163a0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
163b0 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a  {.      nFin--;.
163c0 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
163d0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
163e0 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
163f0 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
16400 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
16410 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d     nFin--;.    }
16420 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f  .    if( nFin>nO
16430 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rig ) return SQL
16440 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
16450 3b 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65  ;..    for(iFree
16460 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46  =nOrig; iFree>nF
16470 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  in && rc==SQLITE
16480 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20  _OK; iFree--){. 
16490 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
164a0 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
164b0 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20  in, iFree);.    
164c0 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  }.    if( (rc==S
164d0 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63  QLITE_DONE || rc
164e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
164f0 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
16500 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16510 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
16520 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
16530 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
16540 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
16550 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
16560 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
16570 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
16580 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
16590 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
165a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
165b0 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
165c0 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b  ->pPager, nFin);
165d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
165e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
165f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
16600 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
16610 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
16620 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73   assert( nRef==s
16630 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
16640 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
16650 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
16660 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
16670 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
16680 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
16690 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
166a0 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
166b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
166c0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
166d0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
166e0 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
166f0 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
16700 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
16710 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16720 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
16730 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
16740 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
16750 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
16760 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
16770 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
16780 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
16790 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
167a0 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
167b0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
167c0 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
167d0 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
167e0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
167f0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
16800 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
16810 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
16820 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
16830 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
16840 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
16850 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
16860 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
16870 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
16880 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
16890 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
168a0 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
168b0 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
168c0 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
168d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
168e0 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
168f0 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
16900 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
16910 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
16920 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16930 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
16940 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
16950 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
16960 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
16970 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
16980 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
16990 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
169a0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
169b0 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
169c0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
169d0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
169e0 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
169f0 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
16a00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
16a10 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
16a20 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
16a30 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
16a40 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
16a50 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
16a60 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
16a70 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
16a80 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
16a90 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
16aa0 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
16ab0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
16ac0 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
16ad0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
16ae0 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
16af0 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
16b00 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
16b10 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
16b20 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
16b30 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
16b40 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
16b50 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
16b60 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
16b70 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
16b80 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
16b90 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
16ba0 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
16bb0 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
16bc0 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
16bd0 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
16be0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
16bf0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
16c00 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
16c10 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
16c20 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
16c30 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
16c40 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
16c50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16c60 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
16c70 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
16c80 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
16c90 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
16ca0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16cb0 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
16cc0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
16cd0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
16ce0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
16cf0 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
16d00 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
16d10 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
16d20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16d30 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
16d40 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
16d50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16d60 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
16d70 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
16d80 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
16d90 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
16da0 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
16db0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
16dc0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
16dd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16de0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
16df0 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
16e00 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
16e10 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
16e20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
16e30 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
16e40 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
16e50 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
16e60 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
16e70 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
16e80 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
16e90 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16ea0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 73 72 3b   BtCursor *pCsr;
16eb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16ec0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
16ed0 78 28 70 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  x(p) );..  /* Se
16ee0 61 72 63 68 20 66 6f 72 20 61 20 63 75 72 73 6f  arch for a curso
16ef0 72 20 68 65 6c 64 20 6f 70 65 6e 20 62 79 20 74  r held open by t
16f00 68 69 73 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65  his b-tree conne
16f10 63 74 69 6f 6e 2e 20 49 66 20 6f 6e 65 20 65 78  ction. If one ex
16f20 69 73 74 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  ists,.  ** then 
16f30 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
16f40 77 69 6c 6c 20 62 65 20 64 6f 77 6e 67 72 61 64  will be downgrad
16f50 65 64 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  ed to a read-onl
16f60 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  y transaction.  
16f70 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 61 63  ** instead of ac
16f80 74 75 61 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  tually concluded
16f90 2e 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63  . A subsequent c
16fa0 61 6c 6c 20 74 6f 20 43 6f 6d 6d 69 74 50 68 61  all to CommitPha
16fb0 73 65 54 77 6f 28 29 20 0a 20 20 2a 2a 20 6f 72  seTwo() .  ** or
16fc0 20 52 6f 6c 6c 62 61 63 6b 28 29 20 77 69 6c 6c   Rollback() will
16fd0 20 66 69 6e 69 73 68 20 74 68 65 20 74 72 61 6e   finish the tran
16fe0 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f  saction and unlo
16ff0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ck the database.
17000 20 20 2a 2f 0a 20 20 66 6f 72 28 70 43 73 72 3d    */.  for(pCsr=
17010 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43  pBt->pCursor; pC
17020 73 72 20 26 26 20 70 43 73 72 2d 3e 70 42 74 72  sr && pCsr->pBtr
17030 65 65 21 3d 70 3b 20 70 43 73 72 3d 70 43 73 72  ee!=p; pCsr=pCsr
17040 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 61 73 73 65  ->pNext);.  asse
17050 72 74 28 20 70 43 73 72 3d 3d 30 20 7c 7c 20 70  rt( pCsr==0 || p
17060 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
17070 4e 4f 4e 45 20 29 3b 0a 0a 20 20 62 74 72 65 65  NONE );..  btree
17080 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
17090 70 42 74 29 3b 0a 20 20 69 66 28 20 70 43 73 72  pBt);.  if( pCsr
170a0 20 29 7b 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   ){.    downgrad
170b0 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
170c0 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
170d0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
170e0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
170f0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
17100 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
17110 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
17120 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
17130 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
17140 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
17150 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
17160 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
17170 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
17180 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
17190 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
171a0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
171b0 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
171c0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
171d0 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
171e0 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
171f0 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
17200 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
17210 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
17220 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
17230 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
17240 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
17250 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
17260 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
17270 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
17280 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
17290 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
172a0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
172b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
172c0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
172d0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
172e0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
172f0 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
17300 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
17310 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
17320 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
17330 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
17340 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
17350 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
17360 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
17370 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
17380 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
17390 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
173a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
173b0 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
173c0 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
173d0 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
173e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
173f0 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
17400 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
17410 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
17420 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
17430 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
17440 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
17450 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
17460 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
17470 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
17480 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
17490 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
174a0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
174b0 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
174c0 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
174d0 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
174e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
174f0 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
17500 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
17510 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
17520 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
17530 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
17540 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
17550 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
17560 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
17570 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
17580 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
17590 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
175a0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
175b0 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
175c0 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
175d0 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
175e0 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54  p locks..**.** T
175f0 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
17600 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
17610 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
17620 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
17630 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
17640 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
17650 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
17660 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
17670 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
17680 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65  mitPhaseTwo(Btre
17690 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
176a0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
176b0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
176c0 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
176d0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
176e0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
176f0 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74  le has a write-t
17700 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
17710 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72   commit the shar
17720 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20  ed-btrees .  ** 
17730 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
17740 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
17750 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45  tate to TRANS_RE
17760 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  AD..  */.  if( p
17770 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
17780 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
17790 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  t rc;.    assert
177a0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
177b0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
177c0 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
177d0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
177e0 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
177f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
17800 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
17810 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
17820 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17830 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
17840 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17850 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17860 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69      }.    pBt->i
17870 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
17880 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
17890 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
178a0 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
178b0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
178c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
178d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
178e0 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66  o both phases of
178f0 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e   a commit..*/.in
17900 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
17910 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
17920 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
17930 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
17940 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17950 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
17960 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  One(p, 0);.  if(
17970 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17980 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
17990 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
179a0 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20  seTwo(p);.  }.  
179b0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
179c0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
179d0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  c;.}..#ifndef ND
179e0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
179f0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
17a00 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70  write-cursors op
17a10 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c  en on this handl
17a20 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75  e. This is for u
17a30 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  se.** in assert(
17a40 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73  ) expressions, s
17a50 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d  o it is only com
17a60 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20  piled if NDEBUG 
17a70 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65  is not.** define
17a80 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
17a90 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
17aa0 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69  s routine, a wri
17ab0 74 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79  te-cursor is any
17ac0 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20   cursor that.** 
17ad0 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72  is capable of wr
17ae0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
17af0 61 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e  abse.  That mean
17b00 73 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  s the cursor was
17b10 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f  .** originally o
17b20 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e  pened for writin
17b30 67 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  g and the cursor
17b40 20 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61   has not be disa
17b50 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e  bled.** by havin
17b60 67 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e  g its state chan
17b70 67 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ged to CURSOR_FA
17b80 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ULT..*/.static i
17b90 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72  nt countWriteCur
17ba0 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
17bb0 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  Bt){.  BtCursor 
17bc0 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d  *pCur;.  int r =
17bd0 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70   0;.  for(pCur=p
17be0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75  Bt->pCursor; pCu
17bf0 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e  r; pCur=pCur->pN
17c00 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43  ext){.    if( pC
17c10 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43  ur->wrFlag && pC
17c20 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
17c30 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
17c40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
17c50 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
17c60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
17c70 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20  ts the state to 
17c80 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64  CURSOR_FAULT and
17c90 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
17ca0 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f  de to errCode fo
17cb0 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f  r every cursor o
17cc0 6e 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20  n BtShared that 
17cd0 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65  pBtree.** refere
17ce0 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  nces..**.** Ever
17cf0 79 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70  y cursor is trip
17d00 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63  ped, including c
17d10 75 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f  ursors that belo
17d20 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64  ng.** to other d
17d30 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
17d40 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20  ons that happen 
17d50 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a  to be sharing.**
17d60 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20   the cache with 
17d70 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pBtree..**.** Th
17d80 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
17d90 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f  called when a ro
17da0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a  llback occurs..*
17db0 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73  * All cursors us
17dc0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63  ing the same cac
17dd0 68 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70  he must be tripp
17de0 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74  ed.** to prevent
17df0 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e   them from tryin
17e00 67 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72  g to use the btr
17e10 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  ee after.** the 
17e20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72  rollback.  The r
17e30 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
17e40 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a   deleted tables.
17e50 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74  ** or moved root
17e60 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73   pages, so it is
17e70 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
17e80 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73  to.** save the s
17e90 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73  tate of the curs
17ea0 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  or.  The cursor 
17eb0 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  must be.** inval
17ec0 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  idated..*/.void 
17ed0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
17ee0 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65  AllCursors(Btree
17ef0 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72   *pBtree, int er
17f00 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73  rCode){.  BtCurs
17f10 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  or *p;.  sqlite3
17f20 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
17f30 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  e);.  for(p=pBtr
17f40 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
17f50 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
17f60 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
17f70 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
17f80 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
17f90 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
17fa0 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70  SOR_FAULT;.    p
17fb0 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65  ->skip = errCode
17fc0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
17fd0 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  <=p->iPage; i++)
17fe0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
17ff0 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d  age(p->apPage[i]
18000 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61  );.      p->apPa
18010 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ge[i] = 0;.    }
18020 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
18030 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
18040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
18050 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
18060 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ion in progress.
18070 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69    All cursors wi
18080 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ll be.** invalid
18090 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
180a0 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
180b0 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  pt to use a curs
180c0 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f  or.** that was o
180d0 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
180e0 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
180f0 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  ration will resu
18100 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f  lt.** in an erro
18110 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
18120 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
18130 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
18140 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
18150 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
18160 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
18170 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
18180 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
18190 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
181a0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
181b0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
181c0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
181d0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
181e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
181f0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
18200 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
18210 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
18220 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66  (pBt, 0, 0);.#if
18230 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18240 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
18250 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18260 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  K ){.    /* This
18270 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73   is a horrible s
18280 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20  ituation. An IO 
18290 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
182a0 72 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  r occurred whils
182b0 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20  t.    ** trying 
182c0 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70  to save cursor p
182d0 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69  ositions. If thi
182e0 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69  s is an automati
182f0 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20  c rollback (as. 
18300 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74     ** the result
18310 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   of a constraint
18320 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  , malloc() failu
18330 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20  re or IO error) 
18340 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  then .    ** the
18350 20 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e   cache may be in
18360 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69  ternally inconsi
18370 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61  stent (not conta
18380 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20  in valid trees) 
18390 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e  so.    ** we can
183a0 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72  not simply retur
183b0 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74  n the error to t
183c0 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65  he caller. Inste
183d0 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a  ad, abort .    *
183e0 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68  * all queries th
183f0 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20  at may be using 
18400 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f  any of the curso
18410 72 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74  rs that failed t
18420 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  o save..    */. 
18430 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
18440 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
18450 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   rc);.  }.#endif
18460 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
18470 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
18480 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
18490 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
184a0 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
184b0 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
184c0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
184d0 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
184e0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
184f0 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
18500 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
18510 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18520 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
18530 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
18540 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
18550 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
18560 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
18570 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
18580 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  ll sqlite3BtreeG
18590 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
185a0 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
185b0 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
185c0 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
185d0 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
185e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
185f0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
18600 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
18610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18620 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18630 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
18640 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
18650 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74  WriteCursors(pBt
18660 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
18670 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
18680 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
18690 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
186a0 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
186b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
186c0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
186d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20  .}../*.** Start 
186e0 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
186f0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
18700 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
18710 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  an can be rolled
18720 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  .** back indepen
18730 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
18740 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  in transaction. 
18750 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61  You must start a
18760 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
18770 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
18780 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f   a subtransactio
18790 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
187a0 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
187b0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
187c0 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
187d0 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
187e0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a   or rolls back..
187f0 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
18800 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
18810 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
18820 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
18830 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
18840 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
18850 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
18860 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
18870 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
18880 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
18890 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
188a0 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
188b0 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
188c0 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
188d0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
188e0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
188f0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
18900 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
18910 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e  **.** A statemen
18920 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f  t sub-transactio
18930 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
18940 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73   as an anonymous
18950 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a   savepoint. The.
18960 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  ** value passed 
18970 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
18980 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74  rameter is the t
18990 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
189a0 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e  avepoints,.** in
189b0 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20  cluding the new 
189c0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
189d0 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65  int, open on the
189e0 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66   B-Tree. i.e. if
189f0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
18a00 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
18a10 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
18a20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
18a30 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20  ctions open,.** 
18a40 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e  iStatement is 1.
18a50 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20   This anonymous 
18a60 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65  savepoint can be
18a70 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c   released or rol
18a80 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  led back.** usin
18a90 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  g the sqlite3Btr
18aa0 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75  eeSavepoint() fu
18ab0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
18ac0 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
18ad0 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69  Stmt(Btree *p, i
18ae0 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a  nt iStatement){.
18af0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
18b00 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
18b10 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
18b20 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
18b30 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
18b40 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
18b50 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
18b60 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
18b70 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
18b80 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
18b90 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d  t( iStatement>p-
18ba0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  >db->nSavepoint 
18bb0 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  );.  if( NEVER(p
18bc0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
18bd0 5f 57 52 49 54 45 20 7c 7c 20 70 42 74 2d 3e 72  _WRITE || pBt->r
18be0 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadOnly) ){.    
18bf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
18c00 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RNAL;.  }else{. 
18c10 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
18c20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
18c30 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
18c40 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65    /* At the page
18c50 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65  r level, a state
18c60 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
18c70 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
18c80 77 69 74 68 0a 20 20 20 20 2a 2a 20 61 6e 20 69  with.    ** an i
18c90 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
18ca0 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73  n all savepoints
18cb0 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69   created explici
18cc0 74 6c 79 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a  tly using.    **
18cd0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
18ce0 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
18cf0 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
18d00 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
18d10 20 20 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65      ** such save
18d20 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65  points while the
18d30 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
18d40 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
18d50 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20   is active..    
18d60 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
18d70 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
18d80 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
18d90 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a  r, iStatement);.
18da0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
18db0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18dc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18dd0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
18de0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
18df0 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61  nction, op, is a
18e00 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f  lways SAVEPOINT_
18e10 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53  ROLLBACK.** or S
18e20 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
18e30 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
18e40 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20  either releases 
18e50 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68  or rolls back th
18e60 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69  e.** savepoint i
18e70 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
18e80 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e  ameter iSavepoin
18e90 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  t, depending on 
18ea0 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  the value .** of
18eb0 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61   op..**.** Norma
18ec0 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20  lly, iSavepoint 
18ed0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
18ee0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
18ef0 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70  . However, if op
18f00 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   is.** SAVEPOINT
18f10 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
18f20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61  iSavepoint may a
18f30 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68  lso be -1. In th
18f40 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20  is case the .** 
18f50 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
18f60 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
18f70 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61  on are rolled ba
18f80 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66  ck. This is diff
18f90 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20  erent.** from a 
18fa0 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69  normal transacti
18fb0 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20  on rollback, as 
18fc0 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c  no locks are rel
18fd0 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  eased and the.**
18fe0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d   transaction rem
18ff0 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e  ains open..*/.in
19000 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  t sqlite3BtreeSa
19010 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70  vepoint(Btree *p
19020 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
19030 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
19040 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19050 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69  .  if( p && p->i
19060 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
19070 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
19080 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
19090 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  t;.    assert( o
190a0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
190b0 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  EASE || op==SAVE
190c0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
190d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
190e0 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28  avepoint>=0 || (
190f0 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26  iSavepoint==-1 &
19100 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  & op==SAVEPOINT_
19110 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20  ROLLBACK) );.   
19120 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
19130 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  er(p);.    rc = 
19140 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65  sqlite3PagerSave
19150 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
19160 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e  r, op, iSavepoin
19170 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
19180 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19190 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
191a0 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  ase(pBt);.    }.
191b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
191c0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
191d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
191e0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
191f0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
19200 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
19210 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
19220 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
19230 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
19240 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
19250 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
19260 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
19270 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
19280 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
19290 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
192a0 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
192b0 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
192c0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
192d0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
192e0 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
192f0 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
19300 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
19310 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
19320 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
19330 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
19340 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
19350 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
19360 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
19370 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
19380 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
19390 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
193a0 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
193b0 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
193c0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
193d0 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
193e0 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
193f0 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
19400 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
19410 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
19420 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
19430 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
19440 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
19450 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
19460 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
19470 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
19480 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
19490 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
194a0 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
194b0 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
194c0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
194d0 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
194e0 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
194f0 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
19500 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
19510 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
19520 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
19530 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
19540 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
19550 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
19560 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
19570 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
19580 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
19590 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
195a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
195b0 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
195c0 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
195d0 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
195e0 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
195f0 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
19600 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
19610 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
19620 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
19630 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
19640 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
19650 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
19660 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
19670 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
19680 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
19690 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
196a0 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
196b0 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
196c0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
196d0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
196e0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
196f0 72 53 69 7a 65 28 29 20 62 79 74 65 73 20 6f 66  rSize() bytes of
19700 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e   memory .** poin
19710 74 65 64 20 74 6f 20 62 79 20 70 43 75 72 20 68  ted to by pCur h
19720 61 76 65 20 62 65 65 6e 20 7a 65 72 6f 65 64 20  ave been zeroed 
19730 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
19740 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
19750 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
19760 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
19770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19780 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
19790 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
197c0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
197d0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
197e0 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19800 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
19810 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
19820 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
19830 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
19840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19850 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d  First arg to com
19860 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
19870 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
19880 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
198a0 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75  Space for new cu
198b0 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rsor */.){.  int
198c0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
198d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
198f0 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
19900 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20   *pBt = p->pBt; 
19910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19920 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20  * Shared b-tree 
19930 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  handle */..  ass
19940 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
19950 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
19960 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
19970 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d  ag==0 || wrFlag=
19980 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  =1 );..  /* The 
19990 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
199a0 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69   statements veri
199b0 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20  fy that if this 
199c0 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20  is a sharable . 
199d0 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62   ** b-tree datab
199e0 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74  ase, the connect
199f0 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ion is holding t
19a00 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
19a10 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61  e locks, .  ** a
19a20 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  nd that no other
19a30 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
19a40 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20  any open cursor 
19a50 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77  that conflicts w
19a60 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c  ith .  ** this l
19a70 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
19a80 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68  t( hasSharedCach
19a90 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  eTableLock(p, iT
19aa0 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d  able, pKeyInfo!=
19ab0 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a  0, wrFlag+1) );.
19ac0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
19ad0 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43  ==0 || !hasReadC
19ae0 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62  onflicts(p, iTab
19af0 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  le) );..  /* Ass
19b00 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c  ert that the cal
19b10 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74  ler has opened t
19b20 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e  he required tran
19b30 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73  saction. */.  as
19b40 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
19b50 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
19b60 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
19b70 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73  =0 || p->inTrans
19b80 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
19b90 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
19ba0 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70  pPage1 && pBt->p
19bb0 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
19bc0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 77 72 46  .  if( NEVER(wrF
19bd0 6c 61 67 20 26 26 20 70 42 74 2d 3e 72 65 61 64  lag && pBt->read
19be0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 65 74  Only) ){.    ret
19bf0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
19c00 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  NLY;.  }.  if( i
19c10 54 61 62 6c 65 3d 3d 31 20 26 26 20 70 61 67 65  Table==1 && page
19c20 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d  rPagecount(pBt)=
19c30 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
19c40 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20   SQLITE_EMPTY;. 
19c50 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f   }..  pCur->pgno
19c60 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
19c70 62 6c 65 3b 0a 20 20 72 63 20 3d 20 67 65 74 41  ble;.  rc = getA
19c80 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
19c90 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
19ca0 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  &pCur->apPage[0]
19cb0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
19cc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
19cd0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
19ce0 67 65 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  ge[0]==0 );.    
19cf0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
19d00 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
19d10 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
19d20 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
19d30 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
19d40 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
19d50 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
19d60 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
19d70 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
19d80 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
19d90 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
19da0 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72  fo;.  pCur->pBtr
19db0 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e  ee = p;.  pCur->
19dc0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75  pBt = pBt;.  pCu
19dd0 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38 29  r->wrFlag = (u8)
19de0 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e  wrFlag;.  pCur->
19df0 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
19e00 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72  rsor;.  if( pCur
19e10 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
19e20 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
19e30 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20  v = pCur;.  }.  
19e40 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
19e50 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
19e60 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
19e70 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63 61  ALID;.  pCur->ca
19e80 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a 20  chedRowid = 0;. 
19e90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19ea0 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
19eb0 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
19ec0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19ef0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
19f00 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
19f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
19f30 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
19f40 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
19f50 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f70 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
19f80 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
19f90 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
19fa0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
19fb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19fc0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
19fd0 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
19fe0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
19ff0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a010 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
1a020 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
1a030 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1a040 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1a050 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72  .  rc = btreeCur
1a060 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
1a070 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
1a080 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65   pCur);.  sqlite
1a090 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1a0a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a0b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1a0c0 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72   size of a BtCur
1a0d0 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79  sor object in by
1a0e0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tes..**.** This 
1a0f0 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65  interfaces is ne
1a100 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65  eded so that use
1a110 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61  rs of cursors ca
1a120 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a  n preallocate.**
1a130 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72   sufficient stor
1a140 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75  age to hold a cu
1a150 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72  rsor.  The BtCur
1a160 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  sor object is op
1a170 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73  aque.** to users
1a180 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   so they cannot 
1a190 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20  do the sizeof() 
1a1a0 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65  themselves - the
1a1b0 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74  y must call.** t
1a1c0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
1a1d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1a1e0 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29  CursorSize(void)
1a1f0 7b 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65 6f  {.  return sizeo
1a200 66 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a  f(BtCursor);.}..
1a210 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61  /*.** Set the ca
1a220 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65  ched rowid value
1a230 20 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f 72   of every cursor
1a240 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
1a250 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73  abase file.** as
1a260 20 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67   pCur and having
1a270 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70   the same root p
1a280 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43  age number as pC
1a290 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  ur.  The value i
1a2a0 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77  s.** set to iRow
1a2b0 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70  id..**.** Only p
1a2c0 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20 76 61  ositive rowid va
1a2d0 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
1a2e0 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68  red valid for th
1a2f0 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65  is cache..** The
1a300 20 63 61 63 68 65 20 69 73 20 69 6e 69 74 69 61   cache is initia
1a310 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69  lized to zero, i
1a320 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76  ndicating an inv
1a330 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41  alid cache..** A
1a340 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b   btree will work
1a350 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20   fine with zero 
1a360 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
1a370 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e  ds.  We just can
1a380 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72  not.** cache zer
1a390 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  o or negative ro
1a3a0 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e  wids, which mean
1a3b0 73 20 74 61 62 6c 65 73 20 74 68 61 74 20 75 73  s tables that us
1a3c0 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67  e zero or.** neg
1a3d0 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67  ative rowids mig
1a3e0 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
1a3f0 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20  slower.  But in 
1a400 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a  practice, zero.*
1a410 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  * or negative ro
1a420 77 69 64 73 20 61 72 65 20 76 65 72 79 20 75 6e  wids are very un
1a430 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73  common so this s
1a440 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70  hould not be a p
1a450 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
1a460 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
1a470 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72  achedRowid(BtCur
1a480 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74  sor *pCur, sqlit
1a490 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29  e3_int64 iRowid)
1a4a0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
1a4b0 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70  .  for(p=pCur->p
1a4c0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1a4d0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1a4e0 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1a4f0 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
1a500 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69   ) p->cachedRowi
1a510 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a  d = iRowid;.  }.
1a520 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a530 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f  cachedRowid==iRo
1a540 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  wid );.}../*.** 
1a550 52 65 74 75 72 6e 20 74 68 65 20 63 61 63 68 65  Return the cache
1a560 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  d rowid for the 
1a570 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41  given cursor.  A
1a580 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72   negative or zer
1a590 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  o.** return valu
1a5a0 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
1a5b0 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65   the rowid cache
1a5c0 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20   is invalid and 
1a5d0 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e  should be.** ign
1a5e0 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f  ored.  If the ro
1a5f0 77 69 64 20 63 61 63 68 65 20 68 61 73 20 6e 65  wid cache has ne
1a600 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20  ver before been 
1a610 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a  set, then a.** z
1a620 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
1a630 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
1a640 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  4 sqlite3BtreeGe
1a650 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43  tCachedRowid(BtC
1a660 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1a670 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63  return pCur->cac
1a680 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  hedRowid;.}../*.
1a690 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
1a6a0 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
1a6b0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1a6c0 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
1a6d0 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
1a6e0 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
1a6f0 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
1a700 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
1a710 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
1a720 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  Cur){.  Btree *p
1a730 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42  Btree = pCur->pB
1a740 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72  tree;.  if( pBtr
1a750 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ee ){.    int i;
1a760 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1a770 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
1a780 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1a790 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1a7a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1a7b0 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
1a7c0 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
1a7d0 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70  pPrev ){.      p
1a7e0 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  Cur->pPrev->pNex
1a7f0 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  t = pCur->pNext;
1a800 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a810 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
1a820 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
1a830 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
1a840 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
1a850 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
1a860 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65  rev = pCur->pPre
1a870 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  v;.    }.    for
1a880 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
1a890 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1a8a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
1a8b0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
1a8c0 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b      }.    unlock
1a8d0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1a8e0 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t);.    invalida
1a8f0 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
1a900 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71  pCur);.    /* sq
1a910 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
1a920 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
1a930 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
1a940 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1a950 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1a960 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1a970 54 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74  T./*.** Make a t
1a980 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
1a990 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  by filling in th
1a9a0 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d  e fields of pTem
1a9b0 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d  pCur..** The tem
1a9c0 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69 73  porary cursor is
1a9d0 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73   not on the curs
1a9e0 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20  or list for the 
1a9f0 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Btree..*/.void s
1aa00 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54 65  qlite3BtreeGetTe
1aa10 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
1aa20 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73 6f  r *pCur, BtCurso
1aa30 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20 20  r *pTempCur){.  
1aa40 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
1aa50 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1aa60 78 28 70 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d  x(pCur) );.  mem
1aa70 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43  cpy(pTempCur, pC
1aa80 75 72 2c 20 73 69 7a 65 6f 66 28 42 74 43 75 72  ur, sizeof(BtCur
1aa90 73 6f 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75  sor));.  pTempCu
1aaa0 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
1aab0 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20  pTempCur->pPrev 
1aac0 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
1aad0 69 3c 3d 70 54 65 6d 70 43 75 72 2d 3e 69 50 61  i<=pTempCur->iPa
1aae0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ge; i++){.    sq
1aaf0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 54  lite3PagerRef(pT
1ab00 65 6d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  empCur->apPage[i
1ab10 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  ]->pDbPage);.  }
1ab20 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 6d 70  .  assert( pTemp
1ab30 43 75 72 2d 3e 70 4b 65 79 3d 3d 30 20 29 3b 0a  Cur->pKey==0 );.
1ab40 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1ab50 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 23 69 66 64  TE_TEST */..#ifd
1ab60 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
1ab70 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65  *.** Delete a te
1ab80 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73  mporary cursor s
1ab90 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65 20  uch as was made 
1aba0 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65 6d  by the CreateTem
1abb0 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a  poraryCursor().*
1abc0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65  * function above
1abd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1abe0 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d  3BtreeReleaseTem
1abf0 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
1ac00 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69   *pCur){.  int i
1ac10 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
1ac20 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1ac30 72 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  r) );.  for(i=0;
1ac40 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
1ac50 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
1ac60 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 43 75  e3PagerUnref(pCu
1ac70 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44  r->apPage[i]->pD
1ac80 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71  bPage);.  }.  sq
1ac90 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
1aca0 3e 70 4b 65 79 29 3b 0a 7d 0a 23 65 6e 64 69 66  >pKey);.}.#endif
1acb0 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20   /* SQLITE_TEST 
1acc0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  */../*.** Make s
1acd0 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
1ace0 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
1acf0 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
1ad00 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
1ad10 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
1ad20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
1ad30 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
1ad40 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  l.** sqlite3Btre
1ad50 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20  eParseCell() to 
1ad60 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a  fill it in..**.*
1ad70 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
1ad80 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68  is a cache of th
1ad90 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
1ada0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c   the current cel
1adb0 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73  l..** Using this
1adc0 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74   cache reduces t
1add0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  he number of cal
1ade0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
1adf0 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
1ae00 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a  *.** 2007-06-25:
1ae10 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67    There is a bug
1ae20 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e   in some version
1ae30 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63  s of MSVC that c
1ae40 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70  ause the.** comp
1ae50 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68  iler to crash wh
1ae60 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29  en getCellInfo()
1ae70 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1ae80 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42  as a macro..** B
1ae90 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65  ut there is a me
1aea0 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20  asureable speed 
1aeb0 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69  advantage to usi
1aec0 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20  ng the macro on 
1aed0 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73  gcc.** (when les
1aee0 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d  s compiler optim
1aef0 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f  izations like -O
1af00 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65  s or -O0 are use
1af10 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d  d and the.** com
1af20 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69  piler is not doi
1af30 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c  ng agressive inl
1af40 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75  ining.)  So we u
1af50 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1af60 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61  on.** for MSVC a
1af70 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65  nd a macro for e
1af80 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20  verything else. 
1af90 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a   Ticket #2457..*
1afa0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1afb0 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61  .  static void a
1afc0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74  ssertCellInfo(Bt
1afd0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1afe0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
1aff0 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  ;.    int iPage 
1b000 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
1b010 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
1b020 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
1b030 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1b040 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1b050 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1b060 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  , pCur->aiIdx[iP
1b070 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  age], &info);.  
1b080 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70    assert( memcmp
1b090 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
1b0a0 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
1b0b0 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
1b0c0 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
1b0d0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
1b0e0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53  endif.#ifdef _MS
1b0f0 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61  C_VER.  /* Use a
1b100 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69   real function i
1b110 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61  n MSVC to work a
1b120 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68  round bugs in th
1b130 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a  at compiler. */.
1b140 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65    static void ge
1b150 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
1b160 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69  or *pCur){.    i
1b170 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
1b180 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
1b190 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
1b1a0 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 73  ->iPage;.      s
1b1b0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
1b1c0 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
1b1d0 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
1b1e0 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
1b1f0 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
1b200 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1b210 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
1b220 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c        assertCell
1b230 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
1b240 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  }.  }.#else /* i
1b250 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a  f not _MSC_VER *
1b260 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63  /.  /* Use a mac
1b270 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ro in all other 
1b280 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61  compilers so tha
1b290 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  t the function i
1b2a0 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65  s inlined */.#de
1b2b0 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f  fine getCellInfo
1b2c0 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20  (pCur)          
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1b300 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1b310 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20  Size==0 ){      
1b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b340 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1b350 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1b360 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20  Cur->iPage;     
1b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1b3a0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b3b0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
1b3c0 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
1b3d0 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
1b3e0 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c  ,&pCur->info); \
1b3f0 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
1b400 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20 20  NKey = 1;       
1b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b440 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20  \.  }else{      
1b450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b490 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c   \.    assertCel
1b4a0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20  lInfo(pCur);    
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4e0 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    \.  }.#endif /
1b4f0 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f  * _MSC_VER */../
1b500 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
1b510 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
1b520 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64  he buffer needed
1b530 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
1b540 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ue of.** the key
1b550 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
1b560 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20   entry.  If the 
1b570 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
1b580 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
1b590 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69  alid entry, *pSi
1b5a0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  ze is set to 0. 
1b5b0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62  .**.** For a tab
1b5c0 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b  le with the INTK
1b5d0 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69  EY flag set, thi
1b5e0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1b5f0 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73  s the key.** its
1b600 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  elf, not the num
1b610 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1b620 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  the key..*/.int 
1b630 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
1b640 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
1b650 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  ur, i64 *pSize){
1b660 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1b670 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1b680 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1b690 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
1b6a0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1b6b0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1b6c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1b6d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1b6e0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1b6f0 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
1b700 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1b710 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  D );.    if( pCu
1b720 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1b730 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
1b740 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20     *pSize = 0;. 
1b750 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b760 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1b770 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  );.      *pSize 
1b780 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
1b790 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  y;.    }.  }.  r
1b7a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b7b0 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
1b7c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1b7d0 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
1b7e0 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
1b7f0 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
1b800 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c  y points to.  Al
1b810 77 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c 49  ways return SQLI
1b820 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72  TE_OK..** Failur
1b830 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  e is not possibl
1b840 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  e.  If the curso
1b850 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  r is not current
1b860 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  ly.** pointing t
1b870 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69 63  o an entry (whic
1b880 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f  h can happen, fo
1b890 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a  r example, if.**
1b8a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1b8b0 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70 53   empty) then *pS
1b8c0 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ize is set to 0.
1b8d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b8e0 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43  treeDataSize(BtC
1b8f0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1b900 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
1b910 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1b920 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1b930 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
1b940 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
1b950 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
1b960 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b970 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1b980 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1b990 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
1b9a0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1b9b0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1b9c0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1b9d0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1b9e0 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  ID ){.      /* N
1b9f0 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
1ba00 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20 73   valid entry - s
1ba10 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20  et *pSize to 0. 
1ba20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  */.      *pSize 
1ba30 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1ba40 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66        getCellInf
1ba50 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a  o(pCur);.      *
1ba60 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
1ba70 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a  fo.nData;.    }.
1ba80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1ba90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1baa0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1bab0 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
1bac0 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
1bad0 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
1bae0 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
1baf0 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
1bb00 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1bb10 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1bb20 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
1bb30 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
1bb40 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
1bb50 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
1bb60 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
1bb70 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
1bb80 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
1bb90 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
1bba0 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
1bbb0 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
1bbc0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1bbd0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1bbe0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1bbf0 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
1bc00 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
1bc10 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
1bc20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1bc30 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
1bc40 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
1bc50 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
1bc60 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
1bc70 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
1bc80 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
1bc90 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
1bca0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
1bcb0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
1bcc0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
1bcd0 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
1bce0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
1bcf0 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
1bd00 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
1bd10 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
1bd20 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
1bd30 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
1bd40 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
1bd50 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
1bd60 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
1bd70 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
1bd80 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
1bd90 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
1bda0 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
1bdb0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
1bdc0 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
1bdd0 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
1bde0 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
1bdf0 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
1be00 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
1be10 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
1be20 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
1be30 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
1be40 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
1be50 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
1be60 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1be70 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  Bt, .  Pgno ovfl
1be80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1be90 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20      /* Overflow 
1bea0 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  page */.  MemPag
1beb0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
1bec0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
1bed0 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d  emPage handle (m
1bee0 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20  ay be NULL) */. 
1bef0 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74   Pgno *pPgnoNext
1bf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bf10 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66   OUT: Next overf
1bf20 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
1bf30 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78  */.){.  Pgno nex
1bf40 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  t = 0;.  MemPage
1bf50 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
1bf60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1bf70 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
1bf80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1bf90 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1bfa0 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65    assert(pPgnoNe
1bfb0 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  xt);..#ifndef SQ
1bfc0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1bfd0 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
1bfe0 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
1bff0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1c000 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
1c010 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
1c020 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
1c030 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
1c040 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1c050 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
1c060 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
1c070 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
1c080 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
1c090 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
1c0a0 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
1c0b0 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
1c0c0 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
1c0d0 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
1c0e0 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
1c0f0 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
1c100 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
1c110 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1c120 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
1c130 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
1c140 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
1c150 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
1c160 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
1c170 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
1c180 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
1c190 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1c1a0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1c1b0 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
1c1c0 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
1c1d0 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  =pagerPagecount(
1c1e0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pBt) ){.      rc
1c1f0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1c200 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
1c210 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
1c220 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c230 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d  K && eType==PTRM
1c240 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20  AP_OVERFLOW2 && 
1c250 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20  pgno==ovfl ){.  
1c260 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75        next = iGu
1c270 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ess;.        rc 
1c280 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1c290 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c2a0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72  .#endif..  if( r
1c2b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c2c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c2d0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
1c2e0 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
1c2f0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 72  0);.    assert(r
1c300 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
1c310 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69  pPage==0);.    i
1c320 66 28 20 6e 65 78 74 3d 3d 30 20 26 26 20 72 63  f( next==0 && rc
1c330 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c340 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
1c350 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1c360 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
1c370 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
1c380 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
1c390 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
1c3a0 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
1c3b0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
1c3c0 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
1c3d0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
1c3e0 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
1c3f0 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
1c400 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
1c410 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
1c420 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
1c430 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
1c440 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
1c450 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
1c460 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
1c470 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1c480 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
1c490 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
1c4a0 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
1c4b0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
1c4c0 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
1c4d0 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
1c4e0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
1c4f0 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
1c500 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
1c510 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
1c520 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
1c530 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
1c540 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
1c550 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
1c560 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
1c570 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
1c580 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
1c590 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1c5a0 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
1c5b0 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
1c5c0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
1c5d0 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
1c5e0 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
1c5f0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
1c600 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
1c610 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
1c620 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
1c630 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1c640 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
1c650 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
1c660 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c670 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
1c680 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
1c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6a0 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
1c6b0 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
1c6c0 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
1c6d0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
1c6e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1c6f0 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
1c700 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
1c710 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
1c720 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
1c730 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
1c740 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
1c750 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
1c760 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1c770 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
1c780 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c790 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1c7a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1c7b0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
1c7c0 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
1c7d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1c7e0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1c7f0 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
1c800 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
1c810 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
1c820 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
1c830 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
1c840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c850 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1c860 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
1c870 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
1c880 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
1c890 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
1c8a0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
1c8b0 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
1c8c0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49  s pointing to. I
1c8d0 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72  f the eOp.** par
1c8e0 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 69  ameter is 0, thi
1c8f0 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
1c900 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69  ation (data copi
1c910 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65  ed into.** buffe
1c920 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20 69  r pBuf). If it i
1c930 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72  s non-zero, a wr
1c940 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65 64  ite (data copied
1c950 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20   from.** buffer 
1c960 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  pBuf)..**.** A t
1c970 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
1c980 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
1c990 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
1c9a0 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
1c9b0 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
1c9c0 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
1c9d0 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
1c9e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
1c9f0 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69  es not make a di
1ca00 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65  stinction betwee
1ca10 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e 0a  n key and data..
1ca20 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64 73  ** It just reads
1ca30 20 6f 72 20 77 72 69 74 65 73 20 62 79 74 65 73   or writes bytes
1ca40 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61   from the payloa
1ca50 64 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69  d area.  Data mi
1ca60 67 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f  ght .** appear o
1ca70 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 20  n the main page 
1ca80 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
1ca90 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
1caa0 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67  overflow .** pag
1cab0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
1cac0 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72   BtCursor.isIncr
1cad0 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
1cae0 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20  is set, and the 
1caf0 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f  current.** curso
1cb00 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65  r entry uses one
1cb10 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
1cb20 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66 75  w pages, this fu
1cb30 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  nction.** alloca
1cb40 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e  tes space for an
1cb50 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74  d lazily popluat
1cb60 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  es the overflow 
1cb70 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61  page-list .** ca
1cb80 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72  che array (BtCur
1cb90 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20  sor.aOverflow). 
1cba0 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
1cbb0 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63   use this.** cac
1cbc0 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
1cbd0 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
1cbe0 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65  ed offset more e
1cbf0 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
1cc00 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
1cc10 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1cc20 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
1cc30 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
1cc40 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
1cc50 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
1cc60 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
1cc70 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
1cc80 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
1cc90 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
1cca0 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
1ccb0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
1ccc0 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
1ccd0 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
1cce0 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
1ccf0 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
1cd00 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1cd10 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
1cd20 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1cd30 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
1cd40 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
1cd50 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
1cd60 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
1cd70 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
1cd80 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
1cd90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
1cda0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1cdb0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
1cdc0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1cdd0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
1cde0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
1cdf0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
1ce00 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
1ce10 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
1ce20 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
1ce30 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
1ce40 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
1ce50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
1ce60 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
1ce70 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1ce80 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
1ce90 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
1cea0 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
1ceb0 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  / .  int skipKey
1cec0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66  ,         /* off
1ced0 73 65 74 20 62 65 67 69 6e 73 20 61 74 20 64 61  set begins at da
1cee0 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72  ta if this is tr
1cef0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20  ue */.  int eOp 
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cf10 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
1cf20 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
1cf30 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
1cf40 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
1cf50 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1cf60 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b  ITE_OK;.  u32 nK
1cf70 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  ey;.  int iIdx =
1cf80 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1cf90 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1cfa0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1cfb0 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20  ; /* Btree page 
1cfc0 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
1cfd0 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
1cfe0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
1cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d000 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
1d010 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
1d020 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
1d030 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
1d040 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1d050 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1d060 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1d070 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1d080 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
1d090 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
1d0a0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1d0b0 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65  Cur) );..  getCe
1d0c0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1d0d0 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
1d0e0 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43  >info.pCell + pC
1d0f0 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
1d100 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67  ;.  nKey = (pPag
1d110 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20  e->intKey ? 0 : 
1d120 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
1d130 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b  nKey);..  if( sk
1d140 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66 66  ipKey ){.    off
1d150 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d  set += nKey;.  }
1d160 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d  .  if( offset+am
1d170 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69  t > nKey+pCur->i
1d180 6e 66 6f 2e 6e 44 61 74 61 20 0a 20 20 20 7c 7c  nfo.nData .   ||
1d190 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
1d1a0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
1d1b0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
1d1c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20  t->usableSize]. 
1d1d0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
1d1e0 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
1d1f0 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
1d200 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
1d210 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
1d220 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1d230 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
1d240 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
1d250 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
1d260 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
1d270 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
1d280 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
1d290 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
1d2a0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
1d2b0 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
1d2c0 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
1d2d0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1d2e0 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
1d2f0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
1d300 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
1d310 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
1d320 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
1d330 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
1d340 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  eOp, pPage->pDbP
1d350 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
1d360 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
1d370 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
1d380 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
1d390 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
1d3a0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
1d3b0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1d3c0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
1d3d0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
1d3e0 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
1d3f0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
1d400 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
1d410 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
1d420 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
1d430 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
1d440 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
1d450 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
1d460 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23  nfo.nLocal]);..#
1d470 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d480 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
1d490 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72  /* If the isIncr
1d4a0 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
1d4b0 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42  is set and the B
1d4c0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
1d4d0 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  w[].    ** has n
1d4e0 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
1d4f0 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e  d, allocate it n
1d500 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73  ow. The array is
1d510 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a   sized at.    **
1d520 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
1d530 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
1d540 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
1d550 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20  w chain. The.   
1d560 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20   ** page number 
1d570 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
1d580 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74  rflow page is st
1d590 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
1d5a0 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63  w[0],.    ** etc
1d5b0 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
1d5c0 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
1d5d0 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e  ] array means "n
1d5e0 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20  ot yet known".  
1d5f0 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20    ** (the cache 
1d600 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
1d610 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
1d620 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63   if( pCur->isInc
1d630 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21  rblobHandle && !
1d640 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1d650 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
1d660 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
1d670 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
1d680 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
1d690 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
1d6a0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
1d6b0 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20  verflow = (Pgno 
1d6c0 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
1d6d0 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29  ero(sizeof(Pgno)
1d6e0 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 69  *nOvfl);.      i
1d6f0 66 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43 75  f( nOvfl && !pCu
1d700 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
1d710 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1d720 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1d730 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1d740 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
1d750 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1d760 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
1d770 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
1d780 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
1d790 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20   first required 
1d7a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
1d7b0 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20   valid, skip.   
1d7c0 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
1d7d0 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
1d7e0 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
1d7f0 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
1d800 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
1d810 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
1d820 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
1d830 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
1d840 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
1d850 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1d860 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d  ;.      offset =
1d870 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
1d880 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
1d890 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d  ..    for( ; rc=
1d8a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1d8b0 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b  t>0 && nextPage;
1d8c0 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64   iIdx++){..#ifnd
1d8d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1d8e0 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a  NCRBLOB.      /*
1d8f0 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
1d900 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
1d910 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1d920 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  che. */.      if
1d930 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
1d940 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  w ){.        ass
1d950 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
1d960 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43  flow[iIdx] || pC
1d970 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1d980 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a  dx]==nextPage);.
1d990 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
1d9a0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
1d9b0 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20  nextPage;.      
1d9c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
1d9d0 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
1d9e0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1d9f0 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
1da00 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
1da10 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
1da20 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
1da30 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
1da40 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1da50 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
1da60 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
1da70 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
1da80 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
1da90 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
1daa0 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
1dab0 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
1dac0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
1dad0 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
1dae0 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
1daf0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
1db00 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
1db10 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
1db20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1db30 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1db40 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
1db50 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
1db60 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1db70 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
1db80 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
1db90 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1dba0 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  +1];.        } e
1dbb0 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
1dbc0 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
1dbd0 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
1dbe0 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
1dbf0 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
1dc00 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
1dc10 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
1dc20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
1dc30 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
1dc40 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
1dc50 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
1dc60 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
1dc70 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
1dc80 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
1dc90 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
1dca0 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
1dcb0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1dcc0 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
1dcd0 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ge;.        int 
1dce0 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20  a = amt;.       
1dcf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1dd00 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
1dd10 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
1dd20 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1dd30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1dd40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
1dd50 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
1dd60 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
1dd70 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1dd80 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
1dd90 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
1dda0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
1ddb0 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
1ddc0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1ddd0 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
1dde0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
1ddf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1de00 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
1de10 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
1de20 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
1de30 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  eOp, pDbPage);. 
1de40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1de50 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
1de60 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ge);.          o
1de70 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
1de80 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
1de90 20 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d           pBuf +=
1dea0 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   a;.        }.  
1deb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1dec0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ded0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
1dee0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1def0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1df00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1df10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
1df20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
1df30 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1df40 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
1df50 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
1df60 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
1df70 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
1df80 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
1df90 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
1dfa0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
1dfb0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1dfc0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
1dfd0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
1dfe0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
1dff0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
1e000 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
1e010 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
1e020 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
1e030 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
1e040 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
1e050 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74  lite3BtreeKey(Bt
1e060 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1e070 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1e080 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1e090 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1e0a0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1e0b0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1e0c0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
1e0d0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1e0e0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1e0f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1e100 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1e110 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e120 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1e130 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
1e140 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
1e150 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
1e160 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 70 50     if( pCur->apP
1e170 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[0]->intKey )
1e180 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1e190 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e1a0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  PT;.    }.    as
1e1b0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1e1c0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1e1d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1e1e0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
1e1f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65  );.    rc = acce
1e200 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
1e210 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
1e220 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
1e230 66 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  f, 0, 0);.  }.  
1e240 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e250 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
1e260 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69   the data associ
1e270 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
1e280 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
1e290 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
1e2a0 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
1e2b0 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
1e2c0 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
1e2d0 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
1e2e0 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
1e2f0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
1e300 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
1e310 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
1e320 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
1e330 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
1e340 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
1e350 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
1e360 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
1e370 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
1e380 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1e390 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f  treeData(BtCurso
1e3a0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
1e3b0 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
1e3c0 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
1e3d0 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51   rc;..#ifndef SQ
1e3e0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1e3f0 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e  OB.  if ( pCur->
1e400 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1e410 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  NVALID ){.    re
1e420 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
1e430 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
1e440 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1e450 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1e460 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
1e470 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
1e480 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1e490 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e4a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e4b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1e4c0 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
1e4d0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
1e4e0 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
1e4f0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
1e500 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1e510 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1e520 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
1e530 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1e540 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
1e550 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
1e560 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
1e570 20 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30   amt, pBuf, 1, 0
1e580 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1e590 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1e5a0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1e5b0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
1e5c0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
1e5d0 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
1e5e0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
1e5f0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
1e600 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
1e610 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1e620 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
1e630 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
1e640 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
1e650 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
1e660 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
1e670 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
1e680 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
1e690 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
1e6a0 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
1e6b0 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
1e6c0 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
1e6d0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
1e6e0 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
1e6f0 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
1e700 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e710 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
1e720 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
1e730 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
1e740 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
1e750 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
1e760 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
1e770 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
1e780 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
1e790 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
1e7a0 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
1e7b0 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
1e7c0 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
1e7d0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
1e7e0 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
1e7f0 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
1e800 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
1e810 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
1e820 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
1e830 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
1e840 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
1e850 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
1e860 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
1e870 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
1e880 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
1e890 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
1e8a0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
1e8b0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
1e8c0 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
1e8d0 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
1e8e0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1e8f0 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
1e900 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
1e910 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
1e920 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
1e930 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1e940 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
1e950 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1e960 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  r *fetchPayload(
1e970 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1e980 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
1e990 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
1e9a0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
1e9b0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c   */.  int *pAmt,
1e9c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1e9d0 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
1e9e0 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
1e9f0 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
1ea00 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
1ea10 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69   /* read beginni
1ea20 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ng at data if th
1ea30 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b  is is true */.){
1ea40 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1ea50 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65   *aPayload;.  Me
1ea60 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
1ea70 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20  u32 nKey;.  u32 
1ea80 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72  nLocal;..  asser
1ea90 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
1eaa0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
1eab0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1eac0 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73  r->iPage]);.  as
1ead0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1eae0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1eaf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
1eb00 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1eb10 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20  Cur) );.  pPage 
1eb20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1eb30 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
1eb40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1eb50 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1eb60 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1eb70 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1eb80 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
1eb90 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
1eba0 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b  ll;.  aPayload +
1ebb0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  = pCur->info.nHe
1ebc0 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ader;.  if( pPag
1ebd0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
1ebe0 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c   nKey = 0;.  }el
1ebf0 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28  se{.    nKey = (
1ec00 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
1ec10 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  Key;.  }.  if( s
1ec20 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50  kipKey ){.    aP
1ec30 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
1ec40 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
1ec50 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
1ec60 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nKey;.  }else{.
1ec70 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
1ec80 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
1ec90 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e      if( nLocal>n
1eca0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f  Key ){.      nLo
1ecb0 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  cal = nKey;.    
1ecc0 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20  }.  }.  *pAmt = 
1ecd0 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e  nLocal;.  return
1ece0 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f   aPayload;.}.../
1ecf0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
1ed00 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
1ed10 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
1ed20 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
1ed30 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
1ed40 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
1ed50 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
1ed60 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
1ed70 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
1ed80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
1ed90 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
1eda0 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
1edb0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
1edc0 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
1edd0 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
1ede0 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
1edf0 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
1ee00 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
1ee10 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
1ee20 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
1ee30 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
1ee40 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
1ee50 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
1ee60 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
1ee70 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
1ee80 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
1ee90 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
1eea0 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
1eeb0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
1eec0 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
1eed0 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
1eee0 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
1eef0 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
1ef00 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
1ef10 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
1ef20 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
1ef30 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
1ef40 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74  lite3BtreeKeyFet
1ef50 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
1ef60 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
1ef70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1ef80 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1ef90 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1efa0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1efb0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1efc0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
1efd0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1efe0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
1eff0 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73      return (cons
1f000 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
1f010 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
1f020 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1f030 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69  n 0;.}.const voi
1f040 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44  d *sqlite3BtreeD
1f050 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f  ataFetch(BtCurso
1f060 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
1f070 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  mt){.  assert( s
1f080 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1f090 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1f0a0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
1f0b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1f0c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1f0d0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
1f0e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1f0f0 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
1f100 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
1f110 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
1f120 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20   pAmt, 1);.  }. 
1f130 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
1f140 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1f150 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
1f160 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
1f170 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
1f180 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
1f190 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1f1a0 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
1f1b0 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  move to..*/.stat
1f1c0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
1f1d0 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
1f1e0 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
1f1f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
1f200 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65   i = pCur->iPage
1f210 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  ;.  MemPage *pNe
1f220 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  wPage;.  BtShare
1f230 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
1f240 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
1f250 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1f260 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1f270 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1f280 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1f290 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1f2a0 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f  >iPage<BTCURSOR_
1f2b0 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69  MAX_DEPTH );.  i
1f2c0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
1f2d0 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  (BTCURSOR_MAX_DE
1f2e0 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  PTH-1) ){.    re
1f2f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1f300 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
1f310 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
1f320 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
1f330 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20  , &pNewPage);.  
1f340 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1f350 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61  rc;.  pCur->apPa
1f360 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61  ge[i+1] = pNewPa
1f370 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  ge;.  pCur->aiId
1f380 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43  x[i+1] = 0;.  pC
1f390 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20  ur->iPage++;..  
1f3a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1f3b0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
1f3c0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
1f3d0 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65  f( pNewPage->nCe
1f3e0 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74 75  ll<1 ){.    retu
1f3f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1f400 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
1f410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f420 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
1f430 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61  G./*.** Page pPa
1f440 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72  rent is an inter
1f450 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74  nal (non-leaf) t
1f460 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  ree page. This f
1f470 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65  unction .** asse
1f480 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75  rts that page nu
1f490 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
1f4a0 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66  he left-child if
1f4b0 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20   the iIdx'th.** 
1f4c0 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61  cell in page pPa
1f4d0 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64  rent. Or, if iId
1f4e0 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68  x is equal to th
1f4f0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1f500 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50  f.** cells in pP
1f510 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65  arent, that page
1f520 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
1f530 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
1f540 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  d of.** the page
1f550 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1f560 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
1f570 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ex(MemPage *pPar
1f580 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50  ent, int iIdx, P
1f590 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61  gno iChild){.  a
1f5a0 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61  ssert( iIdx<=pPa
1f5b0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  rent->nCell );. 
1f5c0 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65   if( iIdx==pPare
1f5d0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
1f5e0 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
1f5f0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
1f600 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
1f610 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64  fset+8])==iChild
1f620 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
1f630 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
1f640 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  e(findCell(pPare
1f650 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69  nt, iIdx))==iChi
1f660 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  ld );.  }.}.#els
1f670 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65  e.#  define asse
1f680 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c  rtParentIndex(x,
1f690 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a  y,z) .#endif../*
1f6a0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
1f6b0 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61  sor up to the pa
1f6c0 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  rent page..**.**
1f6d0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
1f6e0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e  t to the cell in
1f6f0 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
1f700 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  s the pointer.**
1f710 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20   to the page we 
1f720 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e  are coming from.
1f730 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69    If we are comi
1f740 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72  ng from the.** r
1f750 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
1f760 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e  page then pCur->
1f770 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  idx is set to on
1f780 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
1f790 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20  he largest cell 
1f7a0 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
1f7b0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54  qlite3BtreeMoveT
1f7c0 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72  oParent(BtCursor
1f7d0 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
1f7e0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1f7f0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1f800 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1f810 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1f820 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
1f830 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
1f840 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1f850 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1f860 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50  ge] );.  assertP
1f870 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20  arentIndex(.    
1f880 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1f890 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
1f8a0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1f8b0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
1f8c0 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
1f8d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67  pCur->iPage]->pg
1f8e0 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61 73  no.  );.  releas
1f8f0 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
1f900 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
1f910 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d  ;.  pCur->iPage-
1f920 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  -;.  pCur->info.
1f930 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
1f940 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1f950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
1f960 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
1f970 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a 73  e root page.*/.s
1f980 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
1f990 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Root(BtCursor *p
1f9a0 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
1f9b0 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  *pRoot;.  int rc
1f9c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f9d0 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d  Btree *p = pCur-
1f9e0 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61  >pBtree;.  BtSha
1f9f0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1fa00 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
1fa10 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1fa20 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1fa30 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
1fa40 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
1fa50 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
1fa60 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
1fa70 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
1fa80 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
1fa90 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
1faa0 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
1fab0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
1fac0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
1fad0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
1fae0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
1faf0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1fb00 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
1fb10 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
1fb20 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ip;.    }.    sq
1fb30 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
1fb40 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d  ursor(pCur);.  }
1fb50 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ..  if( pCur->iP
1fb60 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  age>=0 ){.    in
1fb70 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  t i;.    for(i=1
1fb80 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
1fb90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
1fba0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
1fbb0 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
1fbc0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
1fbd0 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  f( .      SQLITE
1fbe0 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e  _OK!=(rc = getAn
1fbf0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
1fc00 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
1fc10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29  pCur->apPage[0])
1fc20 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  ).    ){.      p
1fc30 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1fc40 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
1fc50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1fc60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 6f 6f     }.  }..  pRoo
1fc70 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
1fc80 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
1fc90 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
1fca0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20  ->pgnoRoot );.  
1fcb0 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b  pCur->iPage = 0;
1fcc0 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30  .  pCur->aiIdx[0
1fcd0 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  ] = 0;.  pCur->i
1fce0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1fcf0 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
1fd00 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
1fd10 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28  NKey = 0;..  if(
1fd20 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30   pRoot->nCell==0
1fd30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66   && !pRoot->leaf
1fd40 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
1fd50 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52  page;.    if( pR
1fd60 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72  oot->pgno!=1 ) r
1fd70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1fd80 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
1fd90 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
1fda0 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62  no==1 );.    sub
1fdb0 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
1fdc0 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
1fdd0 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
1fde0 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
1fdf0 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20  subpage>0 );.   
1fe00 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1fe10 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
1fe20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1fe30 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
1fe40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1fe50 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28  pCur->eState = (
1fe60 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29  (pRoot->nCell>0)
1fe70 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55  ?CURSOR_VALID:CU
1fe80 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20  RSOR_INVALID);. 
1fe90 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1fea0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
1feb0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
1fec0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
1fed0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
1fee0 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
1fef0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
1ff00 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
1ff10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
1ff20 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
1ff30 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
1ff40 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
1ff50 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
1ff60 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
1ff70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
1ff80 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
1ff90 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
1ffa0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
1ffb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ffc0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1ffd0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1ffe0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1fff0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
20000 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
20010 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
20020 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
20030 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
20040 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
20050 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
20060 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
20070 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
20080 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
20090 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
200a0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
200b0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
200c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
200d0 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20  ->iPage]));.    
200e0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
200f0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
20100 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20110 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
20120 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
20130 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
20140 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
20150 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
20160 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
20170 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
20180 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
20190 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
201a0 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
201b0 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
201c0 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
201d0 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
201e0 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
201f0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
20200 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
20210 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
20220 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
20230 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
20240 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
20250 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
20260 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
20270 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
20280 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
20290 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
202a0 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
202b0 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
202c0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
202d0 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
202e0 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
202f0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
20300 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
20310 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
20320 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
20330 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
20340 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
20350 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
20360 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
20370 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
20380 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
20390 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
203a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
203b0 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
203c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
203d0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
203e0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
203f0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
20400 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
20410 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
20420 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
20430 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
20440 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
20450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
20460 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
20470 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
20480 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75  nCell-1;.    pCu
20490 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
204a0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
204b0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  idNKey = 0;.  }.
204c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
204d0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
204e0 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
204f0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
20500 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
20510 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
20520 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
20530 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
20540 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
20550 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
20560 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
20570 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
20580 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
20590 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
205a0 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
205b0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
205c0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
205d0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
205e0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
205f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20600 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
20610 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
20620 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
20630 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
20640 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
20650 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
20660 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
20670 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
20680 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20690 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
206a0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
206b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
206c0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  s = 1;.      rc 
206d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
206e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
206f0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
20700 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
20710 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
20720 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
20730 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
20740 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
20750 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
20760 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
20770 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
20780 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
20790 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
207a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
207b0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
207c0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
207d0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
207e0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
207f0 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
20800 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
20810 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
20820 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
20830 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
20840 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
20850 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
20860 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  . .  assert( cur
20870 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
20880 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
20890 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
208a0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
208b0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
208c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
208d0 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  sor already poin
208e0 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ts to the last e
208f0 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20  ntry, this is a 
20900 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
20910 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
20920 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43  ur->eState && pC
20930 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69  ur->atLast ){.#i
20940 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
20950 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
20960 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
20970 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
20980 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
20990 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
209a0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
209b0 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
209c0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
209d0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
209e0 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
209f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
20a00 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
20a10 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
20a20 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
20a30 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
20a40 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
20a50 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72  ur->iPage]==pCur
20a60 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
20a70 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
20a80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
20a90 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
20aa0 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
20ab0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
20ac0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
20ad0 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
20ae0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
20af0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20b00 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
20b10 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
20b20 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
20b30 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
20b40 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
20b50 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
20b60 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
20b70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20b80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
20b90 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
20ba0 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
20bb0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
20bc0 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
20bd0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
20be0 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
20bf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31  rc==SQLITE_OK ?1
20c00 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  :0;.    }.  }.  
20c10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20c20 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
20c30 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
20c40 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
20c50 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
20c60 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64  specified by pId
20c70 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20  xKey or intKey. 
20c80 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65    Return a succe
20c90 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46  ss code..**.** F
20ca0 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
20cb0 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72  , the intKey par
20cc0 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
20cd0 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73   pIdxKey .** mus
20ce0 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20  t be NULL.  For 
20cf0 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49  index tables, pI
20d00 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e  dxKey is used an
20d10 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69  d intKey.** is i
20d20 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
20d30 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
20d40 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
20d50 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
20d60 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
20d70 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
20d80 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
20d90 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
20da0 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
20db0 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
20dc0 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
20dd0 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
20de0 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
20df0 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
20e00 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  key..**.** An in
20e10 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e  teger is written
20e20 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63   into *pRes whic
20e30 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  h is the result 
20e40 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20  of.** comparing 
20e50 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
20e60 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
20e70 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a  the cursor is .*
20e80 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65  * pointing.  The
20e90 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
20ea0 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20  integer written 
20eb0 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73  into.** *pRes is
20ec0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
20ed0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
20ee0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
20ef0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
20f00 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
20f10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20f20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
20f30 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
20f40 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61  Key or if the ta
20f50 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20  ble is empty.** 
20f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f70 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
20f80 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66  is therefore lef
20f90 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69  t point to nothi
20fa0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ng..**.**     *p
20fb0 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63  Res==0     The c
20fc0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
20fd0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
20fe0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
20ff0 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63              exac
21000 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b  tly matches intK
21010 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
21020 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
21030 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
21040 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
21050 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
21060 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21070 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
21080 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
21090 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c  y..**.*/.int sql
210a0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
210b0 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
210c0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
210d0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
210e0 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
210f0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
21100 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
21110 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
21120 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
21130 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
21140 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
21150 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
21160 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
21170 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
21180 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
21190 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
211a0 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
211b0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
211c0 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
211d0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
211e0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
211f0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
21200 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
21210 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
21220 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
21230 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
21240 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
21250 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
21260 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
21270 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
21280 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
21290 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
212a0 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
212b0 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
212c0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d  k */.  if( pCur-
212d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
212e0 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76  VALID && pCur->v
212f0 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20  alidNKey .   && 
21300 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
21310 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20  >intKey .  ){.  
21320 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
21330 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  .nKey==intKey ){
21340 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
21350 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
21360 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
21370 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74      if( pCur->at
21380 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e  Last && pCur->in
21390 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29  fo.nKey<intKey )
213a0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
213b0 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
213c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
213d0 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  }.  }..  rc = mo
213e0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
213f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
21400 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
21410 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
21420 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21430 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
21440 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21450 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69  r->iPage]->isIni
21460 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  t );.  if( pCur-
21470 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21480 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
21490 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
214a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
214b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
214c0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
214d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
214e0 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
214f0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
21500 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64  ]->intKey || pId
21510 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b  xKey );.  for(;;
21520 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
21530 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  upr;.    Pgno ch
21540 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
21550 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
21560 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21570 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 20  age];.    int c 
21580 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72  = -1;  /* pRes r
21590 65 74 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69  eturn if table i
215a0 73 20 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20  s empty must be 
215b0 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20  -1 */.    lwr = 
215c0 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61  0;.    upr = pPa
215d0 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
215e0 20 69 66 28 20 28 21 70 50 61 67 65 2d 3e 69 6e   if( (!pPage->in
215f0 74 4b 65 79 20 26 26 20 70 49 64 78 4b 65 79 3d  tKey && pIdxKey=
21600 3d 30 29 20 7c 7c 20 75 70 72 3c 30 20 29 7b 0a  =0) || upr<0 ){.
21610 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21620 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21630 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
21640 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
21650 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68      if( biasRigh
21660 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
21670 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
21680 67 65 5d 20 3d 20 28 75 31 36 29 75 70 72 3b 0a  ge] = (u16)upr;.
21690 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
216a0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
216b0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
216c0 29 28 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a  )((upr+lwr)/2);.
216d0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b      }.    for(;;
216e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  ){.      int idx
216f0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
21700 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
21710 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74  Index of current
21720 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
21730 2f 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  /.      u8 *pCel
21740 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
21750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
21760 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
21770 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
21780 2a 2f 0a 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  */..      pCur->
21790 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
217a0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
217b0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
217c0 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
217d0 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
217e0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
217f0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  y ){.        i64
21800 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
21810 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
21820 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  sData ){.       
21830 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
21840 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d          pCell +=
21850 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65   getVarint32(pCe
21860 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20  ll, dummy);.    
21870 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
21880 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
21890 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b  u64*)&nCellKey);
218a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
218b0 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  llKey==intKey ){
218c0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30  .          c = 0
218d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
218e0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74  if( nCellKey<int
218f0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
21900 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   c = -1;.       
21910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21920 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b    assert( nCellK
21930 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  ey>intKey );.   
21940 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20         c = +1;. 
21950 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21960 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
21970 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
21980 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
21990 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
219a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
219b0 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75  * The maximum su
219c0 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a  pported page-siz
219d0 65 20 69 73 20 33 32 37 36 38 20 62 79 74 65 73  e is 32768 bytes
219e0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
219f0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
21a00 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
21a10 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20  of record bytes 
21a20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64  stored on an ind
21a30 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  ex B-Tree.      
21a40 20 20 2a 2a 20 70 61 67 65 20 69 73 20 61 74 20    ** page is at 
21a50 6d 6f 73 74 20 38 31 39 38 20 62 79 74 65 73 2c  most 8198 bytes,
21a60 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 74   which may be st
21a70 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65  ored as a 2-byte
21a80 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69  .        ** vari
21a90 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  nt. This informa
21aa0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
21ab0 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64  attempt to avoid
21ac0 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20   parsing .      
21ad0 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20    ** the entire 
21ae0 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67  cell by checking
21af0 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77   for the cases w
21b00 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20  here the record 
21b10 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  is .        ** s
21b20 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77  tored entirely w
21b30 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
21b40 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74   page by inspect
21b50 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20  ing the first . 
21b60 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65         ** 2 byte
21b70 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20  s of the cell.. 
21b80 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
21b90 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43    int nCell = pC
21ba0 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
21bb0 69 66 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78  if( !(nCell & 0x
21bc0 38 30 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70 50  80) && nCell<=pP
21bd0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
21be0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
21bf0 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
21c00 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
21c10 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
21c20 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
21c30 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
21c40 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
21c50 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
21c60 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
21c70 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
21c80 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
21c90 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
21ca0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
21cb0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
21cc0 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
21cd0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
21ce0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
21cf0 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
21d00 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
21d10 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
21d20 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
21d30 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
21d40 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a  ocal.        ){.
21d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21d60 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
21d70 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76  ld is a 2 byte v
21d80 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
21d90 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20  cord .          
21da0 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  ** fits entirely
21db0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
21dc0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
21dd0 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
21de0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
21df0 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
21e00 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
21e10 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
21e20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21e30 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
21e40 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
21e50 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
21e60 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
21e70 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
21e80 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
21e90 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
21ea0 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
21eb0 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
21ec0 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
21ed0 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
21ee0 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
21ef0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
21f00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
21f10 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
21f20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
21f30 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a  can be called. *
21f40 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  /.          void
21f50 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
21f60 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74        u8 * const
21f70 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65   pCellBody = pCe
21f80 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll - pPage->chil
21f90 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
21fa0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
21fb0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
21fc0 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26  ge, pCellBody, &
21fd0 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
21fe0 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28         nCell = (
21ff0 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
22000 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
22010 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
22020 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29  3Malloc( nCell )
22030 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22040 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
22050 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
22060 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
22070 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
22080 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
22090 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
220a0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
220b0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
220c0 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64  nCell, (unsigned
220d0 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c   char*)pCellKey,
220e0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
220f0 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
22100 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
22110 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  Cell, pCellKey, 
22120 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
22130 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22140 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
22150 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
22160 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
22170 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
22180 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
22190 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
221a0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
221b0 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
221c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
221d0 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
221e0 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31     upr = lwr - 1
221f0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
22200 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
22210 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65  {.          *pRe
22220 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
22230 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22240 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
22250 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
22260 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22270 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29  .      if( c<0 )
22280 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20  {.        lwr = 
22290 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c  idx+1;.      }el
222a0 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20  se{.        upr 
222b0 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d  = idx-1;.      }
222c0 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75  .      if( lwr>u
222d0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  pr ){.        br
222e0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
222f0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
22300 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
22310 31 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29  16)((lwr+upr)/2)
22320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
22330 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29  rt( lwr==upr+1 )
22340 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
22350 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
22360 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
22370 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  af ){.      chld
22380 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  Pg = 0;.    }els
22390 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65  e if( lwr>=pPage
223a0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
223b0 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
223c0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
223d0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
223e0 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
223f0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
22400 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
22410 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b  ll(pPage, lwr));
22420 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
22430 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  hldPg==0 ){.    
22440 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22450 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22460 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
22470 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
22480 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ell );.      if(
22490 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20   pRes ) *pRes = 
224a0 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
224b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
224c0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
224d0 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  h;.    }.    pCu
224e0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
224f0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72  Page] = (u16)lwr
22500 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
22510 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
22520 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
22530 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
22540 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
22550 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
22560 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
22570 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f  o_finish;.  }.mo
22580 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72  veto_finish:.  r
22590 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
225a0 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
225b0 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74  on of BtreeMovet
225c0 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63  o, pKey is a pac
225d0 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ked index record
225e0 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67  .** such as is g
225f0 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
22600 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
22610 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68  code.  Unpack th
22620 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20  e.** record and 
22630 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d  then call BtreeM
22640 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
22650 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
22660 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22670 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
22680 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
22690 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
226a0 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20  on the btree to 
226b0 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
226c0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
226d0 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b  y,   /* Packed k
226e0 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20  ey if the btree 
226f0 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  is an index */. 
22700 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
22710 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
22720 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20  key for tables. 
22730 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f   Size of pKey fo
22740 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
22750 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20  nt bias,        
22760 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63     /* Bias searc
22770 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
22780 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
22790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
227a0 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
227b0 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
227c0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
227d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
227e0 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55  atus code */.  U
227f0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
22800 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70  IdxKey;   /* Unp
22810 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
22820 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65  */.  char aSpace
22830 5b 31 35 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [150];          
22840 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f  /* Temp space fo
22850 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61  r pIdxKey - to a
22860 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f  void a malloc */
22870 0a 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  ...  if( pKey ){
22880 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
22890 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
228a0 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
228b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
228c0 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d  cordUnpack(pCur-
228d0 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29  >pKeyInfo, (int)
228e0 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20  nKey, pKey,.    
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22910 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66    aSpace, sizeof
22920 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20 69  (aSpace));.    i
22930 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
22940 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
22950 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
22960 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
22970 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
22980 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
22990 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
229a0 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
229b0 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70 4b 65  pRes);.  if( pKe
229c0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
229d0 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
229e0 65 64 52 65 63 6f 72 64 28 70 49 64 78 4b 65 79  edRecord(pIdxKey
229f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
22a00 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
22a10 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
22a20 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
22a30 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
22a40 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
22a50 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
22a60 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
22a70 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
22a80 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
22a90 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
22aa0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
22ab0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
22ac0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
22ad0 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
22ae0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
22af0 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
22b00 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
22b10 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
22b20 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
22b30 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
22b40 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
22b50 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
22b60 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
22b70 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
22b80 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
22b90 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
22ba0 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
22bb0 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
22bc0 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
22bd0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
22be0 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
22bf0 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
22c00 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
22c10 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
22c20 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
22c30 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ate);.}../*.** A
22c40 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
22c50 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
22c60 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
22c70 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
22c80 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
22c90 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
22ca0 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
22cb0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
22cc0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
22cd0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
22ce0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
22cf0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
22d00 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
22d10 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Res=1..*/.int sq
22d20 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
22d30 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
22d40 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
22d50 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a   rc;.  int idx;.
22d60 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
22d70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
22d80 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
22d90 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
22da0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
22db0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
22dc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22dd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
22de0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
22df0 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Res!=0 );.  if( 
22e00 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
22e10 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
22e20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
22e30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22e40 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
22e50 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20  Cur->skip>0 ){. 
22e60 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20     pCur->skip = 
22e70 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
22e80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
22e90 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
22ea0 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20  ur->skip = 0;.. 
22eb0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
22ec0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22ed0 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43  e];.  idx = ++pC
22ee0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
22ef0 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
22f00 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
22f10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
22f20 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  <=pPage->nCell )
22f30 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ;..  pCur->info.
22f40 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
22f50 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
22f60 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61  ;.  if( idx>=pPa
22f70 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
22f80 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
22f90 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
22fa0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
22fb0 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
22fc0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
22fd0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
22fe0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
22ff0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
23000 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
23010 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
23020 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
23030 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
23040 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
23050 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
23060 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
23070 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
23080 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
23090 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
230a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
230b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
230c0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
230d0 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e  BtreeMoveToParen
230e0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
230f0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
23100 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23110 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
23120 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23130 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e  iPage]>=pPage->n
23140 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65  Cell );.    *pRe
23150 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  s = 0;.    if( p
23160 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
23170 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23180 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
23190 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
231a0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
231b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
231c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
231d0 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a   }.  *pRes = 0;.
231e0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
231f0 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
23200 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
23210 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
23220 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65  most(pCur);.  re
23230 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
23240 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73  ** Step the curs
23250 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74  or to the back t
23260 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
23270 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
23280 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
23290 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
232a0 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
232b0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
232c0 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
232d0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
232e0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
232f0 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
23300 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
23310 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
23320 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20  *pRes=1..*/.int 
23330 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
23340 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
23350 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
23360 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
23370 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
23380 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
23390 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
233a0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
233b0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
233c0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
233d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
233e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
233f0 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
23400 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52   0;.  if( CURSOR
23410 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
23420 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
23430 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
23440 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23450 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
23460 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75  kip<0 ){.    pCu
23470 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20  r->skip = 0;.   
23480 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
23490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
234a0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
234b0 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65  ip = 0;..  pPage
234c0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
234d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
234e0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
234f0 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21  sInit );.  if( !
23500 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
23510 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
23520 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23530 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20  Page];.    rc = 
23540 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
23550 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  , get4byte(findC
23560 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29  ell(pPage, idx))
23570 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
23580 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
23590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
235a0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
235b0 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
235c0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
235d0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
235e0 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  age]==0 ){.     
235f0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
23600 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
23610 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
23620 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
23630 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
23640 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
23650 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
23660 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
23670 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e  BtreeMoveToParen
23680 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
23690 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
236a0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
236b0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
236c0 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ;..    pCur->aiI
236d0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
236e0 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  -;.    pPage = p
236f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23700 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66  ->iPage];.    if
23710 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
23720 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
23730 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
23740 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
23750 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
23760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23770 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23780 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52  .    }.  }.  *pR
23790 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  es = 0;.  return
237a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
237b0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
237c0 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
237d0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
237e0 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20  The new page is 
237f0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
23800 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
23810 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  s, sqlite3PagerW
23820 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c  rite().** has al
23830 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
23840 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  d on the new pag
23850 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67  e.)  The new pag
23860 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65  e has also.** be
23870 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e  en referenced an
23880 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  d the calling ro
23890 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73  utine is respons
238a0 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
238b0 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
238c0 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e  Unref() on the n
238d0 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20  ew page when it 
238e0 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53  is done..**.** S
238f0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
23900 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
23910 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75    Any other retu
23920 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
23930 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20  es.** an error. 
23940 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50   *ppPage and *pP
23950 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65  gno are undefine
23960 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
23970 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44  f an error..** D
23980 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c  o not invoke sql
23990 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
239a0 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61   on *ppPage if a
239b0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
239c0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
239d0 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d  e "nearby" param
239e0 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74  eter is not 0, t
239f0 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65  hen a (feeble) e
23a00 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f  ffort is made to
23a10 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61   .** locate a pa
23a20 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20  ge close to the 
23a30 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61  page number "nea
23a40 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20  rby".  This can 
23a50 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a  be used in an.**
23a60 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70   attempt to keep
23a70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63   related pages c
23a80 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68  lose to each oth
23a90 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
23aa0 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63  se file,.** whic
23ab0 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61  h in turn can ma
23ac0 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ke database acce
23ad0 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  ss faster..**.**
23ae0 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20   If the "exact" 
23af0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
23b00 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65   0, and the page
23b10 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65  -number nearby e
23b20 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65  xists .** anywhe
23b30 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
23b40 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ist, then it is 
23b50 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65  guarenteed to be
23b60 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
23b70 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  ** is only used 
23b80 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  by auto-vacuum d
23b90 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c  atabases when al
23ba0 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74  locating a new t
23bb0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
23bc0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
23bd0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
23be0 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61  d *pBt, .  MemPa
23bf0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20  ge **ppPage, .  
23c00 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20  Pgno *pPgno, .  
23c10 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75  Pgno nearby,.  u
23c20 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d  8 exact.){.  Mem
23c30 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
23c40 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b  int rc;.  u32 n;
23c50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23c60 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
23c70 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32  reelist */.  u32
23c80 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   k;     /* Numbe
23c90 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  r of leaves on t
23ca0 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20  he trunk of the 
23cb0 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65  freelist */.  Me
23cc0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
23cd0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
23ce0 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
23cf0 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20  Pgno mxPage;    
23d00 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
23d10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
23d20 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ile */..  assert
23d30 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
23d40 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
23d50 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
23d60 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
23d70 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
23d80 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20  count(pBt);.  n 
23d90 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
23da0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
23db0 20 20 69 66 28 20 6e 3e 6d 78 50 61 67 65 20 29    if( n>mxPage )
23dc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
23dd0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23de0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20  ;.  }.  if( n>0 
23df0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
23e00 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65  are pages on the
23e10 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73   freelist.  Reus
23e20 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  e one of those p
23e30 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e  ages. */.    Pgn
23e40 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38  o iTrunk;.    u8
23e50 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
23e60 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d   /* If the free-
23e70 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61  list must be sea
23e80 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62  rched for 'nearb
23e90 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f  y' */.    .    /
23ea0 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74 27  * If the 'exact'
23eb0 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20 74   parameter was t
23ec0 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79 20  rue and a query 
23ed0 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
23ee0 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20  ap.    ** shows 
23ef0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e  that the page 'n
23f00 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68  earby' is somewh
23f10 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
23f20 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  list, then.    *
23f30 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73  * the entire-lis
23f40 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  t will be search
23f50 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ed for that page
23f60 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
23f70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
23f80 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
23f90 65 78 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c  exact && nearby<
23fa0 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  =mxPage ){.     
23fb0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
23fc0 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
23fd0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
23fe0 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
23ff0 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  um );.      rc =
24000 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
24010 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20  nearby, &eType, 
24020 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
24030 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
24040 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
24050 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
24060 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  {.        search
24070 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
24080 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d  }.      *pPgno =
24090 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23   nearby;.    }.#
240a0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65  endif..    /* De
240b0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
240c0 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
240d0 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
240e0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
240f0 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
24100 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
24110 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
24120 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
24130 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
24140 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
24150 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
24160 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
24170 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
24180 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
24190 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29  >aData[36], n-1)
241a0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
241b0 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c  de within this l
241c0 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20  oop is run only 
241d0 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61  once if the 'sea
241e0 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c  rchList' variabl
241f0 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  e.    ** is not 
24200 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  true. Otherwise,
24210 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f   it runs once fo
24220 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67  r each trunk-pag
24230 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e on the.    ** 
24240 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20  free-list until 
24250 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
24260 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20  ' is located..  
24270 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
24280 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
24290 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
242a0 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
242b0 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
242c0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
242d0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
242e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
242f0 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
24300 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
24310 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
24320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
24330 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29   iTrunk>mxPage )
24340 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
24350 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
24360 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
24370 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
24380 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
24390 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
243a0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
243b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
243c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
243d0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
243e0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
243f0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
24400 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
24410 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
24420 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
24430 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
24440 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
24450 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
24460 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
24470 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
24480 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
24490 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
244a0 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
244b0 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
244c0 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
244d0 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
244e0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
244f0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
24500 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
24510 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
24520 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
24530 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
24540 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
24550 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
24560 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
24570 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
24580 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
24590 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
245a0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
245b0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
245c0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
245d0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
245e0 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
245f0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
24600 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
24610 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
24620 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
24630 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
24640 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
24650 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
24660 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62  >(u32)(pBt->usab
24670 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b  leSize/4 - 2) ){
24680 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
24690 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
246a0 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
246b0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
246c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
246d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
246e0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
246f0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
24700 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
24710 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
24720 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
24730 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e   searchList && n
24740 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b  earby==iTrunk ){
24750 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
24760 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
24770 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
24780 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
24790 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
247a0 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
247b0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
247c0 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
247d0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
247e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a         assert( *
247f0 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b  pPgno==iTrunk );
24800 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
24810 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
24820 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
24830 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
24840 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
24850 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
24860 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
24870 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
24880 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
24890 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
248a0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
248b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
248c0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
248d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
248e0 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
248f0 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
24900 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
24910 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
24920 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
24930 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
24940 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
24950 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
24960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
24970 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
24980 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
24990 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
249a0 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
249b0 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
249c0 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
249d0 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
249e0 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
249f0 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
24a00 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
24a10 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
24a20 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
24a30 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
24a40 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
24a50 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
24a60 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
24a70 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
24a80 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
24a90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
24aa0 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
24ab0 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
24ac0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
24ad0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
24ae0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
24af0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
24b00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24b10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24b20 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
24b30 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
24b40 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
24b50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
24b60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24b70 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
24b80 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
24b90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24ba0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
24bb0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
24bc0 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
24bd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
24be0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24bf0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
24c00 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
24c10 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
24c20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
24c30 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
24c40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24c50 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
24c60 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
24c70 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
24c80 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
24c90 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
24ca0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
24cb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
24cc0 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
24cd0 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
24ce0 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
24cf0 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
24d00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
24d10 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
24d20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
24d30 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
24d40 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
24d50 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
24d60 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
24d70 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
24d80 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
24d90 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
24da0 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
24db0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24dc0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
24dd0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
24de0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
24df0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
24e00 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
24e10 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
24e20 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
24e30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
24e40 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
24e50 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
24e60 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
24e70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
24e80 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
24e90 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
24ea0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
24eb0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
24ec0 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
24ed0 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
24ee0 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
24ef0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  dif.      }else 
24f00 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20  if( k>0 ){.     
24f10 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
24f20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
24f30 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  unk */.        u
24f40 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  32 closest;.    
24f50 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
24f60 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
24f70 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
24f80 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
24f90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24fa0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
24fb0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
24fc0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
24fd0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
24fe0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
24ff0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
25000 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
25010 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
25020 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  32 i;.          
25030 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
25040 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
25050 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20  .          dist 
25060 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
25070 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a  a[8]) - nearby;.
25080 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69            if( di
25090 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64  st<0 ) dist = -d
250a0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ist;.          f
250b0 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=1; i<k; i++
250c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
250d0 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65  nt d2 = get4byte
250e0 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
250f0 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
25100 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29        if( d2<0 )
25110 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20   d2 = -d2;.     
25120 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
25130 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
25140 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
25150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
25160 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
25170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25180 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
25190 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
251a0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
251b0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
251c0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
251d0 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
251e0 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
251f0 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
25200 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
25210 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25220 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
25230 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
25240 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
25250 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
25260 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65  rchList || iPage
25270 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  ==nearby ){.    
25280 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74        int noCont
25290 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 50  ent;.          P
252a0 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  gno nPage;.     
252b0 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
252c0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  age;.          n
252d0 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
252e0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
252f0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
25300 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  nPage ){.       
25310 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67       /* Free pag
25320 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  e off the end of
25330 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
25340 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
25350 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25360 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
25370 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
25380 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
25390 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41   }.          TRA
253a0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
253b0 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
253c0 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
253d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
253e0 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
253f0 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
25410 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
25420 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
25430 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
25440 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
25450 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
25460 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
25470 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
25480 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
25490 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
254a0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
254b0 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
254c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
254d0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
254e0 77 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e 6b  writeable(pTrunk
254f0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
25500 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e          noConten
25510 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73  t = !btreeGetHas
25520 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50  Content(pBt, *pP
25530 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
25540 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
25550 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
25560 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
25570 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
25580 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
255a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
255b0 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
255c0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
255d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
255e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
255f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
25600 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
25610 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
25620 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
25630 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
25640 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
25650 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25660 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
25670 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
25680 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
25690 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
256a0 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
256b0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
256c0 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
256d0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
256e0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  o create a new p
256f0 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a  age at the.    *
25700 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
25710 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61  e */.    int nPa
25720 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ge = pagerPageco
25730 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 2a 70  unt(pBt);.    *p
25740 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31  Pgno = nPage + 1
25750 3b 0a 0a 20 20 20 20 69 66 28 20 2a 70 50 67 6e  ;..    if( *pPgn
25760 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
25770 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
25780 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20     (*pPgno)++;. 
25790 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
257a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
257b0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
257c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
257d0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
257e0 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20  t, *pPgno) ){.  
257f0 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
25800 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
25810 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
25820 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
25830 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
25840 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
25850 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
25860 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
25870 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
25880 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
25890 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
258a0 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
258b0 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
258c0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
258d0 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
258e0 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20   *pPg = 0;.     
258f0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
25900 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
25910 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d  f file (pointer-
25920 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70  map page)\n", *p
25930 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73  Pgno));.      as
25940 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
25950 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
25960 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
25970 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
25980 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
25990 6e 6f 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20  no, &pPg, 0);.  
259a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
259b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
259c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
259d0 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
259e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
259f0 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
25a00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25a10 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
25a20 63 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f  c;.      (*pPgno
25a30 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a  )++;.      if( *
25a40 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42  pPgno==PENDING_B
25a50 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
25a60 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20   (*pPgno)++; }. 
25a70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
25a80 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
25a90 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
25aa0 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72  GE(pBt) );.    r
25ab0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
25ac0 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
25ad0 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
25ae0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
25af0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
25b00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
25b10 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
25b20 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
25b30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25b40 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
25b50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
25b60 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
25b70 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
25b80 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
25b90 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
25ba0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e  .  assert( *pPgn
25bb0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
25bc0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
25bd0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
25be0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
25bf0 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
25c00 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
25c10 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
25c20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
25c30 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
25c40 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
25c50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
25c60 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
25c70 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
25c80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
25c90 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
25ca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
25cb0 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
25cc0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
25cd0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
25ce0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25cf0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
25d00 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
25d10 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
25d20 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
25d30 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
25d40 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
25d50 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
25d60 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
25d70 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
25d80 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
25d90 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
25da0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
25db0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
25dc0 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
25dd0 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
25de0 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
25df0 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
25e00 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
25e10 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
25e20 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
25e30 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
25e40 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
25e50 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
25e60 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
25e70 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
25e80 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
25e90 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
25ea0 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
25eb0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
25ec0 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
25ed0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
25ee0 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
25ef0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
25f00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
25f10 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
25f20 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
25f30 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
25f40 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
25f50 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25f70 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
25f80 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
25f90 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25fb0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
25fc0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
25fd0 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
25fe0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
25ff0 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
26000 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
26010 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
26020 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
26030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26040 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
26050 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
26060 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
26070 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
26080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26090 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
260a0 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
260b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
260d0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
260e0 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
260f0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
26100 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
26110 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
26120 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65  .  assert( iPage
26130 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
26140 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
26150 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
26160 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65  ge );..  if( pMe
26170 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
26180 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
26190 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
261a0 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
261b0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
261c0 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
261d0 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
261e0 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
261f0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
26200 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
26210 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
26220 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
26230 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
26240 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
26250 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
26260 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
26270 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
26280 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
26290 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
262a0 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
262b0 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  +1);..#ifdef SQL
262c0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
262d0 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51  E.  /* If the SQ
262e0 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
262f0 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TE compile-time 
26300 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
26310 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77  d, then.  ** alw
26320 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
26330 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
26340 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
26350 6f 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  os..  */.  if( (
26360 21 70 50 61 67 65 20 26 26 20 28 72 63 20 3d 20  !pPage && (rc = 
26370 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
26380 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
26390 26 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20 20  &pPage, 0))).   
263a0 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 72  ||            (r
263b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
263c0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
263d0 50 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20 20  Page)).  ){.    
263e0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
263f0 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  t;.  }.  memset(
26400 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
26410 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
26420 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  eSize);.#endif..
26430 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
26440 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
26450 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
26460 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
26470 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
26480 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
26490 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
264a0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
264b0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
264c0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
264d0 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50  ut(pBt, iPage, P
264e0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
264f0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
26500 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
26510 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
26520 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
26530 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
26540 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
26550 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
26560 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
26570 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
26580 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
26590 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
265a0 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
265b0 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
265c0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
265d0 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
265e0 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
265f0 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
26600 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
26610 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
26620 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
26630 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
26640 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
26650 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
26660 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
26670 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
26680 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
26690 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
266a0 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
266b0 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
266c0 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
266d0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 61 66  ){.    int nLeaf
266e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
266f0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
26700 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
26710 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
26720 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
26730 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
26740 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
26750 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
26760 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
26770 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
26780 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
26790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
267a0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
267b0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
267c0 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79    nLeaf = get4by
267d0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
267e0 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  a[4]);.    if( n
267f0 4c 65 61 66 3c 30 20 29 7b 0a 20 20 20 20 20 20  Leaf<0 ){.      
26800 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
26810 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
26820 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
26830 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
26840 20 6e 4c 65 61 66 3c 70 42 74 2d 3e 75 73 61 62   nLeaf<pBt->usab
26850 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
26860 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
26870 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72   case there is r
26880 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  oom on the trunk
26890 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20   page to insert 
268a0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
268b0 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  * being freed as
268c0 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20   a new leaf..   
268d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
268e0 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75  ote that the tru
268f0 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72  nk page is not r
26900 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c  eally full until
26910 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20   it contains.   
26920 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
26930 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20  /4 - 2 entries, 
26940 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34  not usableSize/4
26950 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20   - 8 entries as 
26960 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  we have.      **
26970 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65   coded.  But due
26980 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
26990 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f  or in versions o
269a0 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
269b0 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30  o.      ** 3.6.0
269c0 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  , databases with
269d0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
269e0 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f  pages holding mo
269f0 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  re than.      **
26a00 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
26a10 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62  8 entries will b
26a20 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f  e reported as co
26a30 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72  rrupt.  In order
26a40 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69  .      ** to mai
26a50 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20  ntain backwards 
26a60 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
26a70 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  th older version
26a80 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20  s of SQLite,.   
26a90 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f     ** we will co
26aa0 6e 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69 63  ntain to restric
26ab0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
26ac0 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c  entries to usabl
26ad0 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20  eSize/4 - 8.    
26ae0 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41    ** for now.  A
26af0 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
26b00 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65  the future (once
26b10 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70   everyone has up
26b20 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20  graded.      ** 
26b30 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65  to 3.6.0 or late
26b40 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e  r) we should con
26b50 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65  sider fixing the
26b60 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
26b70 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ve.      ** to r
26b80 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f  ead "usableSize/
26b90 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  4-2" instead of 
26ba0 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22  "usableSize/4-8"
26bb0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
26bc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26bd0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
26be0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
26bf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26c00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
26c10 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
26c20 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
26c30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
26c40 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
26c50 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
26c60 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  Page);.#ifndef S
26c70 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
26c80 45 54 45 0a 20 20 20 20 20 20 20 20 69 66 28 20  ETE.        if( 
26c90 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  pPage ){.       
26ca0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
26cb0 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
26cc0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
26cd0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
26ce0 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
26cf0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
26d00 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
26d10 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
26d20 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
26d30 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
26d40 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
26d50 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
26d60 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
26d70 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
26d80 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
26d90 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
26da0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
26db0 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
26dc0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
26dd0 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
26de0 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
26df0 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
26e00 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
26e10 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
26e20 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
26e30 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
26e40 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
26e50 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
26e60 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
26e70 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
26e80 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
26e90 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
26ea0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
26eb0 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
26ec0 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
26ed0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
26ee0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
26ef0 20 20 69 66 28 20 20 20 28 28 21 70 50 61 67 65    if(   ((!pPage
26f00 29 20 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d  ) && (0 != (rc =
26f10 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
26f20 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
26f30 20 26 70 50 61 67 65 2c 20 30 29 29 29 29 0a 20   &pPage, 0)))). 
26f40 20 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63      || (0 != (rc
26f50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26f60 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
26f70 61 67 65 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  age))).  ){.    
26f80 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
26f90 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74  t;.  }.  put4byt
26fa0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
26fb0 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62  iTrunk);.  put4b
26fc0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
26fd0 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34  a[4], 0);.  put4
26fe0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
26ff0 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b  ata[32], iPage);
27000 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d  .  TRACE(("FREE-
27010 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75  PAGE: %d new tru
27020 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e  nk page replacin
27030 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  g %d\n", pPage->
27040 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a  pgno, iTrunk));.
27050 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20  .freepage_out:. 
27060 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
27070 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
27080 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  = 0;.  }.  relea
27090 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
270a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
270b0 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unk);.  return r
270c0 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
270d0 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
270e0 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
270f0 72 6e 20 66 72 65 65 50 61 67 65 32 28 70 50 61  rn freePage2(pPa
27100 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
27110 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a  pPage->pgno);.}.
27120 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
27130 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
27140 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
27150 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a  he given Cell..*
27160 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
27170 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  arCell(MemPage *
27180 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20  pPage, unsigned 
27190 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  char *pCell){.  
271a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
271b0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65  pPage->pBt;.  Ce
271c0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50  llInfo info;.  P
271d0 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
271e0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
271f0 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76 66 6c 50  vfl;.  u16 ovflP
27200 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
27210 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
27220 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
27230 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  t->mutex) );.  s
27240 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
27250 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
27260 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
27270 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
27280 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
27290 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
272a0 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
272b0 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
272c0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
272d0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66  ing */.  }.  ovf
272e0 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
272f0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
27300 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65  erflow]);.  asse
27310 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
27320 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66  ize > 4 );.  ovf
27330 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
27340 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
27350 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f  .  nOvfl = (info
27360 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f  .nPayload - info
27370 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  .nLocal + ovflPa
27380 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
27390 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
273a0 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20  rt( ovflPgno==0 
273b0 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20  || nOvfl>0 );.  
273c0 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
273d0 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74  {.    Pgno iNext
273e0 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67   = 0;.    MemPag
273f0 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
27400 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32    if( ovflPgno<2
27410 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67   || ovflPgno>pag
27420 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
27430 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69   ){.      /* 0 i
27440 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61  s not a legal pa
27450 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
27460 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61  ge 1 cannot be a
27470 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  n .      ** over
27480 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65  flow page. There
27490 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f  fore if ovflPgno
274a0 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65  <2 or past the e
274b0 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  nd of the .     
274c0 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74   ** file the dat
274d0 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
274e0 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20  rrupt. */.      
274f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
27500 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
27510 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20  }.    if( nOvfl 
27520 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  ){.      rc = ge
27530 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
27540 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
27550 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20  vfl, &iNext);.  
27560 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
27570 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
27580 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32    rc = freePage2
27590 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66  (pBt, pOvfl, ovf
275a0 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  lPgno);.    if( 
275b0 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73  pOvfl ){.      s
275c0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
275d0 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
275e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
275f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
27600 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69      ovflPgno = i
27610 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
27620 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27630 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
27640 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  e byte sequence 
27650 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
27660 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  t a cell on page
27670 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72   pPage.** and wr
27680 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65  ite that byte se
27690 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c  quence into pCel
276a0 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70  l[].  Overflow p
276b0 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ages are.** allo
276c0 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64  cated and filled
276d0 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79   in as necessary
276e0 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70  .  The calling p
276f0 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72  rocedure.** is r
27700 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
27710 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69  aking sure suffi
27720 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20  cient space has 
27730 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  been allocated.*
27740 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a  * for pCell[]..*
27750 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
27760 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  Cell does not ne
27770 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20  cessary need to 
27780 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61  point to the pPa
27790 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65  ge->aData.** are
277a0 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  a.  pCell might 
277b0 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65  point to some te
277c0 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e  mporary storage.
277d0 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a    The cell will.
277e0 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65  ** be constructe
277f0 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72  d in this tempor
27800 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f  ary area then co
27810 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d  pied into pPage-
27820 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e  >aData.** later.
27830 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
27840 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d  illInCell(.  Mem
27850 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
27860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27870 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
27880 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a  tains the cell *
27890 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
278a0 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  r *pCell,       
278b0 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74     /* Complete t
278c0 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ext of the cell 
278d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
278e0 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
278f0 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
27900 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
27910 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c  pData,int nData,
27920 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
27930 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
27940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27950 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f     /* Extra zero
27960 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
27970 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69   to pData */.  i
27980 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  nt *pnSize      
27990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
279a0 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65   Write cell size
279b0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
279c0 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f  t nPayload;.  co
279d0 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20  nst u8 *pSrc;.  
279e0 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b  int nSrc, n, rc;
279f0 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74  .  int spaceLeft
27a00 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76  ;.  MemPage *pOv
27a10 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  fl = 0;.  MemPag
27a20 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20  e *pToRelease = 
27a30 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
27a40 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
27a50 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
27a60 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
27a70 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
27a80 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
27a90 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Ovfl = 0;.  int 
27aa0 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49  nHeader;.  CellI
27ab0 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73  nfo info;..  ass
27ac0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
27ad0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
27ae0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
27af0 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74   /* pPage is not
27b00 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69   necessarily wri
27b10 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65  teable since pCe
27b20 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69  ll might be auxi
27b30 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65  liary.  ** buffe
27b40 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20  r space that is 
27b50 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
27b60 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61  e pPage buffer a
27b70 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  rea */.  assert(
27b80 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44   pCell<pPage->aD
27b90 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70  ata || pCell>=&p
27ba0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
27bb0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
27bc0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
27bd0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
27be0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
27bf0 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
27c00 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
27c10 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b  /.  nHeader = 0;
27c20 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
27c30 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  eaf ){.    nHead
27c40 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69  er += 4;.  }.  i
27c50 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
27c60 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  a ){.    nHeader
27c70 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
27c80 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
27c90 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d  Data+nZero);.  }
27ca0 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20  else{.    nData 
27cb0 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d  = nZero = 0;.  }
27cc0 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75  .  nHeader += pu
27cd0 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
27ce0 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29  Header], *(u64*)
27cf0 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65  &nKey);.  sqlite
27d00 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
27d10 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
27d20 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72   &info);.  asser
27d30 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d  t( info.nHeader=
27d40 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73  =nHeader );.  as
27d50 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d  sert( info.nKey=
27d60 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  =nKey );.  asser
27d70 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28  t( info.nData==(
27d80 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f  u32)(nData+nZero
27d90 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c  ) );.  .  /* Fil
27da0 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64  l in the payload
27db0 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d   */.  nPayload =
27dc0 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a   nData + nZero;.
27dd0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
27de0 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20  Key ){.    pSrc 
27df0 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72  = pData;.    nSr
27e00 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e  c = nData;.    n
27e10 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Data = 0;.  }els
27e20 65 7b 20 0a 20 20 20 20 69 66 28 20 6e 4b 65 79  e{ .    if( nKey
27e30 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70  >0x7fffffff || p
27e40 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
27e50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
27e60 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  RRUPT;.    }.   
27e70 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e   nPayload += (in
27e80 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63  t)nKey;.    pSrc
27e90 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72   = pKey;.    nSr
27ea0 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20  c = (int)nKey;. 
27eb0 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69   }.  *pnSize = i
27ec0 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61  nfo.nSize;.  spa
27ed0 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c  ceLeft = info.nL
27ee0 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64  ocal;.  pPayload
27ef0 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
27f00 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26  r];.  pPrior = &
27f10 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
27f20 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28  flow];..  while(
27f30 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20   nPayload>0 ){. 
27f40 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74     if( spaceLeft
27f50 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
27f60 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
27f70 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
27f80 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
27f90 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
27fa0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
27fb0 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
27fc0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
27fd0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
27fe0 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
27ff0 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b        pgnoOvfl++
28000 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
28010 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54  e( .          PT
28020 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
28030 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67   pgnoOvfl) || pg
28040 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f  noOvfl==PENDING_
28050 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a  BYTE_PAGE(pBt) .
28060 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
28070 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
28080 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
28090 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76  eePage(pBt, &pOv
280a0 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70  fl, &pgnoOvfl, p
280b0 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66  gnoOvfl, 0);.#if
280c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
280d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
280e0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
280f0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
28100 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74  to-vacuum, and t
28110 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62  he second or sub
28120 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a  sequent.      **
28130 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
28140 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65  s being allocate
28150 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20  d, add an entry 
28160 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
28170 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ap.      ** for 
28180 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a  that page now. .
28190 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
281a0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
281b0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
281c0 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65  page, then write
281d0 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79   a partial entry
281e0 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68   .      ** to th
281f0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49  e pointer-map. I
28200 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69  f we write nothi
28210 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ng to this point
28220 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20  er-map slot,.   
28230 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f     ** then the o
28240 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c  ptimistic overfl
28250 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73  ow chain process
28260 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c  ing in clearCell
28270 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  ().      ** may 
28280 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65  misinterpret the
28290 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76   uninitialised v
282a0 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65  alues and delete
282b0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72   the.      ** wr
282c0 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ong pages from t
282d0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
282e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
282f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
28300 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
28310 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
28320 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d  Type = (pgnoPtrm
28330 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ap?PTRMAP_OVERFL
28340 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46  OW2:PTRMAP_OVERF
28350 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 72  LOW1);.        r
28360 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
28370 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79  t, pgnoOvfl, eTy
28380 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b  pe, pgnoPtrmap);
28390 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
283a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
283b0 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  easePage(pOvfl);
283c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
283d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
283e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
283f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
28400 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
28410 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
28420 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
28430 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
28440 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
28450 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74  Prior points int
28460 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
28470 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52        ** of pToR
28480 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
28490 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
284a0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
284b0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
284c0 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
284d0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
284e0 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
284f0 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
28500 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
28510 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20   pPrior is part 
28520 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
28530 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
28540 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
28550 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
28560 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
28570 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
28580 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ior<pPage->aData
28590 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61   || pPrior>=&pPa
285a0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
285b0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
285c0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
285d0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
285e0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
285f0 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79  );..      put4by
28600 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f  te(pPrior, pgnoO
28610 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  vfl);.      rele
28620 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
28630 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65  se);.      pToRe
28640 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20  lease = pOvfl;. 
28650 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f       pPrior = pO
28660 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  vfl->aData;.    
28670 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
28680 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  r, 0);.      pPa
28690 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e  yload = &pOvfl->
286a0 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20  aData[4];.      
286b0 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d  spaceLeft = pBt-
286c0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
286d0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e  .    }.    n = n
286e0 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28  Payload;.    if(
286f0 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e   n>spaceLeft ) n
28700 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20   = spaceLeft;.. 
28710 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
28720 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
28730 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f  than pPayload po
28740 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
28750 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f  ta area.    ** o
28760 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
28770 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
28780 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
28790 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  teable. */.    a
287a0 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
287b0 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
287c0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
287d0 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
287e0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  age) );..    /* 
287f0 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70  If pPayload is p
28800 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
28810 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
28820 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
28830 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  age.    ** is st
28840 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
28850 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
28860 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61  yload<pPage->aDa
28870 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d  ta || pPayload>=
28880 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
28890 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
288a0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
288b0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
288c0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
288d0 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ge) );..    if( 
288e0 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSrc>0 ){.      
288f0 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d  if( n>nSrc ) n =
28900 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73   nSrc;.      ass
28910 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20  ert( pSrc );.   
28920 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
28930 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
28940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
28950 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20  emset(pPayload, 
28960 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, n);.    }.   
28970 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
28980 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
28990 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
289a0 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
289b0 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
289c0 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72  = n;.    if( nSr
289d0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53  c==0 ){.      nS
289e0 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
289f0 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
28a00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65      }.  }.  rele
28a10 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
28a20 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  se);.  return SQ
28a30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
28a40 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74  * Remove the i-t
28a50 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  h cell from pPag
28a60 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
28a70 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f   effects pPage o
28a80 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  nly..** The cell
28a90 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
28aa0 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63  freed or dealloc
28ab0 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ated.  It is ass
28ac0 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
28ad0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61   cell content ha
28ae0 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f  s been copied so
28af0 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54  meplace else.  T
28b00 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
28b10 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20  .** removes the 
28b20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
28b30 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
28b40 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73  ..**.** "sz" mus
28b50 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  t be the number 
28b60 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
28b70 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
28b80 69 6e 74 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  int dropCell(Mem
28b90 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
28ba0 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20   idx, int sz){. 
28bb0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
28bc0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
28bd0 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
28be0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
28bf0 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
28c00 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  of cell being de
28c10 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64  leted */.  u8 *d
28c20 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50  ata;       /* pP
28c30 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
28c40 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
28c50 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20  /* Used to move 
28c60 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74  bytes around wit
28c70 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20  hin data[] */.  
28c80 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
28c90 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
28ca0 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
28cb0 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
28cc0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
28cd0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
28ce0 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
28cf0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
28d00 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
28d10 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
28d20 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
28d30 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
28d40 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
28d50 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
28d60 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
28d70 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74  ta;.  ptr = &dat
28d80 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
28d90 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20  set + 2*idx];.  
28da0 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
28db0 72 29 3b 0a 20 20 69 66 28 20 28 70 63 3c 70 50  r);.  if( (pc<pP
28dc0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
28dd0 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a  +(pPage->leaf?0:
28de0 34 29 29 0a 20 20 20 20 20 7c 7c 20 28 70 63 2b  4)).     || (pc+
28df0 73 7a 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  sz>pPage->pBt->u
28e00 73 61 62 6c 65 53 69 7a 65 29 20 29 7b 0a 20 20  sableSize) ){.  
28e10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28e20 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
28e30 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61  }.  rc = freeSpa
28e40 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a  ce(pPage, pc, sz
28e50 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
28e60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
28e70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66  turn rc;.  }.  f
28e80 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50  or(i=idx+1; i<pP
28e90 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c  age->nCell; i++,
28ea0 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74   ptr+=2){.    pt
28eb0 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20  r[0] = ptr[2];. 
28ec0 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
28ed0 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  3];.  }.  pPage-
28ee0 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32  >nCell--;.  put2
28ef0 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
28f00 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20  ->hdrOffset+3], 
28f10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
28f20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
28f30 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   2;.  return SQL
28f40 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
28f50 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
28f60 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
28f70 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
28f80 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
28f90 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
28fa0 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
28fb0 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
28fc0 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
28fd0 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
28fe0 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
28ff0 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
29000 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
29010 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
29020 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
29030 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
29040 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
29050 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
29060 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
29070 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
29080 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20   pPage->aOvfl[] 
29090 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e  and make it poin
290a0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
290b0 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a  ntent (either.**
290c0 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65   in pTemp or the
290d0 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29   original pCell)
290e0 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64   and also record
290f0 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20   its index. .** 
29100 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  Allocating a new
29110 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d   entry in pPage-
29120 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73  >aCell[] implies
29130 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d   that .** pPage-
29140 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e  >nOverflow is in
29150 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  cremented..**.**
29160 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e   If nSkip is non
29170 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e  -zero, then do n
29180 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73  ot copy the firs
29190 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66  t nSkip bytes of
291a0 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68   the.** cell. Th
291b0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76  e caller will ov
291c0 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74  erwrite them aft
291d0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
291e0 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20   returns. If.** 
291f0 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
29200 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61  o, then pCell ma
29210 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61  y not point to a
29220 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79  n invalid memory
29230 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62   location .** (b
29240 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69  ut pCell+nSkip i
29250 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e  s always valid).
29260 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
29270 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
29280 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
29290 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
292a0 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
292b0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
292c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
292d0 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
292e0 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
292f0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
29300 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
29310 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
29320 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
29330 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
29340 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
29350 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
29360 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
29370 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
29380 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
29390 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
293a0 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 20 20  .  Pgno iChild  
293b0 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
293c0 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72  ero, replace fir
293d0 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20  st 4 bytes with 
293e0 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 29 7b  this value */.){
293f0 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20  .  int idx;     
29400 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
29410 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20   write new cell 
29420 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b  content in data[
29430 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  ] */.  int j;   
29440 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
29450 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
29460 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
29470 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
29480 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79   content for any
29490 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20   cell in data[] 
294a0 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20  */.  int end;   
294b0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
294c0 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61  byte past the la
294d0 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
294e0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
294f0 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20  nt ins;         
29500 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74   /* Index in dat
29510 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65  a[] where new ce
29520 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e  ll pointer is in
29530 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
29540 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  hdr;          /*
29550 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74   Offset into dat
29560 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20  a[] of the page 
29570 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
29580 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a  cellOffset;   /*
29590 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73   Address of firs
295a0 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
295b0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
295c0 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
295d0 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
295e0 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
295f0 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
29600 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
29610 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72  for moving infor
29620 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e  mation around in
29630 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e   data[] */..  in
29640 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c  t nSkip = (iChil
29650 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 61  d ? 4 : 0);..  a
29660 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
29670 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
29680 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
29690 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
296a0 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
296b0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26  LL(pPage->pBt) &
296c0 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  & MX_CELL(pPage-
296d0 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20  >pBt)<=5460 );. 
296e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
296f0 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79  nOverflow<=Array
29700 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66  Size(pPage->aOvf
29710 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
29720 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
29730 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b  pPage, pCell) );
29740 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
29750 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
29760 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
29770 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
29780 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
29790 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
297a0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
297b0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
297c0 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43  (pTemp+nSkip, pC
297d0 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
297e0 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  kip);.      pCel
297f0 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
29800 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
29810 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
29820 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29  e(pCell, iChild)
29830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
29840 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
29850 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
29860 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70  j<(int)(sizeof(p
29870 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a  Page->aOvfl)/siz
29880 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
29890 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61  [0])) );.    pPa
298a0 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65  ge->aOvfl[j].pCe
298b0 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  ll = pCell;.    
298c0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e  pPage->aOvfl[j].
298d0 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  idx = (u16)i;.  
298e0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
298f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
29900 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
29910 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
29920 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29930 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
29940 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
29950 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
29960 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
29970 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
29980 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
29990 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d  aData;.    hdr =
299a0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
299b0 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  t;.    top = get
299c0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
299d0 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66  5]);.    cellOff
299e0 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
299f0 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64  lOffset;.    end
29a00 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
29a10 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b  2*pPage->nCell +
29a20 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65   2;.    ins = ce
29a30 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
29a40 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f      if( end > to
29a50 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20  p - sz ){.      
29a60 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
29a70 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
29a80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29a90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
29aa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29ab0 7d 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67 65  }.      top = ge
29ac0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
29ad0 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65  +5]);.      asse
29ae0 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20  rt( end + sz <= 
29af0 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  top );.    }.   
29b00 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53   idx = allocateS
29b10 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29 3b  pace(pPage, sz);
29b20 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
29b30 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
29b40 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79 74  ( end <= get2byt
29b50 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
29b60 29 3b 0a 20 20 20 20 69 66 20 28 69 64 78 2b 73  );.    if (idx+s
29b70 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
29b80 75 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a 20 20  usableSize) {.  
29b90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29ba0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
29bb0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
29bc0 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50  >nCell++;.    pP
29bd0 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61  age->nFree = pPa
29be0 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 75 31 36  ge->nFree - (u16
29bf0 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d  )(2 + sz);.    m
29c00 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b  emcpy(&data[idx+
29c10 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53  nSkip], pCell+nS
29c20 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
29c30 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
29c40 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
29c50 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68  (&data[idx], iCh
29c60 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
29c70 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72  for(j=end-2, ptr
29c80 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73  =&data[j]; j>ins
29c90 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b  ; j-=2, ptr-=2){
29ca0 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  .      ptr[0] = 
29cb0 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70  ptr[-2];.      p
29cc0 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b  tr[1] = ptr[-1];
29cd0 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62  .    }.    put2b
29ce0 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20  yte(&data[ins], 
29cf0 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79  idx);.    put2by
29d00 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
29d10 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
29d20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29d30 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
29d40 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
29d50 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
29d60 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
29d70 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
29d80 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
29d90 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
29da0 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
29db0 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
29dc0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
29dd0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
29de0 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
29df0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
29e00 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
29e10 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
29e20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
29e30 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
29e40 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
29e50 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c  dd a list of cel
29e60 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54  ls to a page.  T
29e70 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62  he page should b
29e80 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  e initially empt
29e90 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20  y..** The cells 
29ea0 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
29eb0 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  o fit on the pag
29ec0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
29ed0 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a  d assemblePage(.
29ee0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
29ef0 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ,   /* The page 
29f00 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64  to be assemblied
29f10 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
29f20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
29f30 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
29f40 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61  o add to this pa
29f50 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
29f60 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  ell,      /* Poi
29f70 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f  nters to cell bo
29f80 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61  dies */.  u16 *a
29f90 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53  Size        /* S
29fa0 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  izes of the cell
29fb0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
29fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
29fd0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
29fe0 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20   u8 *pCellptr;  
29ff0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2a000 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
2a010 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
2a020 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
2a030 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
2a040 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
2a050 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
2a060 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
2a070 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2a080 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70  er to data for p
2a090 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Page */.  const 
2a0a0 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
2a0b0 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
2a0c0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2a0d0 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61  of header on pPa
2a0e0 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ge */.  const in
2a0f0 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67  t nUsable = pPag
2a100 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2a110 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69  ze; /* Usable si
2a120 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20  ze of page */.. 
2a130 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2a140 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
2a150 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a160 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2a170 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2a180 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  );.  assert( nCe
2a190 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d  ll>=0 && nCell<=
2a1a0 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2a1b0 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70  Bt) && MX_CELL(p
2a1c0 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30  Page->pBt)<=5460
2a1d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2a1e0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2a1f0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2a200 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  Page) );..  /* C
2a210 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
2a220 67 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ge has just been
2a230 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50   zeroed by zeroP
2a240 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72  age() */.  asser
2a250 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
2a260 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2a270 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2a280 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20  dr+5])==nUsable 
2a290 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d  );..  pCellptr =
2a2a0 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
2a2b0 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c  llOffset + nCell
2a2c0 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20  *2];.  cellbody 
2a2d0 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72  = nUsable;.  for
2a2e0 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30  (i=nCell-1; i>=0
2a2f0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65 6c  ; i--){.    pCel
2a300 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63  lptr -= 2;.    c
2a310 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a 65  ellbody -= aSize
2a320 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74  [i];.    put2byt
2a330 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c  e(pCellptr, cell
2a340 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70  body);.    memcp
2a350 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79  y(&data[cellbody
2a360 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53  ], apCell[i], aS
2a370 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70  ize[i]);.  }.  p
2a380 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2a390 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20  r+3], nCell);.  
2a3a0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
2a3b0 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29  dr+5], cellbody)
2a3c0 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
2a3d0 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e   -= (nCell*2 + n
2a3e0 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64  Usable - cellbod
2a3f0 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  y);.  pPage->nCe
2a400 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b  ll = (u16)nCell;
2a410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
2a420 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65  llowing paramete
2a430 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77  rs determine how
2a440 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70   many adjacent p
2a450 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65  ages get involve
2a460 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63  d.** in a balanc
2a470 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
2a480 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  NN is the number
2a490 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
2a4a0 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20   either side.** 
2a4b0 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
2a4c0 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
2a4d0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  the balancing op
2a4e0 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20  eration.  NB is 
2a4f0 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d  the.** total num
2a500 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
2a510 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69  t participate, i
2a520 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72  ncluding the tar
2a530 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  get page and.** 
2a540 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  NN neighbors on 
2a550 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a  either side..**.
2a560 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76  ** The minimum v
2a570 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20  alue of NN is 1 
2a580 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e  (of course).  In
2a590 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76  creasing NN abov
2a5a0 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20  e 1.** (to 2 or 
2a5b0 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73  3) gives a modes
2a5c0 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e  t improvement in
2a5d0 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45   SELECT and DELE
2a5e0 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  TE performance.*
2a5f0 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f  * in exchange fo
2a600 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61  r a larger degra
2a610 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54  dation in INSERT
2a620 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66   and UPDATE perf
2a630 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
2a640 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65  value of NN appe
2a650 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20  ars to give the 
2a660 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65  best results ove
2a670 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rall..*/.#define
2a680 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20   NN 1           
2a690 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
2a6a0 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
2a6b0 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
2a6c0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28   */.#define NB (
2a6d0 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20  NN*2+1)      /* 
2a6e0 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f  Total pages invo
2a6f0 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  lved in the bala
2a700 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66  nce */...#ifndef
2a710 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
2a720 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20  CKBALANCE./*.** 
2a730 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
2a740 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65  balance() handle
2a750 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65  s the common spe
2a760 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a  cial case where.
2a770 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ** a new entry i
2a780 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
2a790 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20   on the extreme 
2a7a0 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65  right-end of the
2a7b0 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68  .** tree, in oth
2a7c0 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74  er words, when t
2a7d0 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c  he new entry wil
2a7e0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72  l become the lar
2a7f0 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  gest.** entry in
2a800 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
2a810 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69   Instead of tryi
2a820 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33  ng balance the 3
2a830 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
2a840 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64   pages, just add
2a850 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74  .** a new page t
2a860 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  o the right-hand
2a870 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68   side and put th
2a880 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20  e one new entry 
2a890 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e  in.** that page.
2a8a0 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68    This leaves th
2a8b0 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20  e right side of 
2a8c0 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61  the tree somewha
2a8d0 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e  t.** unbalanced.
2a8e0 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74    But odds are t
2a8f0 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69  hat we will be i
2a900 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74  nserting new ent
2a910 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65  ries.** at the e
2a920 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72  nd soon afterwar
2a930 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79  ds so the nearly
2a940 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c   empty page will
2a950 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c   quickly.** fill
2a960 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65   up.  On average
2a970 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73  ..**.** pPage is
2a980 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77   the leaf page w
2a990 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68  hich is the righ
2a9a0 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74  t-most page in t
2a9b0 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72  he tree..** pPar
2a9c0 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e  ent is its paren
2a9d0 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68  t.  pPage must h
2a9e0 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65  ave a single ove
2a9f0 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77  rflow entry.** w
2aa00 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65  hich is also the
2aa10 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
2aa20 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  y on the page..*
2aa30 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20  *.** The pSpace 
2aa40 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20 74  buffer is used t
2aa50 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72  o store a tempor
2aa60 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ary copy of the 
2aa70 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20  divider.** cell 
2aa80 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73  that will be ins
2aa90 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65  erted into pPare
2aaa0 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20  nt. Such a cell 
2aab0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a  consists of a 4.
2aac0 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d  ** byte page num
2aad0 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ber followed by 
2aae0 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2aaf0 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74  h integer. In ot
2ab00 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74  her.** words, at
2ab10 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20   most 13 bytes. 
2ab20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61 63 65  Hence the pSpace
2ab30 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
2ab40 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62  at.** least 13 b
2ab50 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  ytes in size..*/
2ab60 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2ab70 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67  nce_quick(MemPag
2ab80 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50  e *pParent, MemP
2ab90 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
2aba0 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61  pSpace){.  BtSha
2abb0 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d  red *const pBt =
2abc0 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20   pPage->pBt;    
2abd0 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62 61  /* B-Tree Databa
2abe0 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  se */.  MemPage 
2abf0 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
2ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ac10 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
2ac20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
2ac30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ac50 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
2ac60 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b  .  Pgno pgnoNew;
2ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac80 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2ac90 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a  number of pNew *
2aca0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
2acb0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2acc0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2acd0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2ace0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2acf0 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
2ad00 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
2ad10 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2ad20 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20  verflow==1 );.. 
2ad30 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
2ad40 6c 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l<=0 ) return SQ
2ad50 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2ad60 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  T;..  /* Allocat
2ad70 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68  e a new page. Th
2ad80 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
2ad90 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73 69  ome the right-si
2ada0 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70  bling of .  ** p
2adb0 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70  Page. Make the p
2adc0 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74 61  arent page writa
2add0 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65  ble, so that the
2ade0 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
2adf0 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  l.  ** may be in
2ae00 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20  serted. If both 
2ae10 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73  these operations
2ae20 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c   are successful,
2ae30 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
2ae40 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2ae50 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
2ae60 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c  ew, &pgnoNew, 0,
2ae70 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d   0);..  if( rc==
2ae80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20  SQLITE_OK ){..  
2ae90 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53    u8 *pOut = &pS
2aea0 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20  pace[4];.    u8 
2aeb0 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e  *pCell = pPage->
2aec0 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a  aOvfl[0].pCell;.
2aed0 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d      u16 szCell =
2aee0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2aef0 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
2af00 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20  u8 *pStop;..    
2af10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2af20 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2af30 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29  pNew->pDbPage) )
2af40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2af50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28  age->aData[0]==(
2af60 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
2af70 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  EAFDATA|PTF_LEAF
2af80 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  ) );.    zeroPag
2af90 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b  e(pNew, PTF_INTK
2afa0 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  EY|PTF_LEAFDATA|
2afb0 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61  PTF_LEAF);.    a
2afc0 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
2afd0 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a  , 1, &pCell, &sz
2afe0 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  Cell);..    /* I
2aff0 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
2b000 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
2b010 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
2b020 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a  inter map.    **
2b030 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f   with entries fo
2b040 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20  r the new page, 
2b050 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20  and any pointer 
2b060 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a  from the .    **
2b070 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67   cell on the pag
2b080 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e to an overflow
2b090 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65 72   page. If either
2b0a0 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a   of these.    **
2b0b0 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c   operations fail
2b0c0 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  s, the return co
2b0d0 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20 74  de is set, but t
2b0e0 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20  he contents.    
2b0f0 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ** of the parent
2b100 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20   page are still 
2b110 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74  manipulated by t
2b120 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20  hh code below.. 
2b130 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b     ** That is Ok
2b140 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  , at this point 
2b150 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2b160 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2b170 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65  .    ** be marke
2b180 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74 75  d as dirty. Retu
2b190 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
2b1a0 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61  ode will cause a
2b1b0 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  .    ** rollback
2b1c0 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68  , undoing any ch
2b1d0 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68  anges made to th
2b1e0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
2b1f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53     */.    if( IS
2b200 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2b210 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2b220 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
2b230 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2b240 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20  Parent->pgno);. 
2b250 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e       if( szCell>
2b260 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 26  pNew->minLocal &
2b270 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2b280 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2b290 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
2b2a0 28 70 4e 65 77 2c 20 70 43 65 6c 6c 29 3b 0a 20  (pNew, pCell);. 
2b2b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
2b2c0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
2b2d0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20  divider cell to 
2b2e0 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72  insert into pPar
2b2f0 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72  ent. The divider
2b300 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e   cell.    ** con
2b310 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74  sists of a 4-byt
2b320 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74  e page number (t
2b330 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
2b340 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20  f pPage) and.   
2b350 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c   ** a variable l
2b360 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20  ength key value 
2b370 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 74  (which must be t
2b380 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73  he same value as
2b390 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67   the.    ** larg
2b3a0 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65  est key on pPage
2b3b0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
2b3c0 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72   To find the lar
2b3d0 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f  gest key value o
2b3e0 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20 66  n pPage, first f
2b3f0 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  ind the right-mo
2b400 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  st .    ** cell 
2b410 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66 69  on pPage. The fi
2b420 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f  rst two fields o
2b430 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20  f this cell are 
2b440 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f  the .    ** reco
2b450 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72  rd-length (a var
2b460 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
2b470 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d  eger at most 32-
2b480 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20  bits in size).  
2b490 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79    ** and the key
2b4a0 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61 62   value (a variab
2b4b0 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
2b4c0 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20  r, may have any 
2b4d0 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54  value)..    ** T
2b4e0 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20  he first of the 
2b4f0 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73  while(...) loops
2b500 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65   below skips ove
2b510 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e  r the record-len
2b520 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  gth.    ** field
2b530 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69  . The second whi
2b540 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70  le(...) loop cop
2b550 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75  ies the key valu
2b560 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  e from the.    *
2b570 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  * cell on pPage 
2b580 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65 20  into the pSpace 
2b590 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  buffer..    */. 
2b5a0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2b5b0 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65  ell(pPage, pPage
2b5c0 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20  ->nCell-1);.    
2b5d0 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
2b5e0 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
2b5f0 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20  (pCell++)&0x80) 
2b600 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29  && pCell<pStop )
2b610 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70  ;.    pStop = &p
2b620 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Cell[9];.    whi
2b630 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20  le( ((*(pOut++) 
2b640 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78  = *(pCell++))&0x
2b650 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
2b660 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  op );..    /* In
2b670 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69 76  sert the new div
2b680 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70  ider cell into p
2b690 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69  Parent. */.    i
2b6a0 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
2b6b0 74 2c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  t,pParent->nCell
2b6c0 2c 70 53 70 61 63 65 2c 28 69 6e 74 29 28 70 4f  ,pSpace,(int)(pO
2b6d0 75 74 2d 70 53 70 61 63 65 29 2c 30 2c 70 50 61  ut-pSpace),0,pPa
2b6e0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20  ge->pgno);..    
2b6f0 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74  /* Set the right
2b700 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f  -child pointer o
2b710 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69  f pParent to poi
2b720 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  nt to the new pa
2b730 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  ge. */.    put4b
2b740 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
2b750 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2b760 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
2b770 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52  ew);.  .    /* R
2b780 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
2b790 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20  ence to the new 
2b7a0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c  page. */.    rel
2b7b0 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
2b7c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2b7d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2b7e0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
2b7f0 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30  ALANCE */..#if 0
2b800 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2b810 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f  tion does not co
2b820 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e  ntribute anythin
2b830 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  g to the operati
2b840 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  on of SQLite..**
2b850 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73   it is sometimes
2b860 20 61 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f   activated tempo
2b870 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62  rarily while deb
2b880 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70  ugging code resp
2b890 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20  onsible .** for 
2b8a0 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d  setting pointer-
2b8b0 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  map entries..*/.
2b8c0 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
2b8d0 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50  pCheckPages(MemP
2b8e0 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e  age **apPage, in
2b8f0 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  t nPage){.  int 
2b900 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  i, j;.  for(i=0;
2b910 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a   i<nPage; i++){.
2b920 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20      Pgno n;.    
2b930 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67  u8 e;.    MemPag
2b940 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67  e *pPage = apPag
2b950 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72  e[i];.    BtShar
2b960 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
2b970 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
2b980 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2b990 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  );..    for(j=0;
2b9a0 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   j<pPage->nCell;
2b9b0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c   j++){.      Cel
2b9c0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
2b9d0 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20    u8 *z;.     . 
2b9e0 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c       z = findCel
2b9f0 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20  l(pPage, j);.   
2ba00 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
2ba10 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2ba20 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  e, z, &info);.  
2ba30 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
2ba40 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
2ba50 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
2ba60 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69  t4byte(&z[info.i
2ba70 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20  Overflow]);.    
2ba80 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42      ptrmapGet(pB
2ba90 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29  t, ovfl, &e, &n)
2baa0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2bab0 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
2bac0 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56   && e==PTRMAP_OV
2bad0 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20  ERFLOW1 );.     
2bae0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
2baf0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2bb00 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20       Pgno child 
2bb10 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20  = get4byte(z);. 
2bb20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74         ptrmapGet
2bb30 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c  (pBt, child, &e,
2bb40 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73   &n);.        as
2bb50 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
2bb60 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
2bb70 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20  P_BTREE );.     
2bb80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2bb90 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2bba0 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
2bbb0 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  d = get4byte(&pP
2bbc0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2bbd0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2bbe0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74  .      ptrmapGet
2bbf0 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c  (pBt, child, &e,
2bc00 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65   &n);.      asse
2bc10 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
2bc20 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
2bc30 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20  BTREE );.    }. 
2bc40 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
2bc50 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2bc60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2bc70 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65  used to copy the
2bc80 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2bc90 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f   b-tree node sto
2bca0 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20  red .** on page 
2bcb0 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54  pFrom to page pT
2bcc0 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d  o. If page pFrom
2bcd0 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20   was not a leaf 
2bce0 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  page, then.** th
2bcf0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
2bd00 74 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 63  tries for each c
2bd10 68 69 6c 64 20 70 61 67 65 20 61 72 65 20 75 70  hild page are up
2bd20 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  dated so that th
2bd30 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65  e.** parent page
2bd40 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70   stored in the p
2bd50 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61  ointer map is pa
2bd60 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d  ge pTo. If pFrom
2bd70 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e   contained.** an
2bd80 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65  y cells with ove
2bd90 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
2bda0 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ers, then the co
2bdb0 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e  rresponding poin
2bdc0 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
2bdd0 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61  es are also upda
2bde0 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ted so that the 
2bdf0 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 70  parent page is p
2be00 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49  age pTo..**.** I
2be10 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65  f pFrom is curre
2be20 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e  ntly carrying an
2be30 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  y overflow cells
2be40 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65   (entries in the
2be50 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66  .** MemPage.aOvf
2be60 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79  l[] array), they
2be70 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20   are not copied 
2be80 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42  to pTo. .**.** B
2be90 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
2bea0 20 70 61 67 65 20 70 54 6f 20 69 73 20 72 65 69   page pTo is rei
2beb0 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67  nitialized using
2bec0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
2bed0 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  tPage()..**.** T
2bee0 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  he performance o
2bef0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2bf00 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e  is not critical.
2bf10 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64   It is only used
2bf20 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61   by .** the bala
2bf30 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20  nce_shallower() 
2bf40 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  and balance_deep
2bf50 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c  er() procedures,
2bf60 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77   neither of.** w
2bf70 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20  hich are called 
2bf80 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d  often under norm
2bf90 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  al circumstances
2bfa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2bfb0 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
2bfc0 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20  MemPage *pFrom, 
2bfd0 4d 65 6d 50 61 67 65 20 2a 70 54 6f 29 7b 0a 20  MemPage *pTo){. 
2bfe0 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73   BtShared * cons
2bff0 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70  t pBt = pFrom->p
2c000 42 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  Bt;.  u8 * const
2c010 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e   aFrom = pFrom->
2c020 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f  aData;.  u8 * co
2c030 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61  nst aTo = pTo->a
2c040 44 61 74 61 3b 0a 20 20 69 6e 74 20 63 6f 6e 73  Data;.  int cons
2c050 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72  t iFromHdr = pFr
2c060 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  om->hdrOffset;. 
2c070 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64   int const iToHd
2c080 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d  r = ((pTo->pgno=
2c090 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a  =1) ? 100 : 0);.
2c0a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2c0b0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 44 61 74  E_OK;.  int iDat
2c0c0 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  a;..  assert( pF
2c0d0 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  rom->isInit );. 
2c0e0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2c0f0 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b  nFree>=iToHdr );
2c100 0a 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62  .  assert( get2b
2c110 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  yte(&aFrom[iFrom
2c120 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75 73  Hdr+5])<=pBt->us
2c130 61 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20 20 2f  ableSize );..  /
2c140 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65  * Copy the b-tre
2c150 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66  e node content f
2c160 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74  rom page pFrom t
2c170 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20  o page pTo. */. 
2c180 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74   iData = get2byt
2c190 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
2c1a0 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  r+5]);.  memcpy(
2c1b0 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46  &aTo[iData], &aF
2c1c0 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d  rom[iData], pBt-
2c1d0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74  >usableSize-iDat
2c1e0 61 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61 54  a);.  memcpy(&aT
2c1f0 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f  o[iToHdr], &aFro
2c200 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72  m[iFromHdr], pFr
2c210 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  om->cellOffset +
2c220 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29   2*pFrom->nCell)
2c230 3b 0a 0a 20 20 2f 2a 20 52 65 69 6e 69 74 69 61  ;..  /* Reinitia
2c240 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f  lize page pTo so
2c250 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
2c260 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ts of the MemPag
2c270 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
2c280 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64   match the new d
2c290 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c  ata. The initial
2c2a0 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 22  ization of pTo "
2c2b0 63 61 6e 6e 6f 74 22 20 66 61 69 6c 2c 20 61 73  cannot" fail, as
2c2c0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 20 63   the.  ** data c
2c2d0 6f 70 69 65 64 20 66 72 6f 6d 20 70 46 72 6f 6d  opied from pFrom
2c2e0 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
2c2f0 76 61 6c 69 64 2e 20 20 2a 2f 0a 20 20 70 54 6f  valid.  */.  pTo
2c300 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
2c310 54 45 53 54 4f 4e 4c 59 28 72 63 20 3d 20 29 20  TESTONLY(rc = ) 
2c320 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
2c330 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 61 73 73  Page(pTo);.  ass
2c340 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2c350 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  OK );..  /* If t
2c360 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
2c370 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
2c380 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
2c390 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20  er-map entries. 
2c3a0 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72   ** for any b-tr
2c3b0 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  ee or overflow p
2c3c0 61 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f  ages that pTo no
2c3d0 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  w contains the p
2c3e0 6f 69 6e 74 65 72 73 20 74 6f 2e 20 2a 2f 0a 20  ointers to. */. 
2c3f0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2c400 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  M ){.    rc = se
2c410 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54  tChildPtrmaps(pT
2c420 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
2c430 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2c440 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73  is routine redis
2c450 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20 6f  tributes cells o
2c460 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49 64 78  n the iParentIdx
2c470 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50 61  'th child of pPa
2c480 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66 74  rent.** (hereaft
2c490 65 72 20 22 74 68 65 20 70 61 67 65 22 29 20 61  er "the page") a
2c4a0 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c 69  nd up to 2 sibli
2c4b0 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 20  ngs so that all 
2c4c0 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74  pages have about
2c4d0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f   the.** same amo
2c4e0 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63  unt of free spac
2c4f0 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e  e. Usually a sin
2c500 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65  gle sibling on e
2c510 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68  ither side of th
2c520 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75 73  e.** page are us
2c530 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
2c540 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74 68  ing, though both
2c550 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20   siblings might 
2c560 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a  come from one.**
2c570 20 73 69 64 65 20 69 66 20 74 68 65 20 70 61 67   side if the pag
2c580 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  e is the first o
2c590 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20  r last child of 
2c5a0 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20 74  its parent. If t
2c5b0 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73 20  he page .** has 
2c5c0 66 65 77 65 72 20 74 68 61 6e 20 32 20 73 69 62  fewer than 2 sib
2c5d0 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e 67  lings (something
2c5e0 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20   which can only 
2c5f0 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 70 61  happen if the pa
2c600 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20  ge.** is a root 
2c610 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64 20  page or a child 
2c620 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29 20  of a root page) 
2c630 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62  then all availab
2c640 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70  le siblings.** p
2c650 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
2c660 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a  e balancing..**.
2c670 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
2c680 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68 65   siblings of the
2c690 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 69   page might be i
2c6a0 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72  ncreased or decr
2c6b0 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65  eased by .** one
2c6c0 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65 66   or two in an ef
2c6d0 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67  fort to keep pag
2c6e0 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62  es nearly full b
2c6f0 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c  ut not over full
2c700 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  . .**.** Note th
2c710 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  at when this rou
2c720 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
2c730 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  some of the cell
2c740 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
2c750 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61   might not actua
2c760 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e  lly be stored in
2c770 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d   MemPage.aData[]
2c780 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65  . This can happe
2c790 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65  n.** if the page
2c7a0 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68   is overfull. Th
2c7b0 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
2c7c0 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c  es that all cell
2c7d0 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74  s allocated.** t
2c7e0 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69  o the page and i
2c7f0 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69 74 20  ts siblings fit 
2c800 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61  into MemPage.aDa
2c810 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65 74 75  ta[] before retu
2c820 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  rning..**.** In 
2c830 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61  the course of ba
2c840 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67 65  lancing the page
2c850 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67   and its sibling
2c860 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a  s, cells may be.
2c870 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ** inserted into
2c880 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   or removed from
2c890 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2c8a0 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e   (pParent). Doin
2c8b0 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73  g so.** may caus
2c8c0 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
2c8d0 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72  e to become over
2c8e0 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c  full or underful
2c8f0 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 68 61  l. If this.** ha
2c900 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74 68 65  ppens, it is the
2c910 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
2c920 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
2c930 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72 72   invoke the corr
2c940 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67  ect.** balancing
2c950 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 78 20   routine to fix 
2c960 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 73 65  this problem (se
2c970 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20  e the balance() 
2c980 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a  routine). .**.**
2c990 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
2c9a0 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
2c9b0 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20  eason, it might 
2c9c0 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61  leave the databa
2c9d0 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75  se.** in a corru
2c9e0 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f 20 69  pted state. So i
2c9f0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
2ca00 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61  ails, the databa
2ca10 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  se should.** be 
2ca20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
2ca30 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61 72 67  ** The third arg
2ca40 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
2ca50 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61  nction, aOvflSpa
2ca60 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ce, is a pointer
2ca70 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72 20   to a.** buffer 
2ca80 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20  page-size bytes 
2ca90 69 6e 20 73 69 7a 65 2e 20 49 66 2c 20 69 6e 20  in size. If, in 
2caa0 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20  inserting cells 
2cab0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a  into the parent.
2cac0 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e 74  ** page (pParent
2cad0 29 2c 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ), the parent pa
2cae0 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66  ge becomes overf
2caf0 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72  ull, this buffer
2cb00 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73   is.** used to s
2cb10 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 73  tore the parents
2cb20 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
2cb30 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66 75   Because this fu
2cb40 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a  nction inserts.*
2cb50 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66  * a maximum of f
2cb60 6f 75 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c  our divider cell
2cb70 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
2cb80 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20  t page, and the 
2cb90 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20  maximum.** size 
2cba0 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64  of a cell stored
2cbb0 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72   within an inter
2cbc0 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61  nal node is alwa
2cbd0 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34  ys less than 1/4
2cbe0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d  .** of the page-
2cbf0 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53  size, the aOvflS
2cc00 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73  pace[] buffer is
2cc10 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2cc20 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67  e large.** enoug
2cc30 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c  h for all overfl
2cc40 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  ow cells..**.** 
2cc50 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73  If aOvflSpace is
2cc60 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70   set to a null p
2cc70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
2cc80 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a  ction returns .*
2cc90 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  * SQLITE_NOMEM..
2cca0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2ccb0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20  lance_nonroot(. 
2ccc0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
2ccd0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2cce0 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20   /* Parent page 
2ccf0 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e  of siblings bein
2cd00 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  g balanced */.  
2cd10 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20  int iParentIdx, 
2cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd30 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65  /* Index of "the
2cd40 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e   page" in pParen
2cd50 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c  t */.  u8 *aOvfl
2cd60 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
2cd70 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73         /* page-s
2cd80 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
2cd90 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76  ce for parent ov
2cda0 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f  fl */.  int isRo
2cdb0 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ot              
2cdc0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2cdd0 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20  if pParent is a 
2cde0 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a  root-page */.){.
2cdf0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ce10 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61  * The whole data
2ce20 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  base */.  int nC
2ce30 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
2ce40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ce50 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43   of cells in apC
2ce60 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
2ce70 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20  MaxCells = 0;   
2ce80 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
2ce90 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43  ated size of apC
2cea0 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72  ell, szCell, aFr
2ceb0 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  om. */.  int nNe
2cec0 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
2ced0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2cee0 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65  of pages in apNe
2cef0 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c  w[] */.  int nOl
2cf00 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2cf10 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2cf20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c  of pages in apOl
2cf30 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  d[] */.  int i, 
2cf40 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
2cf50 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2cf60 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
2cf70 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20  nxDiv;          
2cf80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
2cf90 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e   divider slot in
2cfa0 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
2cfb0 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  ] */.  int rc = 
2cfc0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2cfd0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
2cfe0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  n code */.  u16 
2cff0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20  leafCorrection; 
2d000 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66           /* 4 if
2d010 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
2d020 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20  .  0 if not */. 
2d030 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20   int leafData;  
2d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d050 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69   True if pPage i
2d060 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45  s a leaf of a LE
2d070 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20  AFDATA tree */. 
2d080 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65   int usableSpace
2d090 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2d0a0 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20   Bytes in pPage 
2d0b0 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65  beyond the heade
2d0c0 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46  r */.  int pageF
2d0d0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
2d0e0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
2d0f0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
2d100 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61  */.  int subtota
2d110 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2d120 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66    /* Subtotal of
2d130 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20   bytes in cells 
2d140 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20  on one page */. 
2d150 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30   int iSpace1 = 0
2d160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2d170 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
2d180 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20  te of aSpace1[] 
2d190 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70  */.  int iOvflSp
2d1a0 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ace = 0;        
2d1b0 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
2d1c0 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53  d byte of aOvflS
2d1d0 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pace[] */.  int 
2d1e0 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20  szScratch;      
2d1f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2d200 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f   of scratch memo
2d210 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  ry requested */.
2d220 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64    MemPage *apOld
2d230 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [NB];          /
2d240 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
2d250 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a  o two siblings *
2d260 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43  /.  MemPage *apC
2d270 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
2d280 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69   /* Private copi
2d290 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61  es of apOld[] pa
2d2a0 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ges */.  MemPage
2d2b0 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   *apNew[NB+2];  
2d2c0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
2d2d0 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c  nd up to NB sibl
2d2e0 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ings after balan
2d2f0 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52  cing */.  u8 *pR
2d300 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  ight;           
2d310 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69         /* Locati
2d320 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20  on in parent of 
2d330 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f  right-sibling po
2d340 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61  inter */.  u8 *a
2d350 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20  pDiv[NB-1];     
2d360 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64          /* Divid
2d370 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  er cells in pPar
2d380 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ent */.  int cnt
2d390 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
2d3a0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
2d3b0 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c  n aCell[] of cel
2d3c0 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67  l after i-th pag
2d3d0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77  e */.  int szNew
2d3e0 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
2d3f0 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20      /* Combined 
2d400 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c  size of cells pl
2d410 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65  ace on i-th page
2d420 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
2d430 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
2d440 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
2d450 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
2d460 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
2d470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d480 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
2d490 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
2d4a0 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20  pCell[] */.  u8 
2d4b0 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20  *aSpace1;       
2d4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
2d4d0 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66  ce for copies of
2d4e0 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
2d4f0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
2d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d510 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f    /* Temp var to
2d520 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75   store a page nu
2d530 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42  mber in */..  pB
2d540 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74  t = pParent->pBt
2d550 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2d560 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2d570 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2d580 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2d590 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2d5a0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
2d5b0 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52  ) );..#if 0.  TR
2d5c0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62  ACE(("BALANCE: b
2d5d0 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69  egin page %d chi
2d5e0 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  ld of %d\n", pPa
2d5f0 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e  ge->pgno, pParen
2d600 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69  t->pgno));.#endi
2d610 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  f..  /* At this 
2d620 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61  point pParent ma
2d630 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  y have at most o
2d640 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ne overflow cell
2d650 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68  . And if.  ** th
2d660 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  is overflow cell
2d670 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20   is present, it 
2d680 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c  must be the cell
2d690 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65   with .  ** inde
2d6a0 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68  x iParentIdx. Th
2d6b0 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65  is scenario come
2d6c0 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69  s about when thi
2d6d0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
2d6e0 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72  is called (indir
2d6f0 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69  ectly) from sqli
2d700 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
2d710 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
2d720 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2d730 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d  w==0 || pParent-
2d740 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b  >nOverflow==1 );
2d750 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
2d760 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  nt->nOverflow==0
2d770 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76   || pParent->aOv
2d780 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65  fl[0].idx==iPare
2d790 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20  ntIdx );..  if( 
2d7a0 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20  !aOvflSpace ){. 
2d7b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d7c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
2d7d0 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69  * Find the sibli
2d7e0 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61  ng pages to bala
2d7f0 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65  nce. Also locate
2d800 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50   the cells in pP
2d810 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74  arent .  ** that
2d820 20 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c   divide the sibl
2d830 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74  ings. An attempt
2d840 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64   is made to find
2d850 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
2d860 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64  .  ** either sid
2d870 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65  e of pPage. More
2d880 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61   siblings are ta
2d890 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ken from one sid
2d8a0 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a  e, however, .  *
2d8b0 2a 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66  * if there are f
2d8c0 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62  ewer than NN sib
2d8d0 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68  lings on the oth
2d8e0 65 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72  er side. If pPar
2d8f0 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20  ent.  ** has NB 
2d900 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65  or fewer childre
2d910 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64  n then all child
2d920 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61  ren of pParent a
2d930 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a  re taken.  .  **
2d940 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
2d950 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64  also drops the d
2d960 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f  ivider cells fro
2d970 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
2d980 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79  e. This.  ** way
2d990 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  , the remainder 
2d9a0 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
2d9b0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
2d9c0 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20   deal with any. 
2d9d0 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   ** overflow cel
2d9e0 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ls in the parent
2d9f0 20 70 61 67 65 2c 20 61 73 20 69 66 20 6f 6e 65   page, as if one
2da00 20 65 78 69 73 74 65 64 20 69 74 20 68 61 73 20   existed it has 
2da10 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
2da20 6e 20 72 65 6d 6f 76 65 64 2e 20 20 2a 2f 0a 20  n removed.  */. 
2da30 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f   i = pParent->nO
2da40 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e  verflow + pParen
2da50 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20  t->nCell;.  if( 
2da60 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  i<2 ){.    nxDiv
2da70 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d   = 0;.    nOld =
2da80 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   i+1;.  }else{. 
2da90 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20     nOld = 3;.   
2daa0 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
2dab0 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
2dac0 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44        .      nxD
2dad0 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  iv = 0;.    }els
2dae0 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78  e if( iParentIdx
2daf0 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44  ==i ){.      nxD
2db00 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65  iv = i-2;.    }e
2db10 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76  lse{.      nxDiv
2db20 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b   = iParentIdx-1;
2db30 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32  .    }.    i = 2
2db40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e  ;.  }.  if( (i+n
2db50 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
2db60 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e  verflow)==pParen
2db70 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
2db80 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e  pRight = &pParen
2db90 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
2dba0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a  ->hdrOffset+8];.
2dbb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69    }else{.    pRi
2dbc0 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ght = findCell(p
2dbd0 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
2dbe0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2dbf0 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20  ow);.  }.  pgno 
2dc00 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68  = get4byte(pRigh
2dc10 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  t);.  while( 1 )
2dc20 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  {.    rc = getAn
2dc30 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
2dc40 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b  gno, &apOld[i]);
2dc50 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2dc60 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c       memset(apOl
2dc70 64 2c 20 30 2c 20 69 2a 73 69 7a 65 6f 66 28 4d  d, 0, i*sizeof(M
2dc80 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20  emPage*));.     
2dc90 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2dca0 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20  eanup;.    }.   
2dcb0 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b   nMaxCells += 1+
2dcc0 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b  apOld[i]->nCell+
2dcd0 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66  apOld[i]->nOverf
2dce0 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d  low;.    if( (i-
2dcf0 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  -)==0 ) break;..
2dd00 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d      if( pParent-
2dd10 3e 6e 4f 76 65 72 66 6c 6f 77 20 26 26 20 69 2b  >nOverflow && i+
2dd20 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e  nxDiv==pParent->
2dd30 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 29 7b 0a  aOvfl[0].idx ){.
2dd40 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
2dd50 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b   pParent->aOvfl[
2dd60 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  0].pCell;.      
2dd70 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
2dd80 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
2dd90 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
2dda0 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
2ddb0 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20   apDiv[i]);.    
2ddc0 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72    pParent->nOver
2ddd0 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65  flow = 0;.    }e
2dde0 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76  lse{.      apDiv
2ddf0 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
2de00 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
2de10 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2de20 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20  ow);.      pgno 
2de30 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
2de40 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  [i]);.      szNe
2de50 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  w[i] = cellSizeP
2de60 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
2de70 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  v[i]);..      /*
2de80 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66   Drop the cell f
2de90 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
2dea0 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74  age. apDiv[i] st
2deb0 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20  ill points to.  
2dec0 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20      ** the cell 
2ded0 77 69 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e  within the paren
2dee0 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  t, even though i
2def0 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70  t has been dropp
2df00 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  ed..      ** Thi
2df10 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73  s is safe becaus
2df20 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c  e dropping a cel
2df30 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65  l only overwrite
2df40 73 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  s the first.    
2df50 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20    ** four bytes 
2df60 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20  of it, and this 
2df70 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
2df80 74 20 6e 65 65 64 20 74 68 65 20 66 69 72 73 74  t need the first
2df90 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
2dfa0 79 74 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  ytes of the divi
2dfb0 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65  der cell. So the
2dfc0 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65   pointer is safe
2dfd0 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a   to use.      **
2dfe0 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20   later on.  .   
2dff0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55     **.      ** U
2e000 6e 6c 65 73 73 20 53 51 4c 69 74 65 20 69 73 20  nless SQLite is 
2e010 63 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65 63 75  compiled in secu
2e020 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20  re-delete mode. 
2e030 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 20 20  In this case,.  
2e040 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43      ** the dropC
2e050 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69  ell() routine wi
2e060 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
2e070 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74   entire cell wit
2e080 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20 20  h zeroes..      
2e090 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  ** In this case,
2e0a0 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70   temporarily cop
2e0b0 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20  y the cell into 
2e0c0 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d  the aOvflSpace[]
2e0d0 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72  .      ** buffer
2e0e0 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f 70  . It will be cop
2e0f0 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61 73  ied out again as
2e100 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 70   soon as the aSp
2e110 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20 20  ace[] buffer.   
2e120 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74     ** is allocat
2e130 65 64 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  ed.  */.#ifdef S
2e140 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
2e150 45 54 45 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ETE.      memcpy
2e160 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44  (&aOvflSpace[apD
2e170 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61  iv[i]-pParent->a
2e180 44 61 74 61 5d 2c 20 61 70 44 69 76 5b 69 5d 2c  Data], apDiv[i],
2e190 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20   szNew[i]);.    
2e1a0 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f    apDiv[i] = &aO
2e1b0 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69  vflSpace[apDiv[i
2e1c0 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  ]-pParent->aData
2e1d0 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ];.#endif.      
2e1e0 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
2e1f0 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e  , i+nxDiv-pParen
2e200 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a  t->nOverflow, sz
2e210 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  New[i]);.    }. 
2e220 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d   }..  /* Make nM
2e230 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70  axCells a multip
2e240 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72  le of 4 in order
2e250 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62   to preserve 8-b
2e260 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65  yte.  ** alignme
2e270 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c  nt */.  nMaxCell
2e280 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b  s = (nMaxCells +
2e290 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20   3)&~3;..  /*.  
2e2a0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
2e2b0 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72  e for memory str
2e2c0 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b  uctures.  */.  k
2e2d0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
2e2e0 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   + ROUND8(sizeof
2e2f0 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a  (MemPage));.  sz
2e300 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20  Scratch =.      
2e310 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
2e320 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20  f(u8*)          
2e330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e340 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  apCell */.     +
2e350 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
2e360 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20  f(u16)          
2e370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e380 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  szCell */.     +
2e390 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20   pBt->pageSize  
2e3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e3c0 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20  aSpace1 */.     
2e3d0 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20  + k*nOld;       
2e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e400 20 50 61 67 65 20 63 6f 70 69 65 73 20 28 61 70   Page copies (ap
2e410 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c  Copy) */.  apCel
2e420 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74  l = sqlite3Scrat
2e430 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61  chMalloc( szScra
2e440 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70  tch ); .  if( ap
2e450 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Cell==0 ){.    r
2e460 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2e470 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
2e480 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
2e490 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a    szCell = (u16*
2e4a0 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&apCell[nMaxCel
2e4b0 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d  ls];.  aSpace1 =
2e4c0 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d   (u8*)&szCell[nM
2e4d0 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65  axCells];.  asse
2e4e0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2e4f0 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31  LIGNMENT(aSpace1
2e500 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ) );..  /*.  ** 
2e510 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f  Load pointers to
2e520 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69   all cells on si
2e530 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20  bling pages and 
2e540 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
2e550 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20  s.  ** into the 
2e560 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61  local apCell[] a
2e570 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69  rray.  Make copi
2e580 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
2e590 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
2e5a0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
2e5b0 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20   from aSpace1[] 
2e5c0 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74  and remove the t
2e5d0 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73  he divider Cells
2e5e0 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65  .  ** from pPare
2e5f0 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  nt..  **.  ** If
2e600 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
2e610 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c  e on leaf pages,
2e620 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
2e630 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a  pointers of the.
2e640 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c    ** divider cel
2e650 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20  ls are stripped 
2e660 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62  from the cells b
2e670 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63  efore they are c
2e680 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  opied.  ** into 
2e690 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74  aSpace1[].  In t
2e6a0 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
2e6b0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
2e6c0 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
2e6d0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
2e6e0 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
2e6f0 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
2e700 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
2e710 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
2e720 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
2e730 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
2e740 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
2e750 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
2e760 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
2e770 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
2e780 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
2e790 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
2e7a0 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
2e7b0 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
2e7c0 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
2e7d0 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
2e7e0 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
2e7f0 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
2e800 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65    */.  leafCorre
2e810 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d  ction = apOld[0]
2e820 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
2e830 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  Data = apOld[0]-
2e840 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28  >hasData;.  for(
2e850 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
2e860 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74  ){.    int limit
2e870 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65  ;.    .    /* Be
2e880 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
2e890 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61  ing else, take a
2e8a0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74   copy of the i't
2e8b0 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69  h original sibli
2e8c0 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  ng.    ** The re
2e8d0 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  st of this funct
2e8e0 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74  ion will use dat
2e8f0 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65  a from the copie
2e900 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20  s rather.    ** 
2e910 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
2e920 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68  l pages since th
2e930 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
2e940 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a   will be in the.
2e950 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f      ** process o
2e960 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  f being overwrit
2e970 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d  ten.  */.    Mem
2e980 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
2e990 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67  opy[i] = (MemPag
2e9a0 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d  e*)&aSpace1[pBt-
2e9b0 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d  >pageSize + k*i]
2e9c0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c  ;.    memcpy(pOl
2e9d0 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a  d, apOld[i], siz
2e9e0 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20  eof(MemPage));. 
2e9f0 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d     pOld->aData =
2ea00 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d   (void*)&pOld[1]
2ea10 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c  ;.    memcpy(pOl
2ea20 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b  d->aData, apOld[
2ea30 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  i]->aData, pBt->
2ea40 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20  pageSize);..    
2ea50 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43  limit = pOld->nC
2ea60 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ell+pOld->nOverf
2ea70 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  low;.    for(j=0
2ea80 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
2ea90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2eaa0 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
2eab0 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
2eac0 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72  Cell] = findOver
2ead0 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a  flowCell(pOld, j
2eae0 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
2eaf0 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
2eb00 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
2eb10 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
2eb20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a   nCell++;.    }.
2eb30 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31      if( i<nOld-1
2eb40 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a   && !leafData){.
2eb50 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28        u16 sz = (
2eb60 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20  u16)szNew[i];.  
2eb70 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
2eb80 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
2eb90 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
2eba0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
2ebb0 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ll] = sz;.      
2ebc0 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31  pTemp = &aSpace1
2ebd0 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20  [iSpace1];.     
2ebe0 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a   iSpace1 += sz;.
2ebf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
2ec00 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f  <=pBt->pageSize/
2ec10 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  4 );.      asser
2ec20 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d  t( iSpace1<=pBt-
2ec30 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
2ec40 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c     memcpy(pTemp,
2ec50 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a   apDiv[i], sz);.
2ec60 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
2ec70 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
2ec80 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
2ec90 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
2eca0 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c  rrection==0 || l
2ecb0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
2ecc0 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c   );.      szCell
2ecd0 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c  [nCell] = szCell
2ece0 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f  [nCell] - leafCo
2ecf0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
2ed00 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20  if( !pOld->leaf 
2ed10 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2ed20 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
2ed30 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
2ed40 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64  assert( pOld->hd
2ed50 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20  rOffset==0 );.  
2ed60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
2ed70 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht pointer of th
2ed80 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c  e child page pOl
2ed90 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65  d becomes the le
2eda0 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  ft.        ** po
2edb0 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76  inter of the div
2edc0 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20  ider cell */.   
2edd0 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65       memcpy(apCe
2ede0 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64  ll[nCell], &pOld
2edf0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a  ->aData[8], 4);.
2ee00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ee10 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
2ee20 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
2ee30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  ;.        if( sz
2ee40 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b  Cell[nCell]<4 ){
2ee50 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  .          /* Do
2ee60 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63   not allow any c
2ee70 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  ells smaller tha
2ee80 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  n 4 bytes. */.  
2ee90 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
2eea0 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20  Cell] = 4;.     
2eeb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2eec0 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
2eed0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
2eee0 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
2eef0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2ef00 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61  needed to hold a
2ef10 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a  ll nCell cells..
2ef20 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20    ** Store this 
2ef30 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20  number in "k".  
2ef40 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e  Also compute szN
2ef50 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
2ef60 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a  e total.  ** siz
2ef70 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  e of all cells o
2ef80 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20  n the i-th page 
2ef90 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69  and cntNew[] whi
2efa0 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a  ch is the index.
2efb0 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d    ** in apCell[]
2efc0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61   of the cell tha
2efd0 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69  t divides page i
2efe0 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20   from page i+1. 
2eff0 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d   .  ** cntNew[k]
2f000 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43   should equal nC
2f010 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ell..  **.  ** V
2f020 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62  alues computed b
2f030 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20  y this block:.  
2f040 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
2f050 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e    k: The total n
2f060 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
2f070 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73   pages.  **    s
2f080 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20  zNew[i]: Spaced 
2f090 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68  used on the i-th
2f0a0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
2f0b0 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a   **   cntNew[i]:
2f0c0 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c   Index in apCell
2f0d0 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20  [] and szCell[] 
2f0e0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65  for the first ce
2f0f0 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20  ll to.  **      
2f100 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
2f110 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69  t of the i-th si
2f120 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
2f130 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75   usableSpace: Nu
2f140 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2f150 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
2f160 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67   on each sibling
2f170 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75  ..  ** .  */.  u
2f180 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74  sableSpace = pBt
2f190 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31  ->usableSize - 1
2f1a0 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  2 + leafCorrecti
2f1b0 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74  on;.  for(subtot
2f1c0 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c  al=k=i=0; i<nCel
2f1d0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  l; i++){.    ass
2f1e0 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73  ert( i<nMaxCells
2f1f0 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c   );.    subtotal
2f200 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20   += szCell[i] + 
2f210 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f  2;.    if( subto
2f220 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63  tal > usableSpac
2f230 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77  e ){.      szNew
2f240 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d  [k] = subtotal -
2f250 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
2f260 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b    cntNew[k] = i;
2f270 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
2f280 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  ata ){ i--; }.  
2f290 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30      subtotal = 0
2f2a0 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20  ;.      k++;.   
2f2b0 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b     if( k>NB+1 ){
2f2c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2f2d0 52 55 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e  RUPT; goto balan
2f2e0 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20  ce_cleanup; }.  
2f2f0 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b    }.  }.  szNew[
2f300 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20  k] = subtotal;. 
2f310 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65   cntNew[k] = nCe
2f320 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a  ll;.  k++;..  /*
2f330 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e  .  ** The packin
2f340 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  g computed by th
2f350 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b  e previous block
2f360 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72   is biased towar
2f370 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20  d the siblings. 
2f380 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20   ** on the left 
2f390 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20  side.  The left 
2f3a0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77  siblings are alw
2f3b0 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c  ays nearly full,
2f3c0 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20   while the.  ** 
2f3d0 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
2f3e0 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72  ng might be near
2f3f0 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
2f400 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74  block of code at
2f410 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61  tempts.  ** to a
2f420 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e  djust the packin
2f430 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f  g of siblings to
2f440 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61   get a better ba
2f450 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lance..  **.  **
2f460 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
2f470 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e   is more than an
2f480 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
2f490 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76  The packing abov
2f4a0 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20  e might.  ** be 
2f4b0 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63  so out of balanc
2f4c0 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67  e as to be illeg
2f4d0 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  al.  For example
2f4e0 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  , the right-most
2f4f0 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69  .  ** sibling mi
2f500 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  ght be completel
2f510 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61  y empty.  This a
2f520 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74  djustment is not
2f530 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a   optional..  */.
2f540 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30    for(i=k-1; i>0
2f550 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
2f560 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b  szRight = szNew[
2f570 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  i];  /* Size of 
2f580 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72  sibling on the r
2f590 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ight */.    int 
2f5a0 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69  szLeft = szNew[i
2f5b0 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20  -1]; /* Size of 
2f5c0 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c  sibling on the l
2f5d0 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  eft */.    int r
2f5e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2f5f0 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
2f600 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65  -most cell in le
2f610 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20  ft sibling */.  
2f620 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20    int d;        
2f630 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2f640 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  f first cell to 
2f650 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68  the left of righ
2f660 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20  t sibling */..  
2f670 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
2f680 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72  ] - 1;.    d = r
2f690 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
2f6a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e  .    assert( d<n
2f6b0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2f6c0 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65  assert( r<nMaxCe
2f6d0 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  lls );.    while
2f6e0 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20  ( szRight==0 || 
2f6f0 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64  szRight+szCell[d
2f700 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43  ]+2<=szLeft-(szC
2f710 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20  ell[r]+2) ){.   
2f720 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a     szRight += sz
2f730 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20  Cell[d] + 2;.   
2f740 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43     szLeft -= szC
2f750 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[r] + 2;.    
2f760 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b    cntNew[i-1]--;
2f770 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  .      r = cntNe
2f780 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
2f790 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
2f7a0 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  afData;.    }.  
2f7b0 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52    szNew[i] = szR
2f7c0 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b  ight;.    szNew[
2f7d0 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20  i-1] = szLeft;. 
2f7e0 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20   }..  /* Either 
2f7f0 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20  we found one or 
2f800 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e  more cells (cntn
2f810 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61  ew[0])>0) or pPa
2f820 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72  ge is.  ** a vir
2f830 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
2f840 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   A virtual root 
2f850 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65  page is when the
2f860 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20   real root.  ** 
2f870 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61  page is page 1 a
2f880 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e  nd we are the on
2f890 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74  ly child of that
2f8a0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
2f8b0 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e  sert( cntNew[0]>
2f8c0 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70  0 || (pParent->p
2f8d0 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e  gno==1 && pParen
2f8e0 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a  t->nCell==0) );.
2f8f0 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
2f900 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25  CE: old: %d %d %
2f910 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b  d  ",.    apOld[
2f920 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e  0]->pgno, .    n
2f930 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31  Old>=2 ? apOld[1
2f940 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20  ]->pgno : 0,.   
2f950 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64   nOld>=3 ? apOld
2f960 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20  [2]->pgno : 0.  
2f970 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ));..  /*.  ** A
2f980 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61  llocate k new pa
2f990 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20  ges.  Reuse old 
2f9a0 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73  pages where poss
2f9b0 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ible..  */.  if(
2f9c0 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c   apOld[0]->pgno<
2f9d0 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =1 ){.    rc = S
2f9e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
2f9f0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2fa00 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70  cleanup;.  }.  p
2fa10 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64  ageFlags = apOld
2fa20 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  [0]->aData[0];. 
2fa30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
2fa40 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
2fa50 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
2fa60 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
2fa70 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
2fa80 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
2fa90 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
2faa0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2fab0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
2fac0 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  w->pDbPage);.   
2fad0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
2fae0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
2faf0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2fb00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fb10 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
2fb20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
2fb30 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2fb40 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20  , &pNew, &pgno, 
2fb50 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
2fb60 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
2fb70 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2fb80 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
2fb90 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77  pNew;.      nNew
2fba0 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65  ++;..      /* Se
2fbb0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
2fbc0 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  p entry for the 
2fbd0 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
2fbe0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49  . */.      if( I
2fbf0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2fc00 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
2fc10 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d  apPut(pBt, pNew-
2fc20 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  >pgno, PTRMAP_BT
2fc30 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
2fc40 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
2fc50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2fc60 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2fc70 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2fc80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2fc90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2fca0 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64   /* Free any old
2fcb0 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65   pages that were
2fcc0 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e   not reused as n
2fcd0 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ew pages..  */. 
2fce0 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29   while( i<nOld )
2fcf0 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  {.    rc = freeP
2fd00 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
2fd10 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2fd20 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2fd30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
2fd40 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
2fd50 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
2fd60 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
2fd70 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e  *.  ** Put the n
2fd80 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65  ew pages in acce
2fd90 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68  nding order.  Th
2fda0 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a  is helps to.  **
2fdb0 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e   keep entries in
2fdc0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
2fdd0 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20  n order so that 
2fde0 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74  a scan.  ** of t
2fdf0 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69  he table is a li
2fe00 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
2fe10 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61  h the file.  Tha
2fe20 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68  t.  ** in turn h
2fe30 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69  elps the operati
2fe40 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c  ng system to del
2fe50 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20  iver pages.  ** 
2fe60 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f  from the disk mo
2fe70 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a  re rapidly..  **
2fe80 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20  .  ** An O(n^2) 
2fe90 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61  insertion sort a
2fea0 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64  lgorithm is used
2feb0 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a  , but since.  **
2fec0 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65   n is never more
2fed0 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c   than NB (a smal
2fee0 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61  l constant), tha
2fef0 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f  t should.  ** no
2ff00 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
2ff10 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e    **.  ** When N
2ff20 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f  B==3, this one o
2ff30 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65  ptimization make
2ff40 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  s the database. 
2ff50 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61   ** about 25% fa
2ff60 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69  ster for large i
2ff70 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65  nsertions and de
2ff80 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  letions..  */.  
2ff90 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20  for(i=0; i<k-1; 
2ffa0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69  i++){.    int mi
2ffb0 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70  nV = apNew[i]->p
2ffc0 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  gno;.    int min
2ffd0 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a  I = i;.    for(j
2ffe0 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b  =i+1; j<k; j++){
2fff0 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77  .      if( apNew
30000 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67  [j]->pgno<(unsig
30010 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20  ned)minV ){.    
30020 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20      minI = j;.  
30030 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e        minV = apN
30040 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  ew[j]->pgno;.   
30050 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
30060 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20  f( minI>i ){.   
30070 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20     int t;.      
30080 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20  MemPage *pT;.   
30090 20 20 20 74 20 3d 20 61 70 4e 65 77 5b 69 5d 2d     t = apNew[i]-
300a0 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70 54 20  >pgno;.      pT 
300b0 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
300c0 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e    apNew[i] = apN
300d0 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
300e0 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54  apNew[minI] = pT
300f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52  ;.    }.  }.  TR
30100 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64  ACE(("new: %d(%d
30110 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
30120 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
30130 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e  ,.    apNew[0]->
30140 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a  pgno, szNew[0],.
30150 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70      nNew>=2 ? ap
30160 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[1]->pgno : 0
30170 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65  , nNew>=2 ? szNe
30180 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[1] : 0,.    nN
30190 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d  ew>=3 ? apNew[2]
301a0 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
301b0 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a  >=3 ? szNew[2] :
301c0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20   0,.    nNew>=4 
301d0 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f  ? apNew[3]->pgno
301e0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20   : 0, nNew>=4 ? 
301f0 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20  szNew[3] : 0,.  
30200 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65    nNew>=5 ? apNe
30210 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[4]->pgno : 0, 
30220 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b  nNew>=5 ? szNew[
30230 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73  4] : 0));..  ass
30240 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
30250 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
30260 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
30270 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69  ;.  put4byte(pRi
30280 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d  ght, apNew[nNew-
30290 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a  1]->pgno);..  /*
302a0 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73  .  ** Evenly dis
302b0 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61  tribute the data
302c0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72   in apCell[] acr
302d0 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65  oss the new page
302e0 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64  s..  ** Insert d
302f0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
30300 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63  o pParent as nec
30310 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a  essary..  */.  j
30320 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
30330 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
30340 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74     /* Assemble t
30350 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
30360 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  age. */.    MemP
30370 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
30380 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  w[i];.    assert
30390 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
303a0 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
303b0 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a  ew, pageFlags);.
303c0 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
303d0 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d  (pNew, cntNew[i]
303e0 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20  -j, &apCell[j], 
303f0 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20  &szCell[j]);.   
30400 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
30410 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d  Cell>0 || (nNew=
30420 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d  =1 && cntNew[0]=
30430 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
30440 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c  t( pNew->nOverfl
30450 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20  ow==0 );..    j 
30460 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20  = cntNew[i];..  
30470 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c    /* If the sibl
30480 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c  ing page assembl
30490 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74  ed above was not
304a0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
304b0 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20  sibling,.    ** 
304c0 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72  insert a divider
304d0 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70   cell into the p
304e0 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
304f0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
30500 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43  <nNew-1 || j==nC
30510 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a  ell );.    if( j
30520 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  <nCell ){.      
30530 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20  u8 *pCell;.     
30540 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
30550 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20    int sz;..     
30560 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
30570 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43  ells );.      pC
30580 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b  ell = apCell[j];
30590 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65  .      sz = szCe
305a0 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72  ll[j] + leafCorr
305b0 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54  ection;.      pT
305c0 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63  emp = &aOvflSpac
305d0 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20  e[iOvflSpace];. 
305e0 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e       if( !pNew->
305f0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
30600 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44  memcpy(&pNew->aD
30610 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34  ata[8], pCell, 4
30620 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
30630 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  f( leafData ){. 
30640 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
30650 20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d   tree is a leaf-
30660 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74  data tree, and t
30670 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
30680 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20  leaves, .       
30690 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69   ** then there i
306a0 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c  s no divider cel
306b0 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49  l in apCell[]. I
306c0 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69  nstead, the divi
306d0 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  der .        ** 
306e0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
306f0 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79   the integer key
30700 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d   for the right-m
30710 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20  ost cell of .   
30720 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c       ** the sibl
30730 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c  ing-page assembl
30740 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20  ed above only.. 
30750 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30760 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
30770 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20  .        j--;.  
30780 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
30790 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
307a0 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20  New, apCell[j], 
307b0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
307c0 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
307d0 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20         sz = 4 + 
307e0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
307f0 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b  [4], info.nKey);
30800 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
30810 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
30820 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d  .        pCell -
30830 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 4;.        /* 
30840 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72  Obscure case for
30850 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74   non-leaf-data t
30860 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c  rees: If the cel
30870 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20  l at pCell was. 
30880 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
30890 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61  usly stored on a
308a0 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20   leaf node, and 
308b0 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a  its reported siz
308c0 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20  e was 4.        
308d0 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69  ** bytes, then i
308e0 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  t may actually b
308f0 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
30900 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
30910 28 73 65 65 20 73 71 6c 69 74 65 33 42 74 72 65  (see sqlite3Btre
30920 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
30930 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20   4 bytes is the 
30940 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a  minimum size of.
30950 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63          ** any c
30960 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20  ell). But it is 
30970 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73  important to pas
30980 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69  s the correct si
30990 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a  ze to .        *
309a0 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20  * insertCell(), 
309b0 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63  so reparse the c
309c0 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20  ell now..       
309d0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
309e0 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
309f0 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69  n never happen i
30a00 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
30a10 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20   file, as all.  
30a20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61        ** cells a
30a30 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  re at least 4 by
30a40 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70  tes. It only hap
30a50 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20  pens in b-trees 
30a60 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  used.        ** 
30a70 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20  to evaluate "IN 
30a80 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e  (SELECT ...)" an
30a90 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65  d similar clause
30aa0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
30ab0 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
30ac0 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  [j]==4 ){.      
30ad0 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43      assert(leafC
30ae0 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20  orrection==4);. 
30af0 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65           sz = ce
30b00 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
30b10 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  t, pCell);.     
30b20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
30b30 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d     iOvflSpace +=
30b40 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72   sz;.      asser
30b50 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65  t( sz<=pBt->page
30b60 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20  Size/4 );.      
30b70 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61  assert( iOvflSpa
30b80 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce<=pBt->pageSiz
30b90 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  e );.      rc = 
30ba0 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
30bb0 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c  nt, nxDiv, pCell
30bc0 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65  , sz, pTemp, pNe
30bd0 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  w->pgno);.      
30be0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30bf0 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  K ) goto balance
30c00 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
30c10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
30c20 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
30c30 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
30c40 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b  ) );..      j++;
30c50 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a  .      nxDiv++;.
30c60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
30c70 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
30c80 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
30c90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
30ca0 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
30cb0 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
30cc0 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  EAF)==0 ){.    u
30cd0 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43  8 *zChild = &apC
30ce0 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
30cf0 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  ta[8];.    memcp
30d00 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
30d10 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69  ->aData[8], zChi
30d20 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69  ld, 4);.  }..  i
30d30 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61  f( isRoot && pPa
30d40 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  rent->nCell==0 &
30d50 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  & pParent->hdrOf
30d60 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e  fset<=apNew[0]->
30d70 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20  nFree ){.    /* 
30d80 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
30d90 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20   the b-tree now 
30da0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
30db0 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c  s. The only sibl
30dc0 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  ing.    ** page 
30dd0 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
30de0 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ld of the parent
30df0 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  . Copy the conte
30e00 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  nts of the.    *
30e10 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74  * child page int
30e20 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65  o the parent, de
30e30 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65  creasing the ove
30e40 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74  rall height of t
30e50 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65  he.    ** b-tree
30e60 20 73 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e   structure by on
30e70 65 2e 20 54 68 69 73 20 69 73 20 64 65 73 63 72  e. This is descr
30e80 69 62 65 64 20 61 73 20 74 68 65 20 22 62 61 6c  ibed as the "bal
30e90 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a  ance-shallower".
30ea0 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72      ** sub-algor
30eb0 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63  ithm in some doc
30ec0 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20  umentation..    
30ed0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  **.    ** If thi
30ee0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
30ef0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68  uum database, th
30f00 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f  e call to copyNo
30f10 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20  deContent() .   
30f20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69   ** sets all poi
30f30 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
30f40 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
30f50 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  o database image
30f60 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66   pages .    ** f
30f70 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f 69  or which the poi
30f80 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 77  nter is stored w
30f90 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ithin the conten
30fa0 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a  t being copied..
30fb0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
30fc0 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20  e second assert 
30fd0 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
30fe0 68 61 74 20 74 68 65 20 63 68 69 6c 64 20 70 61  hat the child pa
30ff0 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74  ge is defragment
31000 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75  ed.    ** (it mu
31010 73 74 20 62 65 2c 20 61 73 20 69 74 20 77 61 73  st be, as it was
31020 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63   just reconstruc
31030 74 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62  ted using assemb
31040 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a  lePage()). This.
31050 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74      ** is import
31060 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65 6e  ant if the paren
31070 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  t page happens t
31080 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20 74  o be page 1 of t
31090 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
310a0 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20  ** image.  */.  
310b0 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d    assert( nNew==
310c0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
310d0 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65   apNew[0]->nFree
310e0 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65   == .        (ge
310f0 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d  t2byte(&apNew[0]
31100 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65  ->aData[5])-apNe
31110 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  w[0]->cellOffset
31120 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c  -apNew[0]->nCell
31130 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  *2) .    );.    
31140 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
31150 72 63 20 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e  rc = copyNodeCon
31160 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70  tent(apNew[0], p
31170 50 61 72 65 6e 74 29 29 20 29 7b 0a 20 20 20 20  Parent)) ){.    
31180 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
31190 61 70 4e 65 77 5b 30 5d 29 3b 0a 20 20 20 20 7d  apNew[0]);.    }
311a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41  .  }else if( ISA
311b0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
311c0 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e   /* Fix the poin
311d0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
311e0 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c  for all the cell
311f0 73 20 74 68 61 74 20 77 65 72 65 20 73 68 69 66  s that were shif
31200 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20  ted around. .   
31210 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65   ** There are se
31220 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20  veral different 
31230 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72  types of pointer
31240 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68 61  -map entries tha
31250 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a  t need to.    **
31260 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
31270 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
31280 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61  Some of these ha
31290 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65  ve been set alre
312a0 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20  ady, but.    ** 
312b0 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54  many have not. T
312c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
312d0 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a  a summary:.    *
312e0 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68  *.    **   1) Th
312f0 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  e entries associ
31300 61 74 65 64 20 77 69 74 68 20 6e 65 77 20 73 69  ated with new si
31310 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61 74  bling pages that
31320 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a   were not.    **
31330 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77        siblings w
31340 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
31350 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68  n was called. Th
31360 65 73 65 20 68 61 76 65 20 61 6c 72 65 61 64 79  ese have already
31370 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65  .    **      bee
31380 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20  n set. We don't 
31390 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62  need to worry ab
313a0 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73  out old siblings
313b0 20 74 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a   that were.    *
313c0 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20  *      moved to 
313d0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20  the free-list - 
313e0 74 68 65 20 66 72 65 65 50 61 67 65 28 29 20 63  the freePage() c
313f0 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61  ode has taken ca
31400 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f  re.    **      o
31410 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a  f those..    **.
31420 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20      **   2) The 
31430 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
31440 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
31450 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6f 76  ith the first ov
31460 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20  erflow.    **   
31470 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f     page in any o
31480 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75  verflow chains u
31490 73 65 64 20 62 79 20 6e 65 77 20 64 69 76 69 64  sed by new divid
314a0 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20  er cells. These 
314b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76  .    **      hav
314c0 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62  e also already b
314d0 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f  een taken care o
314e0 66 20 62 79 20 74 68 65 20 69 6e 73 65 72 74 43  f by the insertC
314f0 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20  ell() code..    
31500 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49  **.    **   3) I
31510 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
31520 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ges are not leav
31530 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69  es, then the chi
31540 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20  ld pages of.    
31550 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74  **      cells st
31560 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c  ored on the sibl
31570 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65  ing pages may ne
31580 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
31590 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
315a0 20 20 34 29 20 49 66 20 74 68 65 20 73 69 62 6c    4) If the sibl
315b0 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f  ing pages are no
315c0 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65  t internal intke
315d0 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e  y nodes, then an
315e0 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76  y.    **      ov
315f0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65  erflow pages use
31600 64 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73  d by these cells
31610 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
31620 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20  updated.    **  
31630 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e      (internal in
31640 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72  tkey nodes never
31650 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72   contain pointer
31660 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  s to overflow pa
31670 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ges)..    **.   
31680 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65 20   **   5) If the 
31690 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72  sibling pages ar
316a0 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
316b0 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  en the pointer-m
316c0 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65  ap.    **      e
316d0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 72  ntries for the r
316e0 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73  ight-child pages
316f0 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67   of each sibling
31700 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a   may need.    **
31710 20 20 20 20 20 20 74 6f 20 62 65 20 75 70 64 61        to be upda
31720 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ted..    **.    
31730 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20 32  ** Cases 1 and 2
31740 20 61 72 65 20 64 65 61 6c 74 20 77 69 74 68 20   are dealt with 
31750 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63  above by other c
31760 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20  ode. The next.  
31770 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73    ** block deals
31780 20 77 69 74 68 20 63 61 73 65 73 20 33 20 61 6e   with cases 3 an
31790 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20  d 4 and the one 
317a0 61 66 74 65 72 20 74 68 61 74 2c 20 63 61 73 65  after that, case
317b0 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a   5. Since.    **
317c0 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74   setting a point
317d0 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20  er map entry is 
317e0 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70  a relatively exp
317f0 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
31800 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f  , this.    ** co
31810 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69  de only sets poi
31820 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
31830 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76   for child or ov
31840 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
31850 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63  t have.    ** ac
31860 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74  tually moved bet
31870 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a  ween pages.  */.
31880 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
31890 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20  w = apNew[0];.  
318a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20    MemPage *pOld 
318b0 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20  = apCopy[0];.   
318c0 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d   int nOverflow =
318d0 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
318e0 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f  ;.    int iNextO
318f0 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  ld = pOld->nCell
31900 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20   + nOverflow;.  
31910 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20    int iOverflow 
31920 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70  = (nOverflow ? p
31930 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  Old->aOvfl[0].id
31940 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d  x : -1);.    j =
31950 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
31960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31970 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27  /* Current 'old'
31980 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f   sibling page */
31990 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20  .    k = 0;     
319a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319b0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
319c0 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67  nt 'new' sibling
319d0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72   page */.    for
319e0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 20 26 26  (i=0; i<nCell &&
319f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
31a00 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
31a10 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20  isDivider = 0;. 
31a20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69       while( i==i
31a30 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20  NextOld ){.     
31a40 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20     /* Cell i is 
31a50 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61  the cell immedia
31a60 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
31a70 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20  he last cell on 
31a80 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  old.        ** s
31a90 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49  ibling page j. I
31aa0 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
31ab0 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65  re not leaf page
31ac0 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20  s of an.        
31ad0 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65  ** intkey b-tree
31ae0 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61  , then cell i wa
31af0 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  s a divider cell
31b00 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c  . */.        pOl
31b10 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b  d = apCopy[++j];
31b20 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f 6c  .        iNextOl
31b30 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74  d = i + !leafDat
31b40 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20  a + pOld->nCell 
31b50 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  + pOld->nOverflo
31b60 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  w;.        if( p
31b70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  Old->nOverflow )
31b80 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76 65  {.          nOve
31b90 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f  rflow = pOld->nO
31ba0 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20  verflow;.       
31bb0 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69     iOverflow = i
31bc0 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70   + !leafData + p
31bd0 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  Old->aOvfl[0].id
31be0 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  x;.        }.   
31bf0 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d       isDivider =
31c00 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20   !leafData;  .  
31c10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
31c20 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ert(nOverflow>0 
31c30 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29  || iOverflow<i )
31c40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  ;.      assert(n
31c50 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f  Overflow<2 || pO
31c60 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ld->aOvfl[0].idx
31c70 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d  ==pOld->aOvfl[1]
31c80 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 61  .idx-1);.      a
31c90 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c  ssert(nOverflow<
31ca0 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c  3 || pOld->aOvfl
31cb0 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61  [1].idx==pOld->a
31cc0 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a  Ovfl[2].idx-1);.
31cd0 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76        if( i==iOv
31ce0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
31cf0 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b    isDivider = 1;
31d00 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d  .        if( (--
31d10 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a  nOverflow)>0 ){.
31d20 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66            iOverf
31d30 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  low++;.        }
31d40 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
31d50 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d  if( i==cntNew[k]
31d60 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
31d70 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c  ell i is the cel
31d80 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  l immediately fo
31d90 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
31da0 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20   cell on new.   
31db0 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20       ** sibling 
31dc0 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73  page k. If the s
31dd0 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
31de0 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e  leaf pages of an
31df0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b  .        ** intk
31e00 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20  ey b-tree, then 
31e10 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69  cell i is a divi
31e20 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20  der cell.  */.  
31e30 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
31e40 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20  ew[++k];.       
31e50 20 69 66 28 20 21 6c 65 61 66 44 61 74 61 20 29   if( !leafData )
31e60 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
31e70 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
31e80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31e90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
31ea0 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20  j<nOld );.      
31eb0 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29  assert( k<nNew )
31ec0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
31ed0 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69 67  he cell was orig
31ee0 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20 63  inally divider c
31ef0 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74 20  ell (and is not 
31f00 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a  now) or.      **
31f10 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   an overflow cel
31f20 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65 6c  l, or if the cel
31f30 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e  l was located on
31f40 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 69 62   a different sib
31f50 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 61  ling.      ** pa
31f60 67 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  ge before the ba
31f70 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74 68  lancing, then th
31f80 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
31f90 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
31fa0 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 61  .      ** with a
31fb0 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72  ny child or over
31fc0 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64 20  flow pages need 
31fd0 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20 20  to be updated.  
31fe0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 44  */.      if( isD
31ff0 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e  ivider || pOld->
32000 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f  pgno!=pNew->pgno
32010 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
32020 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20  !leafCorrection 
32030 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
32040 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
32050 20 67 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c   get4byte(apCell
32060 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52  [i]), PTRMAP_BTR
32070 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b  EE, pNew->pgno);
32080 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32090 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d     if( szCell[i]
320a0 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  >pNew->minLocal 
320b0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
320c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
320d0 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
320e0 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
320f0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
32100 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
32110 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72     if( !leafCorr
32120 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ection ){.      
32130 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
32140 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 4e 65 77  ITE_OK && i<nNew
32150 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
32160 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 0a  rc = ptrmapPut(.
32170 09 20 20 20 20 70 42 74 2c 20 67 65 74 34 62 79  .    pBt, get4by
32180 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44  te(&apNew[i]->aD
32190 61 74 61 5b 38 5d 29 2c 20 50 54 52 4d 41 50 5f  ata[8]), PTRMAP_
321a0 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d  BTREE, apNew[i]-
321b0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  >pgno);.      }.
321c0 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20      }..#if 0.   
321d0 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70 43 68   /* The ptrmapCh
321e0 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e 74 61  eckPages() conta
321f0 69 6e 73 20 61 73 73 65 72 74 28 29 20 73 74 61  ins assert() sta
32200 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76 65 72  tements that ver
32210 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ify that.    ** 
32220 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  all pointer map 
32230 70 61 67 65 73 20 61 72 65 20 73 65 74 20 63 6f  pages are set co
32240 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20 69 73  rrectly. This is
32250 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a   helpful while .
32260 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67      ** debugging
32270 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  . This is usuall
32280 79 20 64 69 73 61 62 6c 65 64 20 62 65 63 61 75  y disabled becau
32290 73 65 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  se a corrupt dat
322a0 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a  abase may.    **
322b0 20 63 61 75 73 65 20 61 6e 20 61 73 73 65 72 74   cause an assert
322c0 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  () statement to 
322d0 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74  fail.  */.    pt
322e0 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 61  rmapCheckPages(a
322f0 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  pNew, nNew);.   
32300 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
32310 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a  s(&pParent, 1);.
32320 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73  #endif.  }..  as
32330 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
32340 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41 43 45  sInit );.  TRACE
32350 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69  (("BALANCE: fini
32360 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77  shed: old=%d new
32370 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c  =%d cells=%d\n",
32380 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c  .          nOld,
32390 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a   nNew, nCell));.
323a0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e  .  /*.  ** Clean
323b0 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  up before return
323c0 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63  ing..  */.balanc
323d0 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  e_cleanup:.  sql
323e0 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28  ite3ScratchFree(
323f0 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69  apCell);.  for(i
32400 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
32410 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
32420 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d  e(apOld[i]);.  }
32430 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
32440 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ew; i++){.    re
32450 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b  leasePage(apNew[
32460 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  i]);.  }..  retu
32470 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
32480 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
32490 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
324a0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  e root page of a
324b0 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
324c0 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c  e is.** overfull
324d0 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   (has one or mor
324e0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
324f0 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63  )..**.** A new c
32500 68 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c 6c  hild page is all
32510 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 63  ocated and the c
32520 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
32530 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70  urrent root.** p
32540 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  age, including o
32550 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61  verflow cells, a
32560 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  re copied into t
32570 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72 6f  he child. The ro
32580 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74 68  ot.** page is th
32590 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20 74  en overwritten t
325a0 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d 70  o make it an emp
325b0 74 79 20 70 61 67 65 20 77 69 74 68 20 74 68 65  ty page with the
325c0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a   right-child .**
325d0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e   pointer pointin
325e0 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  g to the new pag
325f0 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  e..**.** Before 
32600 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70  returning, all p
32610 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
32620 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  es corresponding
32630 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74 68   to pages .** th
32640 61 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  at the new child
32650 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69  -page now contai
32660 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ns pointers to a
32670 72 65 20 75 70 64 61 74 65 64 2e 20 54 68 65 0a  re updated. The.
32680 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73 70  ** entry corresp
32690 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  onding to the ne
326a0 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f  w right-child po
326b0 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f 6f  inter of the roo
326c0 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c 73  t.** page is als
326d0 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  o updated..**.**
326e0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
326f0 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20  *ppChild is set 
32700 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 66  to contain a ref
32710 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 68  erence to the ch
32720 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64  ild .** page and
32730 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
32740 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  turned. In this 
32750 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  case the caller 
32760 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74  is required.** t
32770 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
32780 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64  ge() on *ppChild
32790 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49   exactly once. I
327a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
327b0 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  s,.** an error c
327c0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
327d0 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73 20  and *ppChild is 
327e0 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61  set to 0..*/.sta
327f0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
32800 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a  deeper(MemPage *
32810 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a  pRoot, MemPage *
32820 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74  *ppChild){.  int
32830 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
32840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
32850 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
32860 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a   subprocedures *
32870 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  /.  MemPage *pCh
32880 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ild = 0;        
32890 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
328a0 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
328b0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
328c0 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
328d0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
328e0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
328f0 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
32900 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
32910 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f  pRoot->pBt;    /
32920 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a  * The BTree */..
32930 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
32940 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a  >nOverflow>0 );.
32950 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
32960 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
32970 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
32980 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68  * Make pRoot, th
32990 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
329a0 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74 61  he b-tree, writa
329b0 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20  ble. Allocate a 
329c0 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20 74  new .  ** page t
329d0 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
329e0 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68  the new right-ch
329f0 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43 6f  ild of pPage. Co
32a00 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  py the contents.
32a10 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65    ** of the node
32a20 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74   stored on pRoot
32a30 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63 68   into the new ch
32a40 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ild page..  */. 
32a50 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
32a60 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
32a70 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70  erWrite(pRoot->p
32a80 44 62 50 61 67 65 29 29 0a 20 20 20 7c 7c 20 53  DbPage)).   || S
32a90 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
32aa0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
32ab0 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c 26 70  e(pBt,&pChild,&p
32ac0 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e  gnoChild,pRoot->
32ad0 70 67 6e 6f 2c 30 29 29 0a 20 20 20 7c 7c 20 53  pgno,0)).   || S
32ae0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
32af0 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
32b00 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 29 29 0a  pRoot, pChild)).
32b10 20 20 20 7c 7c 20 28 49 53 41 55 54 4f 56 41 43     || (ISAUTOVAC
32b20 55 55 4d 20 26 26 20 0a 20 20 20 20 20 20 20 53  UUM && .       S
32b30 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
32b40 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
32b50 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41 50  gnoChild, PTRMAP
32b60 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70  _BTREE, pRoot->p
32b70 67 6e 6f 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  gno))).  ){.    
32b80 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20  *ppChild = 0;.  
32b90 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
32ba0 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72  hild);.    retur
32bb0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
32bc0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
32bd0 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69  Iswriteable(pChi
32be0 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ld->pDbPage) );.
32bf0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
32c00 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
32c10 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
32c20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
32c30 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52  Child->nCell==pR
32c40 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  oot->nCell );.. 
32c50 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
32c60 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69  : copy root %d i
32c70 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74  nto %d\n", pRoot
32c80 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e  ->pgno, pChild->
32c90 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f  pgno));..  /* Co
32ca0 70 79 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  py the overflow 
32cb0 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74  cells from pRoot
32cc0 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20   to pChild */.  
32cd0 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61  memcpy(pChild->a
32ce0 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76  Ovfl, pRoot->aOv
32cf0 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72  fl, pRoot->nOver
32d00 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f  flow*sizeof(pRoo
32d10 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20  t->aOvfl[0]));. 
32d20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
32d30 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65  ow = pRoot->nOve
32d40 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72  rflow;..  /* Zer
32d50 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  o the contents o
32d60 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e  f pRoot. Then in
32d70 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73 20  stall pChild as 
32d80 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 2e  the right-child.
32d90 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28 70   */.  zeroPage(p
32da0 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44  Root, pChild->aD
32db0 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45  ata[0] & ~PTF_LE
32dc0 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  AF);.  put4byte(
32dd0 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
32de0 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
32df0 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a  ], pgnoChild);..
32e00 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68    *ppChild = pCh
32e10 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ild;.  return SQ
32e20 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
32e30 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
32e40 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70  pCur currently p
32e50 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73  oints to has jus
32e60 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
32e70 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20  in.** some way. 
32e80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  This function fi
32e90 67 75 72 65 73 20 6f 75 74 20 69 66 20 74 68 69  gures out if thi
32ea0 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  s modification m
32eb0 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65  eans the.** tree
32ec0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c   needs to be bal
32ed0 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f  anced, and if so
32ee0 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f   calls the appro
32ef0 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67  priate balancing
32f00 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61   .** routine. Ba
32f10 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 73  lancing routines
32f20 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61   are:.**.**   ba
32f30 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a  lance_quick().**
32f40 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65     balance_deepe
32f50 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65  r().**   balance
32f60 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74  _nonroot().*/.st
32f70 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
32f80 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
32f90 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
32fa0 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20  ITE_OK;.  const 
32fb0 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d  int nMin = pCur-
32fc0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
32fd0 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20 61   * 2 / 3;.  u8 a
32fe0 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
32ff0 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72  e[13];.  u8 *pFr
33000 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f  ee = 0;..  TESTO
33010 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65  NLY( int balance
33020 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20  _quick_called = 
33030 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  0 );.  TESTONLY(
33040 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65   int balance_dee
33050 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29  per_called = 0 )
33060 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e  ;..  do {.    in
33070 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
33080 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61  iPage;.    MemPa
33090 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
330a0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 3b  ->apPage[iPage];
330b0 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3d  ..    if( iPage=
330c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
330d0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
330e0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
330f0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
33100 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f 76  the b-tree is ov
33110 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20  erfull. In this 
33120 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20 20  case call the.  
33130 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65        ** balance
33140 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63 74 69  _deeper() functi
33150 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  on to create a n
33160 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68 65  ew child for the
33170 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
33180 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74     ** and copy t
33190 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
331a0 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  nts of the root-
331b0 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 0a  page to it. The.
331c0 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20          ** next 
331d0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
331e0 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61   do-loop will ba
331f0 6c 61 6e 63 65 20 74 68 65 20 63 68 69 6c 64 20  lance the child 
33200 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  page..        */
33210 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
33220 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ( (balance_deepe
33230 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29  r_called++)==0 )
33240 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  ;.        rc = b
33250 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50  alance_deeper(pP
33260 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  age, &pCur->apPa
33270 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  ge[1]);.        
33280 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33290 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
332a0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a  Cur->iPage = 1;.
332b0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
332c0 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
332d0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
332e0 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  Idx[1] = 0;.    
332f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
33300 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e  ur->apPage[1]->n
33310 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20  Overflow );.    
33320 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
33330 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e{.        break
33340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
33350 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  lse if( pPage->n
33360 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70  Overflow==0 && p
33370 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69  Page->nFree<=nMi
33380 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  n ){.      break
33390 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
333a0 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e     MemPage * con
333b0 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75  st pParent = pCu
333c0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d  r->apPage[iPage-
333d0 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f  1];.      int co
333e0 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d  nst iIdx = pCur-
333f0 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b  >aiIdx[iPage-1];
33400 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
33410 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
33420 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
33430 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
33440 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
33450 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33460 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20  _QUICKBALANCE.  
33470 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
33480 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20 20 20  >hasData.       
33490 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65    && pPage->nOve
334a0 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20  rflow==1.       
334b0 20 20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76 66    && pPage->aOvf
334c0 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d  l[0].idx==pPage-
334d0 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20  >nCell.         
334e0 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  && pParent->pgno
334f0 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20  !=1.         && 
33500 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
33510 69 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a  iIdx.        ){.
33520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c            /* Cal
33530 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  l balance_quick(
33540 29 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  ) to create a ne
33550 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50 61  w sibling of pPa
33560 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20  ge on which.    
33570 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72        ** to stor
33580 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
33590 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69  ell. balance_qui
335a0 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20 6e  ck() inserts a n
335b0 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20  ew cell.        
335c0 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e    ** into pParen
335d0 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75  t, which may cau
335e0 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72 66  se pParent overf
335f0 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20 20  low. If this.   
33600 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e         ** happen
33610 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74 65  s, the next inte
33620 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
33630 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e  -loop will balan
33640 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20 20  ce pParent .    
33650 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74        ** use eit
33660 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  her balance_nonr
33670 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65  oot() or balance
33680 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c  _deeper(). Until
33690 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
336a0 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20  ** happens, the 
336b0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73  overflow cell is
336c0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
336d0 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
336e0 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e[].          **
336f0 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20 20   buffer. .      
33700 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
33710 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20   ** The purpose 
33720 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
33730 20 61 73 73 65 72 74 28 29 20 69 73 20 74 6f 20   assert() is to 
33740 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20  check that only 
33750 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
33760 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61  ingle call to ba
33770 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73  lance_quick() is
33780 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20 63   made for each c
33790 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20  all to this.    
337a0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
337b0 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72 65 20  n. If this were 
337c0 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61 20  not verified, a 
337d0 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c  subtle bug invol
337e0 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20 20  ving reuse.     
337f0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 61       ** of the a
33800 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
33810 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b 20  e[] might sneak 
33820 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  in..          */
33830 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
33840 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69 63  t( (balance_quic
33850 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29  k_called++)==0 )
33860 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
33870 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70   balance_quick(p
33880 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20 61  Parent, pPage, a
33890 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
338a0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
338b0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
338c0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {.          /* 
338d0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63 61  In this case, ca
338e0 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  ll balance_nonro
338f0 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74 72 69  ot() to redistri
33900 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20 20  bute cells.     
33910 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20       ** between 
33920 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
33930 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e 67  2 of its sibling
33940 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e 76   pages. This inv
33950 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20 20  olves.          
33960 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  ** modifying the
33970 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 61   contents of pPa
33980 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20  rent, which may 
33990 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 74 6f  cause pParent to
339a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
339b0 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
339c0 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65 20   underfull. The 
339d0 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
339e0 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20  f the do-loop.  
339f0 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20          ** will 
33a00 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  balance the pare
33a10 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72 65  nt page to corre
33a20 63 74 20 74 68 69 73 2e 0a 20 20 20 20 20 20 20  ct this..       
33a30 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20     ** .         
33a40 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e   ** If the paren
33a50 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f  t page becomes o
33a60 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65  verfull, the ove
33a70 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65  rflow cell or ce
33a80 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  lls.          **
33a90 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74   are stored in t
33aa0 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
33ab0 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64   allocated immed
33ac0 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20  iately below. . 
33ad0 20 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 75           ** A su
33ae0 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
33af0 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f  on of the do-loo
33b00 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68  p will deal with
33b10 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20   this by.       
33b20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61     ** calling ba
33b30 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
33b40 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28  (balance_deeper(
33b50 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  ) may be called 
33b60 66 69 72 73 74 2c 0a 20 20 20 20 20 20 20 20 20  first,.         
33b70 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73 6e   ** but it doesn
33b80 27 74 20 64 65 61 6c 20 77 69 74 68 20 6f 76 65  't deal with ove
33b90 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75  rflow cells - ju
33ba0 73 74 20 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f  st moves them to
33bb0 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
33bc0 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 29 2e  different page).
33bd0 20 4f 6e 63 65 20 74 68 69 73 20 73 75 62 73 65   Once this subse
33be0 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61  quent call to ba
33bf0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
33c00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61  .          ** ha
33c10 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20  s completed, it 
33c20 69 73 20 73 61 66 65 20 74 6f 20 72 65 6c 65 61  is safe to relea
33c30 73 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75  se the pSpace bu
33c40 66 66 65 72 20 75 73 65 64 20 62 79 0a 20 20 20  ffer used by.   
33c50 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72         ** the pr
33c60 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20  evious call, as 
33c70 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
33c80 6c 20 64 61 74 61 20 77 69 6c 6c 20 68 61 76 65  l data will have
33c90 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 20   been .         
33ca0 20 2a 2a 20 63 6f 70 69 65 64 20 65 69 74 68 65   ** copied eithe
33cb0 72 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20  r into the body 
33cc0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
33cd0 67 65 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e  ge or into the n
33ce0 65 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ew.          ** 
33cf0 70 53 70 61 63 65 20 62 75 66 66 65 72 20 70 61  pSpace buffer pa
33d00 73 73 65 64 20 74 6f 20 74 68 65 20 6c 61 74 74  ssed to the latt
33d10 65 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  er call to balan
33d20 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20  ce_nonroot()..  
33d30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
33d40 20 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20       u8 *pSpace 
33d50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
33d60 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70  loc(pCur->pBt->p
33d70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
33d80 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
33d90 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74  _nonroot(pParent
33da0 2c 20 69 49 64 78 2c 20 70 53 70 61 63 65 2c 20  , iIdx, pSpace, 
33db0 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20  iPage==1);.     
33dc0 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29       if( pFree )
33dd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
33de0 20 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74   If pFree is not
33df0 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73   NULL, it points
33e00 20 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62   to the pSpace b
33e10 75 66 66 65 72 20 75 73 65 64 20 0a 20 20 20 20  uffer used .    
33e20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20          ** by a 
33e30 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f  previous call to
33e40 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
33e50 28 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73  (). Its contents
33e60 20 61 72 65 0a 20 20 20 20 20 20 20 20 20 20 20   are.           
33e70 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65   ** now stored e
33e80 69 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61  ither on real da
33e90 74 61 62 61 73 65 20 70 61 67 65 73 20 6f 72 20  tabase pages or 
33ea0 77 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20  within the .    
33eb0 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70          ** new p
33ec0 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f  Space buffer, so
33ed0 20 69 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c   it may be safel
33ee0 79 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f  y freed here. */
33ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
33f00 69 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72  ite3PageFree(pFr
33f10 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ee);.          }
33f20 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
33f30 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
33f40 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
33f50 66 74 65 72 20 74 68 65 20 6e 65 78 74 20 63 61  fter the next ca
33f60 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ll to.          
33f70 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  ** balance_nonro
33f80 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65  ot(), or just be
33f90 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
33fa0 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63  on returns, whic
33fb0 68 65 76 65 72 0a 20 20 20 20 20 20 20 20 20 20  hever.          
33fc0 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20  ** comes first. 
33fd0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  */.          pFr
33fe0 65 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20  ee = pSpace;.   
33ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
34000 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76        pPage->nOv
34010 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20  erflow = 0;..   
34020 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69     /* The next i
34030 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
34040 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73  do-loop balances
34050 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
34060 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61  . */.      relea
34070 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
34080 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65       pCur->iPage
34090 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  --;.    }.  }whi
340a0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
340b0 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72 65  K );..  if( pFre
340c0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
340d0 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29 3b  PageFree(pFree);
340e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
340f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  ;.}.../*.** Inse
34100 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
34110 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20  into the BTree. 
34120 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65   The key is give
34130 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29  n by (pKey,nKey)
34140 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
34150 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44   is given by (pD
34160 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65  ata,nData).  The
34170 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20   cursor is used 
34180 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e  only to.** defin
34190 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65  e what table the
341a0 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
341b0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e  e inserted into.
341c0 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
341d0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
341e0 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63   at a random loc
341f0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ation..**.** For
34200 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65   an INTKEY table
34210 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20  , only the nKey 
34220 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79  value of the key
34230 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
34240 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  is.** ignored.  
34250 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74  For a ZERODATA t
34260 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20  able, the pData 
34270 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f  and nData are bo
34280 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  th ignored..**.*
34290 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65 73  * If the seekRes
342a0 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ult parameter is
342b0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
342c0 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c  a successful cal
342d0 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42  l to.** sqlite3B
342e0 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 74 6f 20  treeMoveto() to 
342f0 73 65 65 6b 20 63 75 72 73 6f 72 20 70 43 75 72  seek cursor pCur
34300 20 74 6f 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29   to (pKey, nKey)
34310 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
34320 62 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 2e 20  been performed. 
34330 73 65 65 6b 52 65 73 75 6c 74 20 69 73 20 74 68  seekResult is th
34340 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 20  e search result 
34350 72 65 74 75 72 6e 65 64 20 28 61 20 6e 65 67 61  returned (a nega
34360 74 69 76 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 69  tive.** number i
34370 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74  f pCur points at
34380 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 69   an entry that i
34390 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28  s smaller than (
343a0 70 4b 65 79 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a  pKey, nKey), or.
343b0 2a 2a 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  ** a positive va
343c0 6c 75 65 20 69 66 20 70 43 75 72 20 70 6f 69 6e  lue if pCur poin
343d0 74 73 20 61 74 20 61 6e 20 65 74 72 79 20 74 68  ts at an etry th
343e0 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  at is larger tha
343f0 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b 65  n .** (pKey, nKe
34400 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  y)). .**.** If t
34410 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61  he seekResult pa
34420 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
34430 65 6e 20 63 75 72 73 6f 72 20 70 43 75 72 20 6d  en cursor pCur m
34440 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20  ay point to any 
34450 0a 2a 2a 20 65 6e 74 72 79 20 6f 72 20 74 6f 20  .** entry or to 
34460 6e 6f 20 65 6e 74 72 79 20 61 74 20 61 6c 6c 2e  no entry at all.
34470 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
34480 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
34490 74 6f 20 73 65 65 6b 0a 2a 2a 20 74 68 65 20 63  to seek.** the c
344a0 75 72 73 6f 72 20 62 65 66 6f 72 65 20 74 68 65  ursor before the
344b0 20 6e 65 77 20 6b 65 79 20 63 61 6e 20 62 65 20   new key can be 
344c0 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74  inserted..*/.int
344d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
344e0 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ert(.  BtCursor 
344f0 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
34500 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
34510 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61  data into the ta
34520 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72 73  ble of this curs
34530 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  or */.  const vo
34540 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
34550 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
34560 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  y of the new rec
34570 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
34580 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
34590 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64  nData,  /* The d
345a0 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72  ata of the new r
345b0 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
345c0 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
345d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
345e0 62 65 72 20 6f 66 20 65 78 74 72 61 20 30 20 62  ber of extra 0 b
345f0 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
34600 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  o data */.  int 
34610 61 70 70 65 6e 64 42 69 61 73 2c 20 20 20 20 20  appendBias,     
34620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
34630 75 65 20 69 66 20 74 68 69 73 20 69 73 20 6c 69  ue if this is li
34640 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a  kely an append *
34650 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52 65 73 75  /.  int seekResu
34660 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  lt              
34670 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
34680 70 72 69 6f 72 20 73 71 6c 69 74 65 33 42 74 72  prior sqlite3Btr
34690 65 65 4d 6f 76 65 74 6f 28 29 20 63 61 6c 6c 20  eeMoveto() call 
346a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
346b0 20 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65 65 6b    int loc = seek
346c0 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 73 7a  Result;.  int sz
346d0 4e 65 77 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  New;.  int idx;.
346e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
346f0 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
34700 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
34710 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
34720 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65  ->pBt;.  unsigne
34730 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b  d char *oldCell;
34740 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
34750 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a   *newCell = 0;..
34760 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
34770 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
34780 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
34790 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
347a0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
347b0 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
347c0 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61  >readOnly );.  a
347d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46  ssert( pCur->wrF
347e0 6c 61 67 20 29 3b 0a 20 20 61 73 73 65 72 74 28  lag );.  assert(
347f0 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
34800 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72  ableLock(p, pCur
34810 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
34820 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32  ->pKeyInfo!=0, 2
34830 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
34840 69 73 20 69 73 20 61 6e 20 69 6e 73 65 72 74 20  is is an insert 
34850 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 62 2d 74  into a table b-t
34860 72 65 65 2c 20 69 6e 76 61 6c 69 64 61 74 65 20  ree, invalidate 
34870 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 0a 20 20  any incrblob .  
34880 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
34890 6f 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67  on the row being
348a0 20 72 65 70 6c 61 63 65 64 20 28 61 73 73 75 6d   replaced (assum
348b0 69 6e 67 20 74 68 69 73 20 69 73 20 61 20 72 65  ing this is a re
348c0 70 6c 61 63 65 0a 20 20 2a 2a 20 6f 70 65 72 61  place.  ** opera
348d0 74 69 6f 6e 20 2d 20 69 66 20 69 74 20 69 73 20  tion - if it is 
348e0 6e 6f 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  not, the followi
348f0 6e 67 20 69 73 20 61 20 6e 6f 2d 6f 70 29 2e 20  ng is a no-op). 
34900 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
34910 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pKeyInfo==0 ){. 
34920 20 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63     invalidateInc
34930 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c 20  rblobCursors(p, 
34940 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
34950 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  nKey, 0);.  }.. 
34960 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
34970 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
34980 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
34990 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20  ur->skip;.  }.. 
349a0 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
349b0 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
349c0 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  her cursors open
349d0 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 0a   on this table..
349e0 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d    **.  ** In som
349f0 65 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  e cases, the cal
34a00 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
34a10 65 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20  eMoveto() below 
34a20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a  is a no-op. For.
34a30 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68    ** example, wh
34a40 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74  en inserting dat
34a50 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77  a into a table w
34a60 69 74 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74  ith auto-generat
34a70 65 64 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20  ed integer.  ** 
34a80 6b 65 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c  keys, the VDBE l
34a90 61 79 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c  ayer invokes sql
34aa0 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 29 20  ite3BtreeLast() 
34ab0 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  to figure out th
34ac0 65 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  e .  ** integer 
34ad0 6b 65 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74  key to use. It t
34ae0 68 65 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66  hen calls this f
34af0 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61  unction to actua
34b00 6c 6c 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a  lly insert the .
34b10 20 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74    ** data into t
34b20 68 65 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65  he intkey B-Tree
34b30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73  . In this case s
34b40 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
34b50 6f 28 29 20 72 65 63 6f 67 6e 69 7a 65 73 0a 20  o() recognizes. 
34b60 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72   ** that the cur
34b70 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 77  sor is already w
34b80 68 65 72 65 20 69 74 20 6e 65 65 64 73 20 74 6f  here it needs to
34b90 20 62 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20   be and returns 
34ba0 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 64 6f 69  without.  ** doi
34bb0 6e 67 20 61 6e 79 20 77 6f 72 6b 2e 20 54 6f 20  ng any work. To 
34bc0 61 76 6f 69 64 20 74 68 77 61 72 74 69 6e 67 20  avoid thwarting 
34bd0 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  these optimizati
34be0 6f 6e 73 2c 20 69 74 20 69 73 20 69 6d 70 6f 72  ons, it is impor
34bf0 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  tant.  ** not to
34c00 20 63 6c 65 61 72 20 74 68 65 20 63 75 72 73 6f   clear the curso
34c10 72 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 69  r here..  */.  i
34c20 66 28 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  f(.    SQLITE_OK
34c30 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  !=(rc = saveAllC
34c40 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
34c50 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
34c60 29 29 20 7c 7c 20 28 21 6c 6f 63 20 26 26 0a 20  )) || (!loc &&. 
34c70 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
34c80 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
34c90 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65  Moveto(pCur, pKe
34ca0 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42  y, nKey, appendB
34cb0 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 29  ias, &loc)).  ))
34cc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
34cd0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
34ce0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
34cf0 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 43  SOR_VALID || (pC
34d00 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
34d10 4f 52 5f 49 4e 56 41 4c 49 44 20 26 26 20 6c 6f  OR_INVALID && lo
34d20 63 29 20 29 3b 0a 0a 20 20 70 50 61 67 65 20 3d  c) );..  pPage =
34d30 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
34d40 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
34d50 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
34d60 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29  Key || nKey>=0 )
34d70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34d80 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67  e->leaf || !pPag
34d90 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 54  e->intKey );.  T
34da0 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74  RACE(("INSERT: t
34db0 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c  able=%d nkey=%ll
34dc0 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d  d ndata=%d page=
34dd0 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
34de0 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
34df0 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c  ot, nKey, nData,
34e00 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20   pPage->pgno,.  
34e10 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f          loc==0 ?
34e20 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22   "overwrite" : "
34e30 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20  new entry"));.  
34e40 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
34e50 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63  sInit );.  alloc
34e60 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
34e70 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70  );.  newCell = p
34e80 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  Bt->pTmpSpace;. 
34e90 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20   if( newCell==0 
34ea0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
34eb0 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69  NOMEM;.  rc = fi
34ec0 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20  llInCell(pPage, 
34ed0 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e  newCell, pKey, n
34ee0 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  Key, pData, nDat
34ef0 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77  a, nZero, &szNew
34f00 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
34f10 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
34f20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d   assert( szNew==
34f30 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
34f40 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20  e, newCell) );. 
34f50 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d   assert( szNew<=
34f60 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
34f70 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70 43 75  ) );.  idx = pCu
34f80 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
34f90 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f 63  Page];.  if( loc
34fa0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 31 36 20 73  ==0 ){.    u16 s
34fb0 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74  zOld;.    assert
34fc0 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ( idx<pPage->nCe
34fd0 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ll );.    rc = s
34fe0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34ff0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
35000 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
35010 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69        goto end_i
35020 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  nsert;.    }.   
35030 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43   oldCell = findC
35040 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b  ell(pPage, idx);
35050 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
35060 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d  >leaf ){.      m
35070 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f  emcpy(newCell, o
35080 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20  ldCell, 4);.    
35090 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65  }.    szOld = ce
350a0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
350b0 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72   oldCell);.    r
350c0 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
350d0 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
350e0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
350f0 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
35100 20 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70   rc = dropCell(p
35110 50 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64  Page, idx, szOld
35120 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
35130 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
35140 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65     goto end_inse
35150 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rt;.    }.  }els
35160 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70  e if( loc<0 && p
35170 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Page->nCell>0 ){
35180 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
35190 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  ge->leaf );.    
351a0 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
351b0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
351c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
351d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
351e0 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  af );.  }.  rc =
351f0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
35200 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c  e, idx, newCell,
35210 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20   szNew, 0, 0);. 
35220 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
35230 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 2d  ITE_OK || pPage-
35240 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50 61 67  >nCell>0 || pPag
35250 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
35260 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 72  ;..  /* If no er
35270 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
35280 61 6e 64 20 70 50 61 67 65 20 68 61 73 20 61 6e  and pPage has an
35290 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
352a0 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29 20 0a  call balance() .
352b0 20 20 2a 2a 20 74 6f 20 72 65 64 69 73 74 72 69    ** to redistri
352c0 62 75 74 65 20 74 68 65 20 63 65 6c 6c 73 20 77  bute the cells w
352d0 69 74 68 69 6e 20 74 68 65 20 74 72 65 65 2e 20  ithin the tree. 
352e0 53 69 6e 63 65 20 62 61 6c 61 6e 63 65 28 29 20  Since balance() 
352f0 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68  may move.  ** th
35300 65 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f 20 74  e cursor, zero t
35310 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  he BtCursor.info
35320 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74 43 75 72  .nSize and BtCur
35330 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a 20 20  sor.validNKey.  
35340 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20  ** variables..  
35350 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f 75 73  **.  ** Previous
35360 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
35370 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76 65 54  ite called moveT
35380 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76 65 20  oRoot() to move 
35390 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  the cursor.  ** 
353a0 62 61 63 6b 20 74 6f 20 74 68 65 20 72 6f 6f 74  back to the root
353b0 20 70 61 67 65 20 61 73 20 62 61 6c 61 6e 63 65   page as balance
353c0 28 29 20 75 73 65 64 20 74 6f 20 69 6e 76 61 6c  () used to inval
353d0 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  idate the conten
353e0 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43 75 72  ts.  ** of BtCur
353f0 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  sor.apPage[] and
35400 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 5b   BtCursor.aiIdx[
35410 5d 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 6f  ]. Instead of do
35420 69 6e 67 20 74 68 61 74 2c 0a 20 20 2a 2a 20 73  ing that,.  ** s
35430 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  et the cursor st
35440 61 74 65 20 74 6f 20 22 69 6e 76 61 6c 69 64 22  ate to "invalid"
35450 2e 20 54 68 69 73 20 6d 61 6b 65 73 20 63 6f 6d  . This makes com
35460 6d 6f 6e 20 69 6e 73 65 72 74 20 6f 70 65 72 61  mon insert opera
35470 74 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c 69 67 68  tions.  ** sligh
35480 74 6c 79 20 66 61 73 74 65 72 2e 0a 20 20 2a 2a  tly faster..  **
35490 0a 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61  .  ** There is a
354a0 20 73 75 62 74 6c 65 20 62 75 74 20 69 6d 70 6f   subtle but impo
354b0 72 74 61 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69  rtant optimizati
354c0 6f 6e 20 68 65 72 65 20 74 6f 6f 2e 20 57 68 65  on here too. Whe
354d0 6e 20 69 6e 73 65 72 74 69 6e 67 0a 20 20 2a 2a  n inserting.  **
354e0 20 6d 75 6c 74 69 70 6c 65 20 72 65 63 6f 72 64   multiple record
354f0 73 20 69 6e 74 6f 20 61 6e 20 69 6e 74 6b 65 79  s into an intkey
35500 20 62 2d 74 72 65 65 20 75 73 69 6e 67 20 61 20   b-tree using a 
35510 73 69 6e 67 6c 65 20 63 75 72 73 6f 72 20 28 61  single cursor (a
35520 73 20 63 61 6e 0a 20 20 2a 2a 20 68 61 70 70 65  s can.  ** happe
35530 6e 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  n while processi
35540 6e 67 20 61 6e 20 22 49 4e 53 45 52 54 20 49 4e  ng an "INSERT IN
35550 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 22 20 73  TO ... SELECT" s
35560 74 61 74 65 6d 65 6e 74 29 2c 20 69 74 0a 20 20  tatement), it.  
35570 2a 2a 20 69 73 20 61 64 76 61 6e 74 61 67 65 6f  ** is advantageo
35580 75 73 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20  us to leave the 
35590 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
355a0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
355b0 79 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 62 2d  y in.  ** the b-
355c0 74 72 65 65 20 69 66 20 70 6f 73 73 69 62 6c 65  tree if possible
355d0 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  . If the cursor 
355e0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
355f0 20 74 6f 20 74 68 65 20 6c 61 73 74 0a 20 20 2a   to the last.  *
35600 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
35610 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 6e 65  able, and the ne
35620 78 74 20 72 6f 77 20 69 6e 73 65 72 74 65 64 20  xt row inserted 
35630 68 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6b  has an integer k
35640 65 79 0a 20 20 2a 2a 20 6c 61 72 67 65 72 20 74  ey.  ** larger t
35650 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
35660 65 78 69 73 74 69 6e 67 20 6b 65 79 2c 20 69 74  existing key, it
35670 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
35680 69 6e 73 65 72 74 20 74 68 65 0a 20 20 2a 2a 20  insert the.  ** 
35690 72 6f 77 20 77 69 74 68 6f 75 74 20 73 65 65 6b  row without seek
356a0 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ing the cursor. 
356b0 54 68 69 73 20 63 61 6e 20 62 65 20 61 20 62 69  This can be a bi
356c0 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f  g performance bo
356d0 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72  ost..  */.  pCur
356e0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
356f0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
35700 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Key = 0;.  if( r
35710 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
35720 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
35730 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c   ){.    rc = bal
35740 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20 20 20  ance(pCur);..   
35750 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73 75   /* Must make su
35760 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  re nOverflow is 
35770 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65 76  reset to zero ev
35780 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e 63  en if the balanc
35790 65 28 29 0a 20 20 20 20 2a 2a 20 66 61 69 6c 73  e().    ** fails
357a0 2e 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  . Internal data 
357b0 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70  structure corrup
357c0 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
357d0 20 6f 74 68 65 72 77 69 73 65 2e 20 0a 20 20 20   otherwise. .   
357e0 20 2a 2a 20 41 6c 73 6f 2c 20 73 65 74 20 74 68   ** Also, set th
357f0 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 74  e cursor state t
35800 6f 20 69 6e 76 61 6c 69 64 2e 20 54 68 69 73 20  o invalid. This 
35810 73 74 6f 70 73 20 73 61 76 65 43 75 72 73 6f 72  stops saveCursor
35820 50 6f 73 69 74 69 6f 6e 28 29 0a 20 20 20 20 2a  Position().    *
35830 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  * from trying to
35840 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   save the curren
35850 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  t position of th
35860 65 20 63 75 72 73 6f 72 2e 20 20 2a 2f 0a 20 20  e cursor.  */.  
35870 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
35880 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76  Cur->iPage]->nOv
35890 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
358a0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
358b0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
358c0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
358d0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
358e0 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  iPage]->nOverflo
358f0 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69 6e 73  w==0 );..end_ins
35900 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ert:.  return rc
35910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
35920 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  e the entry that
35930 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
35940 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
35950 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
35960 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
35970 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61 74   arbitrary locat
35980 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
35990 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 42  te3BtreeDelete(B
359a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
359b0 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
359c0 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
359d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
359e0 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
359f0 20 20 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20    .  int rc;    
35a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
35a20 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
35a30 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
35a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a50 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 64 65     /* Page to de
35a60 6c 65 74 65 20 63 65 6c 6c 20 66 72 6f 6d 20 2a  lete cell from *
35a70 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
35a80 72 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  r *pCell;       
35a90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
35aa0 74 65 72 20 74 6f 20 63 65 6c 6c 20 74 6f 20 64  ter to cell to d
35ab0 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  elete */.  int i
35ac0 43 65 6c 6c 49 64 78 3b 20 20 20 20 20 20 20 20  CellIdx;        
35ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ae0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c  /* Index of cell
35af0 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
35b00 69 6e 74 20 69 43 65 6c 6c 44 65 70 74 68 3b 20  int iCellDepth; 
35b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b20 20 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f 66       /* Depth of
35b30 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e 67   node containing
35b40 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20 20 61 73   pCell */ ..  as
35b50 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
35b60 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
35b70 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
35b80 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
35b90 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
35ba0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
35bb0 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72  dOnly );.  asser
35bc0 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  t( pCur->wrFlag 
35bd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  );.  assert( has
35be0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
35bf0 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67  Lock(p, pCur->pg
35c00 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b  noRoot, pCur->pK
35c10 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b  eyInfo!=0, 2) );
35c20 0a 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52  .  assert( !hasR
35c30 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
35c40 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29 20  pCur->pgnoRoot) 
35c50 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
35c60 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
35c70 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d 3e  ->iPage]>=pCur->
35c80 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
35c90 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20 0a 20 20 20  ge]->nCell) .   
35ca0 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65  || NEVER(pCur->e
35cb0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
35cc0 4c 49 44 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  LID).  ){.    re
35cd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
35ce0 52 3b 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  R;  /* Something
35cf0 20 68 61 73 20 67 6f 6e 65 20 61 77 72 79 2e 20   has gone awry. 
35d00 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  */.  }..  /* If 
35d10 74 68 69 73 20 69 73 20 61 20 64 65 6c 65 74 65  this is a delete
35d20 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 72 65   operation to re
35d30 6d 6f 76 65 20 61 20 72 6f 77 20 66 72 6f 6d 20  move a row from 
35d40 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 0a  a table b-tree,.
35d50 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 20    ** invalidate 
35d60 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
35d70 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  sors open on the
35d80 20 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65 74   row being delet
35d90 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43  ed.  */.  if( pC
35da0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  ur->pKeyInfo==0 
35db0 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
35dc0 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
35dd0 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  (p, pCur->pgnoRo
35de0 6f 74 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ot, pCur->info.n
35df0 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  Key, 0);.  }..  
35e00 69 43 65 6c 6c 44 65 70 74 68 20 3d 20 70 43 75  iCellDepth = pCu
35e10 72 2d 3e 69 50 61 67 65 3b 0a 20 20 69 43 65 6c  r->iPage;.  iCel
35e20 6c 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49  lIdx = pCur->aiI
35e30 64 78 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a  dx[iCellDepth];.
35e40 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
35e50 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70 74  apPage[iCellDept
35e60 68 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69  h];.  pCell = fi
35e70 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
35e80 65 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f 2a 20 49  ellIdx);..  /* I
35e90 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61  f the page conta
35ea0 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20  ining the entry 
35eb0 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74  to delete is not
35ec0 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 6d 6f   a leaf page, mo
35ed0 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  ve.  ** the curs
35ee0 6f 72 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73  or to the larges
35ef0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
35f00 72 65 65 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ree that is smal
35f10 6c 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 74 68  ler than.  ** th
35f20 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 64 65  e entry being de
35f30 6c 65 74 65 64 2e 20 54 68 69 73 20 63 65 6c 6c  leted. This cell
35f40 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 20 74 68   will replace th
35f50 65 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  e cell being del
35f60 65 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74  eted.  ** from t
35f70 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
35f80 2e 20 54 68 65 20 27 70 72 65 76 69 6f 75 73 27  . The 'previous'
35f90 20 65 6e 74 72 79 20 69 73 20 75 73 65 64 20 66   entry is used f
35fa0 6f 72 20 74 68 69 73 20 69 6e 73 74 65 61 64 0a  or this instead.
35fb0 20 20 2a 2a 20 6f 66 20 74 68 65 20 27 6e 65 78    ** of the 'nex
35fc0 74 27 20 65 6e 74 72 79 2c 20 61 73 20 74 68 65  t' entry, as the
35fd0 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
35fe0 69 73 20 61 6c 77 61 79 73 20 61 20 70 61 72 74  is always a part
35ff0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62   of the.  ** sub
36000 2d 74 72 65 65 20 68 65 61 64 65 64 20 62 79 20  -tree headed by 
36010 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 6f  the child page o
36020 66 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67  f the cell being
36030 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20 6d   deleted. This m
36040 61 6b 65 73 0a 20 20 2a 2a 20 62 61 6c 61 6e 63  akes.  ** balanc
36050 69 6e 67 20 74 68 65 20 74 72 65 65 20 66 6f 6c  ing the tree fol
36060 6c 6f 77 69 6e 67 20 74 68 65 20 64 65 6c 65 74  lowing the delet
36070 65 20 6f 70 65 72 61 74 69 6f 6e 20 65 61 73 69  e operation easi
36080 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  er.  */.  if( !p
36090 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
360a0 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20    int notUsed;. 
360b0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
360c0 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  !=(rc = sqlite3B
360d0 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
360e0 72 2c 20 26 6e 6f 74 55 73 65 64 29 29 20 29 7b  r, &notUsed)) ){
360f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
36100 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
36110 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
36120 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65  ions of any othe
36130 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  r cursors open o
36140 6e 20 74 68 69 73 20 74 61 62 6c 65 20 62 65 66  n this table bef
36150 6f 72 65 0a 20 20 2a 2a 20 6d 61 6b 69 6e 67 20  ore.  ** making 
36160 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  any modification
36170 73 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 67 65  s. Make the page
36180 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
36190 65 6e 74 72 79 20 74 6f 20 62 65 20 0a 20 20 2a  entry to be .  *
361a0 2a 20 64 65 6c 65 74 65 64 20 77 72 69 74 61 62  * deleted writab
361b0 6c 65 2e 20 54 68 65 6e 20 66 72 65 65 20 61 6e  le. Then free an
361c0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
361d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
361e0 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 74 72 79   the .  ** entry
361f0 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 72 65 6d   and finally rem
36200 6f 76 65 20 74 68 65 20 63 65 6c 6c 20 69 74 73  ove the cell its
36210 65 6c 66 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  elf from within 
36220 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  the page.  */.  
36230 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
36240 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
36250 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
36260 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 0a  gnoRoot, pCur)).
36270 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
36280 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
36290 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
362a0 70 44 62 50 61 67 65 29 29 0a 20 20 20 7c 7c 20  pDbPage)).   || 
362b0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
362c0 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
362d0 2c 20 70 43 65 6c 6c 29 29 0a 20 20 20 7c 7c 20  , pCell)).   || 
362e0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
362f0 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
36300 20 69 43 65 6c 6c 49 64 78 2c 20 63 65 6c 6c 53   iCellIdx, cellS
36310 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
36320 65 6c 6c 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  ell))).  ){.    
36330 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
36340 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
36350 20 64 65 6c 65 74 65 64 20 77 61 73 20 6e 6f 74   deleted was not
36360 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 6c 65   located on a le
36370 61 66 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  af page, then th
36380 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 69 73  e cursor.  ** is
36390 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
363a0 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 72 67 65  ing to the large
363b0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
363c0 73 75 62 2d 74 72 65 65 20 68 65 61 64 65 64 0a  sub-tree headed.
363d0 20 20 2a 2a 20 62 79 20 74 68 65 20 63 68 69 6c    ** by the chil
363e0 64 2d 70 61 67 65 20 6f 66 20 74 68 65 20 63 65  d-page of the ce
363f0 6c 6c 20 74 68 61 74 20 77 61 73 20 6a 75 73 74  ll that was just
36400 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 6e   deleted from an
36410 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e   internal.  ** n
36420 6f 64 65 2e 20 54 68 65 20 63 65 6c 6c 20 66 72  ode. The cell fr
36430 6f 6d 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  om the leaf node
36440 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f 76   needs to be mov
36450 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
36460 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65 20 74 6f 20  al.  ** node to 
36470 72 65 70 6c 61 63 65 20 74 68 65 20 64 65 6c 65  replace the dele
36480 74 65 64 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20  ted cell.  */.  
36490 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
364a0 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
364b0 2a 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e 61  *pLeaf = pCur->a
364c0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
364d0 65 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c  e];.    int nCel
364e0 6c 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 20 3d 20  l;.    Pgno n = 
364f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 43 65  pCur->apPage[iCe
36500 6c 6c 44 65 70 74 68 2b 31 5d 2d 3e 70 67 6e 6f  llDepth+1]->pgno
36510 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
36520 68 61 72 20 2a 70 54 6d 70 3b 0a 0a 20 20 20 20  har *pTmp;..    
36530 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
36540 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e  (pLeaf, pLeaf->n
36550 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 6e 43 65  Cell-1);.    nCe
36560 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
36570 28 70 4c 65 61 66 2c 20 70 43 65 6c 6c 29 3b 0a  (pLeaf, pCell);.
36580 20 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43      assert( MX_C
36590 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 6e  ELL_SIZE(pBt)>=n
365a0 43 65 6c 6c 20 29 3b 0a 0a 20 20 20 20 61 6c 6c  Cell );..    all
365b0 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
365c0 42 74 29 3b 0a 20 20 20 20 70 54 6d 70 20 3d 20  Bt);.    pTmp = 
365d0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  pBt->pTmpSpace;.
365e0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
365f0 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
36600 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 65 61  3PagerWrite(pLea
36610 66 2d 3e 70 44 62 50 61 67 65 29 29 20 0a 20 20  f->pDbPage)) .  
36620 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
36630 3d 28 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c  =(rc = insertCel
36640 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64  l(pPage, iCellId
36650 78 2c 20 70 43 65 6c 6c 2d 34 2c 20 6e 43 65 6c  x, pCell-4, nCel
36660 6c 2b 34 2c 20 70 54 6d 70 2c 20 6e 29 29 0a 20  l+4, pTmp, n)). 
36670 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b      || SQLITE_OK
36680 21 3d 28 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c  !=(rc = dropCell
36690 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e  (pLeaf, pLeaf->n
366a0 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c 6c 29 29 0a  Cell-1, nCell)).
366b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
366c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
366d0 7d 0a 0a 20 20 2f 2a 20 42 61 6c 61 6e 63 65 20  }..  /* Balance 
366e0 74 68 65 20 74 72 65 65 2e 20 49 66 20 74 68 65  the tree. If the
366f0 20 65 6e 74 72 79 20 64 65 6c 65 74 65 64 20 77   entry deleted w
36700 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  as located on a 
36710 6c 65 61 66 20 70 61 67 65 2c 0a 20 20 2a 2a 20  leaf page,.  ** 
36720 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
36730 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  still points to 
36740 74 68 61 74 20 70 61 67 65 2e 20 49 6e 20 74 68  that page. In th
36750 69 73 20 63 61 73 65 20 74 68 65 20 66 69 72 73  is case the firs
36760 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  t.  ** call to b
36770 61 6c 61 6e 63 65 28 29 20 72 65 70 61 69 72 73  alance() repairs
36780 20 74 68 65 20 74 72 65 65 2c 20 61 6e 64 20 74   the tree, and t
36790 68 65 20 69 66 28 2e 2e 2e 29 20 63 6f 6e 64 69  he if(...) condi
367a0 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 6e 65 76  tion is.  ** nev
367b0 65 72 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20 20  er true..  **.  
367c0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
367d0 20 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74   the entry delet
367e0 65 64 20 77 61 73 20 6f 6e 20 61 6e 20 69 6e 74  ed was on an int
367f0 65 72 6e 61 6c 20 6e 6f 64 65 20 70 61 67 65 2c  ernal node page,
36800 20 74 68 65 6e 0a 20 20 2a 2a 20 70 43 75 72 20   then.  ** pCur 
36810 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  is pointing to t
36820 68 65 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  he leaf page fro
36830 6d 20 77 68 69 63 68 20 61 20 63 65 6c 6c 20 77  m which a cell w
36840 61 73 20 72 65 6d 6f 76 65 64 20 74 6f 0a 20 20  as removed to.  
36850 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 65 20 63  ** replace the c
36860 65 6c 6c 20 64 65 6c 65 74 65 64 20 66 72 6f 6d  ell deleted from
36870 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
36880 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67  de. This is slig
36890 68 74 6c 79 0a 20 20 2a 2a 20 74 72 69 63 6b 79  htly.  ** tricky
368a0 20 61 73 20 74 68 65 20 6c 65 61 66 20 6e 6f 64   as the leaf nod
368b0 65 20 6d 61 79 20 62 65 20 75 6e 64 65 72 66 75  e may be underfu
368c0 6c 6c 2c 20 61 6e 64 20 74 68 65 20 69 6e 74 65  ll, and the inte
368d0 72 6e 61 6c 20 6e 6f 64 65 20 6d 61 79 0a 20 20  rnal node may.  
368e0 2a 2a 20 62 65 20 65 69 74 68 65 72 20 75 6e 64  ** be either und
368f0 65 72 20 6f 72 20 6f 76 65 72 66 75 6c 6c 2e 20  er or overfull. 
36900 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 75 6e  In this case run
36910 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 61   the balancing a
36920 6c 67 6f 72 69 74 68 6d 0a 20 20 2a 2a 20 6f 6e  lgorithm.  ** on
36930 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 66   the leaf node f
36940 69 72 73 74 2e 20 49 66 20 74 68 65 20 62 61 6c  irst. If the bal
36950 61 6e 63 65 20 70 72 6f 63 65 65 64 73 20 66 61  ance proceeds fa
36960 72 20 65 6e 6f 75 67 68 20 75 70 20 74 68 65 0a  r enough up the.
36970 20 20 2a 2a 20 74 72 65 65 20 74 68 61 74 20 77    ** tree that w
36980 65 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68  e can be sure th
36990 61 74 20 61 6e 79 20 70 72 6f 62 6c 65 6d 20 69  at any problem i
369a0 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  n the internal n
369b0 6f 64 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65  ode has.  ** bee
369c0 6e 20 63 6f 72 72 65 63 74 65 64 2c 20 73 6f 20  n corrected, so 
369d0 62 65 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65  be it. Otherwise
369e0 2c 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  , after balancin
369f0 67 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 2c  g the leaf node,
36a00 0a 20 20 2a 2a 20 77 61 6c 6b 20 74 68 65 20 63  .  ** walk the c
36a10 75 72 73 6f 72 20 75 70 20 74 68 65 20 74 72 65  ursor up the tre
36a20 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  e to the interna
36a30 6c 20 6e 6f 64 65 20 61 6e 64 20 62 61 6c 61 6e  l node and balan
36a40 63 65 20 69 74 20 61 73 20 0a 20 20 2a 2a 20 77  ce it as .  ** w
36a50 65 6c 6c 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ell.  */.  rc = 
36a60 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 20  balance(pCur);. 
36a70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36a80 4f 4b 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  OK && pCur->iPag
36a90 65 3e 69 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a  e>iCellDepth ){.
36aa0 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
36ab0 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74  >iPage>iCellDept
36ac0 68 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  h ){.      relea
36ad0 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
36ae0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
36af0 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  -]);.    }.    r
36b00 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
36b10 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
36b20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36b30 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43     moveToRoot(pC
36b40 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ur);.  }.  retur
36b50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
36b60 72 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65  reate a new BTre
36b70 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20  e table.  Write 
36b80 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68  into *piTable th
36b90 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72  e page.** number
36ba0 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61   for the root pa
36bb0 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  ge of the new ta
36bc0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ble..**.** The t
36bd0 79 70 65 20 6f 66 20 74 79 70 65 20 69 73 20 64  ype of type is d
36be0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
36bf0 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
36c00 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  .  Only the.** f
36c10 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20  ollowing values 
36c20 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63 75 72  of flags are cur
36c30 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20  rently in use.  
36c40 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72  Other values for
36c50 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20  .** flags might 
36c60 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20  not work:.**.** 
36c70 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59      BTREE_INTKEY
36c80 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20  |BTREE_LEAFDATA 
36c90 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
36ca0 20 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77   tables with row
36cb0 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42  id keys.**     B
36cc0 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20  TREE_ZERODATA   
36cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55                 U
36ce0 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69  sed for SQL indi
36cf0 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ces.*/.static in
36d00 74 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62  t btreeCreateTab
36d10 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
36d20 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66   *piTable, int f
36d30 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65  lags){.  BtShare
36d40 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
36d50 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
36d60 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f  t;.  Pgno pgnoRo
36d70 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ot;.  int rc;.. 
36d80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36d90 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
36da0 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
36db0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
36dc0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
36dd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42  );.  assert( !pB
36de0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a  t->readOnly );..
36df0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
36e00 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
36e10 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
36e20 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
36e30 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
36e40 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
36e50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
36e60 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28  .  }.#else.  if(
36e70 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
36e80 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
36e90 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d  oMove;      /* M
36ea0 6f 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20  ove a page here 
36eb0 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72  to make room for
36ec0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a   the root-page *
36ed0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
36ee0 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65  PageMove; /* The
36ef0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
36f00 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65  . */..    /* Cre
36f10 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  ating a new tabl
36f20 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72  e may probably r
36f30 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
36f40 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
36f50 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b  se.    ** to mak
36f60 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e  e room for the n
36f70 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70  ew tables root p
36f80 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69  age. In case thi
36f90 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20  s page turns.   
36fa0 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e   ** out to be an
36fb0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
36fc0 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66  delete all overf
36fd0 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63  low page-map cac
36fe0 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20  hes.    ** held 
36ff0 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  by open cursors.
37000 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61  .    */.    inva
37010 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
37020 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20  wCache(pBt);..  
37030 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61    /* Read the va
37040 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66  lue of meta[3] f
37050 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
37060 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
37070 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  ere the.    ** r
37080 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
37090 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  new table should
370a0 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20   go. meta[3] is 
370b0 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
370c0 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65  -page.    ** cre
370d0 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20  ated so far, so 
370e0 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  the new root-pag
370f0 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29  e is (meta[3]+1)
37100 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
37110 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
37120 28 70 2c 20 42 54 52 45 45 5f 4c 41 52 47 45 53  (p, BTREE_LARGES
37130 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20 26 70 67  T_ROOT_PAGE, &pg
37140 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 70 67 6e  noRoot);.    pgn
37150 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  oRoot++;..    /*
37160 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   The new root-pa
37170 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c  ge may not be al
37180 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69  located on a poi
37190 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f  nter-map page, o
371a0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e  r the.    ** PEN
371b0 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a  DING_BYTE page..
371c0 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
371d0 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d  ( pgnoRoot==PTRM
371e0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70  AP_PAGENO(pBt, p
371f0 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20  gnoRoot) ||.    
37200 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45      pgnoRoot==PE
37210 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
37220 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67  pBt) ){.      pg
37230 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a  noRoot++;.    }.
37240 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
37250 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20  Root>=3 );..    
37260 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61  /* Allocate a pa
37270 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68 61  ge. The page tha
37280 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69  t currently resi
37290 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  des at pgnoRoot 
372a0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d  will.    ** be m
372b0 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f  oved to the allo
372c0 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65  cated page (unle
372d0 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  ss the allocated
372e0 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20   page happens.  
372f0 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61    ** to reside a
37300 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20  t pgnoRoot)..   
37310 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   */.    rc = all
37320 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
37330 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20  Bt, &pPageMove, 
37340 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52  &pgnoMove, pgnoR
37350 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  oot, 1);.    if(
37360 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37370 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
37380 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
37390 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f  ( pgnoMove!=pgno
373a0 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Root ){.      /*
373b0 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65   pgnoRoot is the
373c0 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20   page that will 
373d0 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
373e0 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20 20  root-page of.   
373f0 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 61     ** the new ta
37400 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61 6e  ble (assuming an
37410 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f   error did not o
37420 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77 65  ccur). But we we
37430 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  re.      ** allo
37440 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20  cated pgnoMove. 
37450 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e 65  If required (i.e
37460 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  . if it was not 
37470 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
37480 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67 20  ** by extending 
37490 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20 63  the file), the c
374a0 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20 70  urrent page at p
374b0 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65  osition pgnoMove
374c0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72  .      ** is alr
374d0 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a  eady journaled..
374e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75        */.      u
374f0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50  8 eType;.      P
37500 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
37510 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
37520 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20  (pPageMove);..  
37530 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20      /* Move the 
37540 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 61  page currently a
37550 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67  t pgnoRoot to pg
37560 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20  noMove. */.     
37570 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
37580 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
37590 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c  gnoRoot, &pRoot,
375a0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
375b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
375c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
375d0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
375e0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
375f0 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26  pBt, pgnoRoot, &
37600 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
37610 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
37620 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
37630 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  AGE || eType==PT
37640 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
37650 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
37660 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
37670 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
37680 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37690 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
376a0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
376b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
376c0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
376d0 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
376e0 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
376f0 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
37700 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  t( eType!=PTRMAP
37710 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20  _FREEPAGE );.   
37720 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
37730 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c  Page(pBt, pRoot,
37740 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
37750 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a  , pgnoMove, 0);.
37760 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
37770 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20  e(pRoot);..     
37780 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70   /* Obtain the p
37790 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  age at pgnoRoot 
377a0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  */.      if( rc!
377b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
377c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
377d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
377e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
377f0 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
37800 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
37810 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
37820 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37830 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37840 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
37850 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
37860 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
37870 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
37880 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37890 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
378a0 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
378b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
378c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
378d0 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  se{.      pRoot 
378e0 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20  = pPageMove;.   
378f0 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   } ..    /* Upda
37900 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
37910 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61  ap and meta-data
37920 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f   with the new ro
37930 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
37940 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  */.    rc = ptrm
37950 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52  apPut(pBt, pgnoR
37960 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  oot, PTRMAP_ROOT
37970 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
37980 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
37990 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
379a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
379b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
379c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
379d0 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70  dateMeta(p, 4, p
379e0 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  gnoRoot);.    if
379f0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
37a00 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
37a10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
37a20 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  c;.    }..  }els
37a30 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  e{.    rc = allo
37a40 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
37a50 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
37a60 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Root, 1, 0);.   
37a70 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
37a80 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
37a90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
37aa0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
37ab0 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
37ac0 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  ) );.  zeroPage(
37ad0 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50  pRoot, flags | P
37ae0 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69  TF_LEAF);.  sqli
37af0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 52  te3PagerUnref(pR
37b00 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
37b10 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74   *piTable = (int
37b20 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74  )pgnoRoot;.  ret
37b30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
37b40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
37b50 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72  eCreateTable(Btr
37b60 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61  ee *p, int *piTa
37b70 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ble, int flags){
37b80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
37b90 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
37ba0 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
37bb0 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69  reateTable(p, pi
37bc0 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Table, flags);. 
37bd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
37be0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
37bf0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  rc;.}../*.** Era
37c00 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  se the given dat
37c10 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20 61  abase page and a
37c20 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e  ll its children.
37c30 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
37c40 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
37c50 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
37c60 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61 73  int clearDatabas
37c70 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
37c80 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
37c90 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74    /* The BTree t
37ca0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
37cb0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f   table */.  Pgno
37cc0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
37cd0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
37ce0 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 69   to clear */.  i
37cf0 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61 67 2c  nt freePageFlag,
37d00 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61       /* Dealloca
37d10 74 65 20 70 61 67 65 20 69 66 20 74 72 75 65 20  te page if true 
37d20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61 6e  */.  int *pnChan
37d30 67 65 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ge.){.  MemPage 
37d40 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
37d50 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
37d60 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
37d70 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
37d80 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
37d90 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
37da0 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70   );.  if( pgno>p
37db0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
37dc0 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
37dd0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
37de0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  BKPT;.  }..  rc 
37df0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
37e00 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61  (pBt, pgno, &pPa
37e10 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
37e20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
37e30 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f  sepage_out;.  fo
37e40 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
37e50 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
37e60 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
37e70 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
37e80 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
37e90 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
37ea0 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
37eb0 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
37ec0 70 43 65 6c 6c 29 2c 20 31 2c 20 70 6e 43 68 61  pCell), 1, pnCha
37ed0 6e 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nge);.      if( 
37ee0 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
37ef0 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
37f00 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
37f10 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
37f20 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
37f30 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
37f40 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
37f50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
37f60 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
37f70 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
37f80 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  sePage(pBt, get4
37f90 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
37fa0 74 61 5b 38 5d 29 2c 20 31 2c 20 70 6e 43 68 61  ta[8]), 1, pnCha
37fb0 6e 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nge);.    if( rc
37fc0 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
37fd0 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
37fe0 20 7d 65 6c 73 65 20 69 66 28 20 70 6e 43 68 61   }else if( pnCha
37ff0 6e 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nge ){.    asser
38000 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
38010 20 29 3b 0a 20 20 20 20 2a 70 6e 43 68 61 6e 67   );.    *pnChang
38020 65 20 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e += pPage->nCel
38030 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65  l;.  }.  if( fre
38040 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20  ePageFlag ){.   
38050 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
38060 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Page);.  }else i
38070 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
38080 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
38090 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29  ->pDbPage))==0 )
380a0 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  {.    zeroPage(p
380b0 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61  Page, pPage->aDa
380c0 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46  ta[0] | PTF_LEAF
380d0 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74  );.  }..cleardat
380e0 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20  abasepage_out:. 
380f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
38100 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
38110 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
38120 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  e all informatio
38130 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  n from a single 
38140 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
38150 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69  abase.  iTable i
38160 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  s.** the page nu
38170 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74  mber of the root
38180 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
38190 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
381a0 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74  ne returns,.** t
381b0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
381c0 65 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c  empty, but still
381d0 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54   exists..**.** T
381e0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
381f0 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54   fail with SQLIT
38200 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72  E_LOCKED if ther
38210 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a  e are any open.*
38220 2a 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f  * read cursors o
38230 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70  n the table.  Op
38240 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  en write cursors
38250 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
38260 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65  e.** root of the
38270 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
38280 20 70 6e 43 68 61 6e 67 65 20 69 73 20 6e 6f 74   pnChange is not
38290 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 61 62 6c   NULL, then tabl
382a0 65 20 69 54 61 62 6c 65 20 6d 75 73 74 20 62 65  e iTable must be
382b0 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65   an intkey table
382c0 2e 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72  . The.** integer
382d0 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 20 74   value pointed t
382e0 6f 20 62 79 20 70 6e 43 68 61 6e 67 65 20 69 73  o by pnChange is
382f0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20   incremented by 
38300 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
38310 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
38320 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
38330 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
38340 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
38350 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a  nt iTable, int *
38360 70 6e 43 68 61 6e 67 65 29 7b 0a 20 20 69 6e 74  pnChange){.  int
38370 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
38380 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
38390 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
383a0 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
383b0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
383c0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a 20 20 2f  NS_WRITE );..  /
383d0 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  * Invalidate all
383e0 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72   incrblob cursor
383f0 73 20 6f 70 65 6e 20 6f 6e 20 74 61 62 6c 65 20  s open on table 
38400 69 54 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67  iTable (assuming
38410 20 69 54 61 62 6c 65 0a 20 20 2a 2a 20 69 73 20   iTable.  ** is 
38420 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 20 74 61  the root of a ta
38430 62 6c 65 20 62 2d 74 72 65 65 20 2d 20 69 66 20  ble b-tree - if 
38440 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 66  it is not, the f
38450 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 69 73  ollowing call is
38460 0a 20 20 2a 2a 20 61 20 6e 6f 2d 6f 70 29 2e 20  .  ** a no-op). 
38470 20 2a 2f 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   */.  invalidate
38480 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
38490 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20 31 29  p, iTable, 0, 1)
384a0 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
384b0 4f 4b 3d 3d 28 72 63 20 3d 20 73 61 76 65 41 6c  OK==(rc = saveAl
384c0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 28 50  lCursors(pBt, (P
384d0 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 29 29 20  gno)iTable, 0)) 
384e