/ Hex Artifact Content
Login

Artifact 068c2d866c50c160935ff295e1e0352924d01c05:


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 36 39 20 32 30 30 39 2f 30  c,v 1.669 2009/0
0190: 37 2f 30 39 20 30 35 3a 30 37 3a 33 38 20 64 61  7/09 05:07:38 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 49 6e 20 74 68 69 73 20 76 65  /*.** In this ve
4eb0: 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f  rsion of BtreeMo
4ec0: 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20  veto, pKey is a 
4ed0: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63  packed index rec
4ee0: 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69  ord.** such as i
4ef0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
4f00: 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
4f10: 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b   opcode.  Unpack
4f20: 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61   the.** record a
4f30: 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72  nd then call Btr
4f40: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
4f50: 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  () to do the wor
4f60: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
4f70: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20   btreeMoveto(.  
4f80: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
4f90: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
4fa0: 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  en on the btree 
4fb0: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
4fc0: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
4fd0: 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65  pKey,   /* Packe
4fe0: 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72  d key if the btr
4ff0: 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a  ee is an index *
5000: 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
5010: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
5020: 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65  er key for table
5030: 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79  s.  Size of pKey
5040: 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a   for indices */.
5050: 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20    int bias,     
5060: 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65        /* Bias se
5070: 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
5080: 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
5090: 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Res           /*
50a0: 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
50b0: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
50c0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
50e0: 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   Status code */.
50f0: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
5100: 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20   *pIdxKey;   /* 
5110: 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
5120: 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70  ey */.  char aSp
5130: 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20 20  ace[150];       
5140: 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65     /* Temp space
5150: 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74   for pIdxKey - t
5160: 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63  o avoid a malloc
5170: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   */..  if( pKey 
5180: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
5190: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
51a0: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
51b0: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
51c0: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
51d0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
51e0: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20  t)nKey, pKey,.  
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65      aSpace, size
5220: 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20  of(aSpace));.   
5230: 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20   if( pIdxKey==0 
5240: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
5250: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
5260: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
5270: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
5280: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
5290: 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
52a0: 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
52b0: 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70  , pRes);.  if( p
52c0: 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
52d0: 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
52e0: 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78 4b  ckedRecord(pIdxK
52f0: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
5300: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
5310: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
5320: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
5330: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
5340: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
5350: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
5360: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
5370: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
5380: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
5390: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
53a0: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
53b0: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
53c0: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
53d0: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
53e0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
53f0: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
5400: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
5410: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
5420: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
5430: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
5440: 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n()..*/.static i
5450: 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43  nt btreeRestoreC
5460: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
5470: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
5480: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
5490: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
54a0: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
54b0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
54c0: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
54d0: 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
54e0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
54f0: 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
5500: 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
5510: 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 70 43 75 72  skip;.  }.  pCur
5520: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
5530: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
5540: 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
5550: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
5560: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
5570: 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20 69  pCur->skip);.  i
5580: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5590: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
55a0: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
55b0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
55c0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
55d0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
55e0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
55f0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
5600: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
5610: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5620: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
5630: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
5640: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
5650: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
5660: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
5670: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
5680: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5690: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
56a0: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
56b0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
56c0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
56d0: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
56e0: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
56f0: 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
5700: 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73 6f  laced at.  Curso
5710: 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e  rs can move when
5720: 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61 72   the row they ar
5730: 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74  e pointing.** at
5740: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20   is deleted out 
5750: 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2e  from under them.
5760: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5770: 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ine returns an e
5780: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f 6d  rror code if som
5790: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
57a0: 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67  g.  The.** integ
57b0: 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69 73  er *pHasMoved is
57c0: 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20 74   set to one if t
57d0: 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f  he cursor has mo
57e0: 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f 74  ved and 0 if not
57f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5800: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
5810: 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ved(BtCursor *pC
5820: 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f 76  ur, int *pHasMov
5830: 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ed){.  int rc;..
5840: 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
5850: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
5860: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
5870: 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d      *pHasMoved =
5880: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   1;.    return r
5890: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  c;.  }.  if( pCu
58a0: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
58b0: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
58c0: 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20 20  >skip!=0 ){.    
58d0: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a  *pHasMoved = 1;.
58e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48    }else{.    *pH
58f0: 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d  asMoved = 0;.  }
5900: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5910: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
5920: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
5930: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76  VACUUM./*.** Giv
5940: 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  en a page number
5950: 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61   of a regular da
5960: 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74  tabase page, ret
5970: 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  urn the page.** 
5980: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70  number for the p
5990: 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
59a0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
59b0: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a  e entry for the.
59c0: 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75  ** input page nu
59d0: 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
59e0: 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e  Pgno ptrmapPagen
59f0: 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  o(BtShared *pBt,
5a00: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5a10: 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  nt nPagesPerMapP
5a20: 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72  age;.  Pgno iPtr
5a30: 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65  Map, ret;.  asse
5a40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5a50: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
5a60: 78 29 20 29 3b 0a 20 20 6e 50 61 67 65 73 50 65  x) );.  nPagesPe
5a70: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
5a80: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
5a90: 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70  ;.  iPtrMap = (p
5aa0: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
5ab0: 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d  MapPage;.  ret =
5ac0: 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73   (iPtrMap*nPages
5ad0: 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b  PerMapPage) + 2;
5ae0: 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e   .  if( ret==PEN
5af0: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
5b00: 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b  Bt) ){.    ret++
5b10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5b20: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
5b30: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
5b40: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
5b50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5b60: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
5b70: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
5b80: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
5b90: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
5ba0: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
5bb0: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
5bc0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
5bd0: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e  er 'pgno'..** An
5be0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
5bf0: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
5c00: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
5c10: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
5c20: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
5c30: 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28 42 74  int ptrmapPut(Bt
5c40: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
5c50: 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c  o key, u8 eType,
5c60: 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a 20   Pgno parent){. 
5c70: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
5c80: 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65  ;  /* The pointe
5c90: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
5ca0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
5cb0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
5cc0: 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50   map data */.  P
5cd0: 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20  gno iPtrmap;    
5ce0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
5cf0: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
5d00: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
5d10: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
5d20: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
5d30: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
5d40: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
5d50: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5d60: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
5d70: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
5d80: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
5d90: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
5da0: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
5db0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
5dc0: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
5dd0: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
5de0: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
5df0: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
5e00: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
5e10: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
5e20: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  y==0 ){.    retu
5e30: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
5e40: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50  T_BKPT;.  }.  iP
5e50: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
5e60: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
5e70: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
5e80: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
5e90: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
5ea0: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
5eb0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
5ec0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
5ed0: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
5ee0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
5ef0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
5f00: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
5f10: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5f20: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
5f30: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
5f40: 69 74 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  it;.  }.  pPtrma
5f50: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
5f60: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
5f70: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
5f80: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
5f90: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
5fa0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
5fb0: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
5fc0: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
5fd0: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
5fe0: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
5ff0: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
6000: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
6010: 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
6020: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
6030: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6040: 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66        pPtrmap[of
6050: 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20  fset] = eType;. 
6060: 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
6070: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
6080: 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d  , parent);.    }
6090: 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69  .  }..ptrmap_exi
60a0: 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t:.  sqlite3Page
60b0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
60c0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
60d0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65  ./*.** Read an e
60e0: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f  ntry from the po
60f0: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
6100: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
6110: 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e  trieves the poin
6120: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
6130: 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72  r page 'key', wr
6140: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70  iting.** the typ
6150: 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  e and parent pag
6160: 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54  e number to *pET
6170: 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72  ype and *pPgno r
6180: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
6190: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
61a0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
61b0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
61c0: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
61d0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
61e0: 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28  c int ptrmapGet(
61f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
6200: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54  gno key, u8 *pET
6210: 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  ype, Pgno *pPgno
6220: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
6230: 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
6240: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6250: 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70  */.  int iPtrmap
6260: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
6270: 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65  er map page inde
6280: 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  x */.  u8 *pPtrm
6290: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
62a0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61  nter map page da
62b0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  ta */.  int offs
62c0: 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  et;        /* Of
62d0: 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e  fset of entry in
62e0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a   pointer map */.
62f0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
6300: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6310: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
6320: 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61  ex) );..  iPtrma
6330: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
6340: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
6350: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
6360: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
6370: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
6380: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  ge);.  if( rc!=0
6390: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
63a0: 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  c;.  }.  pPtrmap
63b0: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
63c0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
63d0: 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74  Page);..  offset
63e0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
63f0: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
6400: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54  );.  assert( pET
6410: 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54  ype!=0 );.  *pET
6420: 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66  ype = pPtrmap[of
6430: 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67  fset];.  if( pPg
6440: 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65  no ) *pPgno = ge
6450: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
6460: 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73  offset+1]);..  s
6470: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
6480: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
6490: 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70   *pEType<1 || *p
64a0: 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e  EType>5 ) return
64b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
64c0: 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53  BKPT;.  return S
64d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c  QLITE_OK;.}..#el
64e0: 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64  se /* if defined
64f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
6500: 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65  OVACUUM */.  #de
6510: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77  fine ptrmapPut(w
6520: 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  ,x,y,z) SQLITE_O
6530: 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  K.  #define ptrm
6540: 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53  apGet(w,x,y,z) S
6550: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
6560: 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  ne ptrmapPutOvfl
6570: 50 74 72 28 78 2c 20 79 29 20 53 51 4c 49 54 45  Ptr(x, y) SQLITE
6580: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
6590: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
65a0: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
65b0: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
65c0: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
65d0: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
65e0: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
65f0: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
6600: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
6610: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
6620: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
6630: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6640: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
6650: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
6660: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
6670: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
6680: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
6690: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
66a0: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
66b0: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28 26  age & get2byte(&
66c0: 28 50 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e  (P)->aData[(P)->
66d0: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29  cellOffset+2*(I)
66e0: 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ])))../*.** This
66f0: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
6700: 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43  version of findC
6710: 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73  ell() that works
6720: 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68   for.** pages th
6730: 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76  at do contain ov
6740: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
6750: 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64  .static u8 *find
6760: 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d  OverflowCell(Mem
6770: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
6780: 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69   iCell){.  int i
6790: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
67a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
67b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
67c0: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61  ) );.  for(i=pPa
67d0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b  ge->nOverflow-1;
67e0: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
67f0: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75   int k;.    stru
6800: 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f  ct _OvflCell *pO
6810: 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d  vfl;.    pOvfl =
6820: 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69   &pPage->aOvfl[i
6830: 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c  ];.    k = pOvfl
6840: 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b  ->idx;.    if( k
6850: 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  <=iCell ){.     
6860: 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b   if( k==iCell ){
6870: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6880: 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20  pOvfl->pCell;.  
6890: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c      }.      iCel
68a0: 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  l--;.    }.  }. 
68b0: 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c   return findCell
68c0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a  (pPage, iCell);.
68d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61  }../*.** Parse a
68e0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c   cell content bl
68f0: 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20  ock and fill in 
6900: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72  the CellInfo str
6910: 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a  ucture.  There.*
6920: 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f  * are two versio
6930: 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ns of this funct
6940: 69 6f 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65  ion.  btreeParse
6950: 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a  Cell() takes a .
6960: 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73  ** cell index as
6970: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
6980: 6d 65 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61  ment and btreePa
6990: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a  rseCellPtr() .**
69a0: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
69b0: 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20   to the body of 
69c0: 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20  the cell as its 
69d0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
69e0: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68  .**.** Within th
69f0: 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72  is file, the par
6a00: 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63  seCell() macro c
6a10: 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  an be called ins
6a20: 74 65 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65  tead of.** btree
6a30: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20  ParseCellPtr(). 
6a40: 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69  Using some compi
6a50: 6c 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  lers, this will 
6a60: 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74  be faster..*/.st
6a70: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
6a80: 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d  arseCellPtr(.  M
6a90: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
6aa0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
6ab0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
6ac0: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
6ad0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
6ae0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
6af0: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
6b00: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
6b10: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
6b20: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
6b30: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20  ure */.){.  u16 
6b40: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
6b50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79      /* Number by
6b60: 74 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74  tes in cell cont
6b70: 65 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ent header */.  
6b80: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
6b90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6ba0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
6bb0: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
6bc0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6bd0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
6be0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
6bf0: 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c  ;..  pInfo->pCel
6c00: 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73  l = pCell;.  ass
6c10: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
6c20: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
6c30: 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70  af==1 );.  n = p
6c40: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
6c50: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d  ze;.  assert( n=
6c60: 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66  =4-4*pPage->leaf
6c70: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
6c80: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69  >intKey ){.    i
6c90: 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
6ca0: 61 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20  a ){.      n += 
6cb0: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  getVarint32(&pCe
6cc0: 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ll[n], nPayload)
6cd0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6ce0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b     nPayload = 0;
6cf0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20  .    }.    n += 
6d00: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
6d10: 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  [n], (u64*)&pInf
6d20: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49  o->nKey);.    pI
6d30: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61  nfo->nData = nPa
6d40: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
6d50: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
6d60: 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67   = 0;.    n += g
6d70: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
6d80: 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  l[n], nPayload);
6d90: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  .    pInfo->nKey
6da0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
6db0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
6dc0: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
6dd0: 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20   pInfo->nHeader 
6de0: 3d 20 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28  = n;.  testcase(
6df0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
6e00: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
6e10: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
6e20: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
6e30: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c  cal+1 );.  if( l
6e40: 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d  ikely(nPayload<=
6e50: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29  pPage->maxLocal)
6e60: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
6e70: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
6e80: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
6e90: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
6ea0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
6eb0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
6ec0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
6ed0: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
6ee0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65  */.    int nSize
6ef0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
6f00: 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c  tal size of cell
6f10: 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65   content in byte
6f20: 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a 65 20 3d  s */.    nSize =
6f30: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20   nPayload + n;. 
6f40: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
6f50: 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64   = (u16)nPayload
6f60: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
6f70: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
6f80: 69 66 28 20 28 6e 53 69 7a 65 20 26 20 7e 33 29  if( (nSize & ~3)
6f90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  ==0 ){.      nSi
6fa0: 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20 20 2f  ze = 4;        /
6fb0: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
6fc0: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 20 20  ize is 4 */.    
6fd0: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  }.    pInfo->nSi
6fe0: 7a 65 20 3d 20 28 75 31 36 29 6e 53 69 7a 65 3b  ze = (u16)nSize;
6ff0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
7000: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
7010: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
7020: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
7030: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
7040: 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63  ve.    ** to dec
7050: 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  ide how much to 
7060: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e  store locally an
7070: 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70  d how much to sp
7080: 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20  ill onto.    ** 
7090: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
70a0: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
70b0: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
70c0: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
70d0: 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f  d.    ** space o
70e0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  n overflow pages
70f0: 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74   while keeping t
7100: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63  he amount of loc
7110: 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a  al storage.    *
7120: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
7130: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
7140: 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  al..    **.    *
7150: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
7160: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
7170: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
7180: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
7190: 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77  any.    ** way w
71a0: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
71b0: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69   incompatible fi
71c0: 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a  le format..    *
71d0: 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  /.    int minLoc
71e0: 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  al;  /* Minimum 
71f0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
7200: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
7210: 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63  /.    int maxLoc
7220: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
7230: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
7240: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
7250: 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75  /.    int surplu
7260: 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  s;   /* Overflow
7270: 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62   payload availab
7280: 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f  le for local sto
7290: 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e  rage */..    min
72a0: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
72b0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78  inLocal;.    max
72c0: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
72d0: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72  axLocal;.    sur
72e0: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
72f0: 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69  + (nPayload - mi
7300: 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e  nLocal)%(pPage->
7310: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
7320: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
7330: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
7340: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
7350: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
7360: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
7370: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
7380: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
7390: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
73a0: 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b   = (u16)surplus;
73b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
73c0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
73d0: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
73e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
73f0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75  ->iOverflow = (u
7400: 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  16)(pInfo->nLoca
7410: 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66  l + n);.    pInf
7420: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f  o->nSize = pInfo
7430: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b  ->iOverflow + 4;
7440: 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70  .  }.}.#define p
7450: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
7460: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a  iCell, pInfo) \.
7470: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
7480: 50 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e  Ptr((pPage), fin
7490: 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28  dCell((pPage), (
74a0: 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29  iCell)), (pInfo)
74b0: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  ).static void bt
74c0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
74d0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
74e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
74f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
7500: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
7510: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
7520: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
7530: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
7540: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
7550: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
7560: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
7570: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
7580: 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50  {.  parseCell(pP
7590: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
75a0: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
75b0: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
75c0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
75d0: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
75e0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
75f0: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
7600: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
7610: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
7620: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
7630: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
7640: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
7650: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
7660: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
7670: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
7680: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
7690: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
76a0: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
76b0: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
76c0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
76d0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
76e0: 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68  &pCell[pPage->ch
76f0: 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75  ildPtrSize];.  u
7700: 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65  32 nSize;..#ifde
7710: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
7720: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
7730: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
7740: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
7750: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
7760: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
7770: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
7780: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
7790: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
77a0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
77b0: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
77c0: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
77d0: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
77e0: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
77f0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
7800: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
7810: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
7820: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
7830: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
7840: 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72  info;.  btreePar
7850: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
7860: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
7870: 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  fo);.#endif..  i
7880: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
7890: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
78a0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
78b0: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
78c0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
78d0: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
78e0: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
78f0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30  .      nSize = 0
7900: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7910: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
7920: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
7930: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
7940: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
7950: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
7960: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
7970: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
7980: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
7990: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
79a0: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
79b0: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
79c0: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
79d0: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
79e0: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
79f0: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
7a00: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c  er<pEnd );.  }el
7a10: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d  se{.    pIter +=
7a20: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
7a30: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a  er, nSize);.  }.
7a40: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
7a50: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
7a60: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
7a70: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
7a80: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
7a90: 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65   if( nSize>pPage
7aa0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
7ab0: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d    int minLocal =
7ac0: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
7ad0: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69  ;.    nSize = mi
7ae0: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20  nLocal + (nSize 
7af0: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70  - minLocal) % (p
7b00: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
7b10: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
7b20: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
7b30: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
7b40: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7b50: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
7b60: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
7b70: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
7b80: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
7b90: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
7ba0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
7bb0: 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d   nSize += 4;.  }
7bc0: 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32  .  nSize += (u32
7bd0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
7be0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69  ;..  /* The mini
7bf0: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20  mum size of any 
7c00: 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e  cell is 4 bytes.
7c10: 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c   */.  if( nSize<
7c20: 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  4 ){.    nSize =
7c30: 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   4;.  }..  asser
7c40: 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69  t( nSize==debugi
7c50: 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72  nfo.nSize );.  r
7c60: 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65  eturn (u16)nSize
7c70: 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ;.}.#ifndef NDEB
7c80: 55 47 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  UG.static u16 ce
7c90: 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a  llSize(MemPage *
7ca0: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
7cb0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c 6c  ){.  return cell
7cc0: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 66  SizePtr(pPage, f
7cd0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
7ce0: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
7cf0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
7d00: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
7d10: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
7d20: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
7d30: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
7d40: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
7d50: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
7d60: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
7d70: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
7d80: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
7d90: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
7da0: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
7db0: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76   int ptrmapPutOv
7dc0: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
7dd0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
7de0: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
7df0: 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  o;.  assert( pCe
7e00: 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72 65 65  ll!=0 );.  btree
7e10: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
7e20: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
7e30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e  );.  assert( (in
7e40: 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
7e50: 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
7e60: 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79  Key))==info.nPay
7e70: 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69 6e  load );.  if( in
7e80: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
7e90: 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
7ea0: 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
7eb0: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
7ec0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74 72  ;.    return ptr
7ed0: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
7ee0: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
7ef0: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
7f00: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  ->pgno);.  }.  r
7f10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7f20: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
7f30: 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65  * Defragment the
7f40: 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c   page given.  Al
7f50: 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65  l Cells are move
7f60: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  d to the.** end 
7f70: 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  of the page and 
7f80: 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69  all free space i
7f90: 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f  s collected into
7fa0: 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65   one.** big Free
7fb0: 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20  Blk that occurs 
7fc0: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68  in between the h
7fd0: 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a  eader and cell.*
7fe0: 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  * pointer array 
7ff0: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
8000: 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74  tent area..*/.st
8010: 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d  atic int defragm
8020: 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  entPage(MemPage 
8030: 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
8040: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8050: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
8060: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
8070: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
8080: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
8090: 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20   of a i-th cell 
80a0: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80c0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
80d0: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
80e0: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8100: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
8110: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
8120: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
8130: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
8140: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
8150: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
8160: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
8170: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
8180: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
8190: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
81a0: 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  cbrk;           
81b0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
81c0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
81d0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
81e0: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
81f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8200: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
8210: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
8220: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
8230: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
8240: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
8250: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
8260: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
8270: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
8280: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
8290: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
82a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
82b0: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
82c0: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
82d0: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20  CellLast;       
82e0: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f        /* Last po
82f0: 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  ssible cell inde
8300: 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28  x */...  assert(
8310: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
8320: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
8330: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
8340: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
8350: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8360: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
8370: 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54  bleSize <= SQLIT
8380: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
8390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
83a0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
83b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
83c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
83d0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
83e0: 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ex) );.  temp = 
83f0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
8400: 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74  Space(pPage->pBt
8410: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61 74  ->pPager);.  dat
8420: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
8430: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
8440: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
8450: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
8460: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
8470: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
8480: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
8490: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
84a0: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b  &data[hdr+3]) );
84b0: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
84c0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
84d0: 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d  leSize;.  cbrk =
84e0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
84f0: 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70  hdr+5]);.  memcp
8500: 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26  y(&temp[cbrk], &
8510: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62  data[cbrk], usab
8520: 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a  leSize - cbrk);.
8530: 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53    cbrk = usableS
8540: 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73  ize;.  iCellFirs
8550: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
8560: 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c   2*nCell;.  iCel
8570: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
8580: 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d  ze - 4;.  for(i=
8590: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
85a0: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
85b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
85c0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
85d0: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
85e0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
85f0: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
8600: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
8610: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
8620: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
8630: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
8640: 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 23  ==iCellLast );.#
8650: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8660: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
8670: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
8680: 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64     /* These cond
8690: 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65  itions have alre
86a0: 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65  ady been verifie
86b0: 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61  d in btreeInitPa
86c0: 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 53  ge().    ** if S
86d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
86e0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
86f0: 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20 20   is defined .   
8700: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
8710: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
8720: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
8730: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8740: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8750: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
8760: 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c  assert( pc>=iCel
8770: 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43  lFirst && pc<=iC
8780: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73  ellLast );.    s
8790: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
87a0: 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70  r(pPage, &temp[p
87b0: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
87c0: 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69 6e   size;.#if defin
87d0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
87e0: 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43  _OVERSIZE_CELL_C
87f0: 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63 62  HECK).    if( cb
8800: 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b  rk<iCellFirst ){
8810: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8820: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8830: 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  T;.    }.#else. 
8840: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
8850: 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a  lFirst || pc+siz
8860: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
8870: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8880: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8890: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
88a0: 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b     assert( cbrk+
88b0: 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65  size<=usableSize
88c0: 20 26 26 20 63 62 72 6b 3e 69 43 65 6c 6c 46 69   && cbrk>iCellFi
88d0: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
88e0: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
88f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
8900: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
8910: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
8920: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
8930: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70  ata[cbrk], &temp
8940: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20  [pc], size);.   
8950: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
8960: 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73   cbrk);.  }.  as
8970: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
8980: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
8990: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
89a0: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
89b0: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
89c0: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
89d0: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
89e0: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
89f0: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
8a00: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
8a10: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
8a20: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
8a30: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
8a40: 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63  Page) );.  if( c
8a50: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d  brk-iCellFirst!=
8a60: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
8a70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8a80: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8a90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
8aa0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8ab0: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
8ac0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
8ad0: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42  rom within the B
8ae0: 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65  -Tree page passe
8af0: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
8b00: 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74  t argument. Writ
8b10: 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65  e into *pIdx the
8b20: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
8b30: 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66  e->aData[].** of
8b40: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
8b50: 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  of allocated spa
8b60: 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65  ce. Return eithe
8b70: 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a  r SQLITE_OK or.*
8b80: 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
8b90: 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f  (usually SQLITE_
8ba0: 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20  CORRUPT)..**.** 
8bb0: 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  The caller guara
8bc0: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65  ntees that there
8bd0: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73   is sufficient s
8be0: 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65  pace to make the
8bf0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  .** allocation. 
8c00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
8c10: 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72  ght need to defr
8c20: 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20  agment in order 
8c30: 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20  to bring.** all 
8c40: 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68  the space togeth
8c50: 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68  er, however.  Th
8c60: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
8c70: 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74  avoid using.** t
8c80: 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74  he first two byt
8c90: 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c  es past the cell
8ca0: 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69   pointer area si
8cb0: 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74  nce presumably t
8cc0: 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  his.** allocatio
8cd0: 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20  n is being made 
8ce0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65  in order to inse
8cf0: 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73  rt a new cell, s
8d00: 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  o we will.** als
8d10: 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67  o end up needing
8d20: 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e   a new cell poin
8d30: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
8d40: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
8d50: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
8d60: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
8d70: 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20  *pIdx){.  const 
8d80: 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
8d90: 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f  >hdrOffset;    /
8da0: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
8db0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
8dc0: 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  t */.  u8 * cons
8dd0: 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
8de0: 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c  aData;      /* L
8df0: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
8e00: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
8e10: 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20  int nFrag;      
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8e40: 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  f fragmented byt
8e50: 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  es on pPage */. 
8e60: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e80: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
8e90: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
8ea0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
8eb0: 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a  t gap;        /*
8ec0: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67   First byte of g
8ed0: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20  ap between cell 
8ee0: 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c  pointers and cel
8ef0: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  l content */.  i
8f00: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
8f10: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
8f20: 20 63 6f 64 65 20 2a 2f 0a 20 20 0a 20 20 61 73   code */.  .  as
8f30: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
8f40: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
8f50: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
8f60: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8f70: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
8f80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8f90: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
8fa0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
8fb0: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
8fc0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
8fd0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
8fe0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8ff0: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
9000: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9010: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
9020: 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74  ;..  nFrag = dat
9030: 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65  a[hdr+7];.  asse
9040: 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  rt( pPage->cellO
9050: 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31  ffset == hdr + 1
9060: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
9070: 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61  f );.  gap = pPa
9080: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
9090: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
90a0: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
90b0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
90c0: 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d  .  assert( gap<=
90d0: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
90e0: 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b  e( gap+2==top );
90f0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
9100: 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +1==top );.  tes
9110: 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20  tcase( gap==top 
9120: 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61 67 3e  );..  if( nFrag>
9130: 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  =60 ){.    /* Al
9140: 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e 74 20  ways defragment 
9150: 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e 74 65  highly fragmente
9160: 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72  d pages */.    r
9170: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
9180: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
9190: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
91a0: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
91b0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
91c0: 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  5]);.  }else if(
91d0: 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20   gap+2<=top ){. 
91e0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65     /* Search the
91f0: 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e   freelist lookin
9200: 67 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f  g for a free slo
9210: 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  t big enough to 
9220: 73 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a 20  satisfy .    ** 
9230: 74 68 65 20 72 65 71 75 65 73 74 2e 20 54 68 65  the request. The
9240: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d   allocation is m
9250: 61 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72  ade from the fir
9260: 73 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20  st free slot in 
9270: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73 74  .    ** the list
9280: 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 20 65   that is large e
9290: 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 61 64  nough to accomad
92a0: 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20  ate it..    */. 
92b0: 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b     int pc, addr;
92c0: 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64  .    for(addr=hd
92d0: 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62  r+1; (pc = get2b
92e0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
92f0: 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20  )>0; addr=pc){. 
9300: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
9310: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
9320: 63 2b 32 5d 29 3b 20 20 20 20 20 2f 2a 20 53 69  c+2]);     /* Si
9330: 7a 65 20 6f 66 20 66 72 65 65 20 73 6c 6f 74 20  ze of free slot 
9340: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  */.      if( siz
9350: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
9360: 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65      int x = size
9370: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
9380: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
9390: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
93a0: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
93b0: 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b        if( x<4 ){
93c0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  .          /* Re
93d0: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
93e0: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
93f0: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
9400: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
9410: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
9420: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
9430: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
9440: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
9450: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
9460: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
9470: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75  data[hdr+7] = (u
9480: 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20  8)(nFrag + x);. 
9490: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
94a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
94b0: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
94c0: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
94d0: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
94e0: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
94f0: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
9500: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
9510: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
9520: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
9530: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
9540: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  +2], x);.       
9550: 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78   }.        *pIdx
9560: 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20   = pc + x;.     
9570: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9580: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
9590: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
95a0: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
95b0: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
95c0: 73 70 61 63 65 20 69 6e 20 74 68 65 20 67 61 70  space in the gap
95d0: 20 74 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a   to satisfy.  **
95e0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   the allocation.
95f0: 20 20 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67    If not, defrag
9600: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  ment..  */.  tes
9610: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
9620: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
9630: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
9640: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   ){.    rc = def
9650: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
9660: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
9670: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9680: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
9690: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
96a0: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42    assert( gap+nB
96b0: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
96c0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
96d0: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
96e0: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
96f0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
9700: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
9710: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
9720: 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  area..  */.  top
9730: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74   -= nByte;.  put
9740: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
9750: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 2a 70 49 64  5], top);.  *pId
9760: 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72  x = top;.  retur
9770: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9780: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
9790: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
97a0: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
97b0: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
97c0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
97d0: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
97e0: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
97f0: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
9800: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
9810: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
9820: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
9830: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
9840: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
9850: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
9860: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
9870: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
9880: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
9890: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
98a0: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
98b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
98c0: 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a  t start, int siz
98d0: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
98e0: 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69  pbegin, hdr;.  i
98f0: 6e 74 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20  nt iLast;       
9900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9910: 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73   /* Largest poss
9920: 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f  ible freeblock o
9930: 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ffset */.  unsig
9940: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
9950: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a   pPage->aData;..
9960: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9970: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
9980: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
9990: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
99a0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
99b0: 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74 3e    assert( start>
99c0: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
99d0: 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66  t+6+(pPage->leaf
99e0: 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73 73 65 72  ?0:4) );.  asser
99f0: 74 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65  t( (start + size
9a00: 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )<=pPage->pBt->u
9a10: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
9a20: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9a30: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9a40: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9a50: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d    assert( size>=
9a60: 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  0 );   /* Minimu
9a70: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
9a80: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
9a90: 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
9aa0: 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20  .  /* Overwrite 
9ab0: 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
9ac0: 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
9ad0: 68 65 6e 20 74 68 65 20 53 45 43 55 52 45 5f 44  hen the SECURE_D
9ae0: 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69  ELETE .  ** opti
9af0: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 61 74  on is enabled at
9b00: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f   compile-time */
9b10: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
9b20: 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29  start], 0, size)
9b30: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
9b40: 64 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63  dd the space bac
9b50: 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  k into the linke
9b60: 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  d list of freebl
9b70: 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  ocks.  Note that
9b80: 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67  .  ** even thoug
9b90: 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  h the freeblock 
9ba0: 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64  list was checked
9bb0: 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67   by btreeInitPag
9bc0: 65 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49  e(),.  ** btreeI
9bd0: 6e 69 74 50 61 67 65 28 29 20 64 69 64 20 6e 6f  nitPage() did no
9be0: 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70  t detect overlap
9bf0: 70 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20  ping cells or.  
9c00: 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68  ** freeblocks th
9c10: 61 74 20 6f 76 65 72 6c 61 70 70 65 64 20 63 65  at overlapped ce
9c20: 6c 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20  lls.   Nor does 
9c30: 69 74 20 64 65 74 65 63 74 20 77 68 65 6e 20 74  it detect when t
9c40: 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e  he.  ** cell con
9c50: 74 65 6e 74 20 61 72 65 61 20 65 78 63 65 65 64  tent area exceed
9c60: 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  s the value in t
9c70: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 20  he page header. 
9c80: 20 49 66 20 74 68 65 73 65 0a 20 20 2a 2a 20 73   If these.  ** s
9c90: 69 74 75 61 74 69 6f 6e 73 20 61 72 69 73 65 2c  ituations arise,
9ca0: 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74   then subsequent
9cb0: 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f   insert operatio
9cc0: 6e 73 20 6d 69 67 68 74 20 63 6f 72 72 75 70 74  ns might corrupt
9cd0: 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69  .  ** the freeli
9ce0: 73 74 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 65  st.  So we do ne
9cf0: 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20  ed to check for 
9d00: 63 6f 72 72 75 70 74 69 6f 6e 20 77 68 69 6c 65  corruption while
9d10: 20 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74   scanning.  ** t
9d20: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a  he freelist..  *
9d30: 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  /.  hdr = pPage-
9d40: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64  >hdrOffset;.  ad
9d50: 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  dr = hdr + 1;.  
9d60: 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70  iLast = pPage->p
9d70: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
9d80: 20 34 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74   4;.  assert( st
9d90: 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20  art<=iLast );.  
9da0: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
9db0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9dc0: 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26  addr]))<start &&
9dd0: 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20   pbegin>0 ){.   
9de0: 20 69 66 28 20 70 62 65 67 69 6e 3c 61 64 64 72   if( pbegin<addr
9df0: 2b 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  +4 ){.      retu
9e00: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9e10: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
9e20: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
9e30: 0a 20 20 7d 0a 20 20 69 66 28 20 70 62 65 67 69  .  }.  if( pbegi
9e40: 6e 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 72  n>iLast ){.    r
9e50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9e60: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
9e70: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e   assert( pbegin>
9e80: 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d  addr || pbegin==
9e90: 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  0 );.  put2byte(
9ea0: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61  &data[addr], sta
9eb0: 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  rt);.  put2byte(
9ec0: 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62  &data[start], pb
9ed0: 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74  egin);.  put2byt
9ee0: 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d  e(&data[start+2]
9ef0: 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  , size);.  pPage
9f00: 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d  ->nFree = pPage-
9f10: 3e 6e 46 72 65 65 20 2b 20 28 75 31 36 29 73 69  >nFree + (u16)si
9f20: 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73  ze;..  /* Coales
9f30: 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65  ce adjacent free
9f40: 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64   blocks */.  add
9f50: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77  r = hdr + 1;.  w
9f60: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
9f70: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
9f80: 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20  ddr]))>0 ){.    
9f90: 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65  int pnext, psize
9fa0: 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  , x;.    assert(
9fb0: 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a   pbegin>addr );.
9fc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
9fd0: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
9fe0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
9ff0: 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32      pnext = get2
a000: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
a010: 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d  n]);.    psize =
a020: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a030: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
a040: 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69  if( pbegin + psi
a050: 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20  ze + 3 >= pnext 
a060: 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20  && pnext>0 ){.  
a070: 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70      int frag = p
a080: 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70  next - (pbegin+p
a090: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  size);.      if(
a0a0: 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28 66 72   (frag<0) || (fr
a0b0: 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 68 64 72  ag>(int)data[hdr
a0c0: 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  +7]) ){.        
a0d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a0e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a0f0: 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61 5b 68    }.      data[h
a100: 64 72 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61  dr+7] -= (u8)fra
a110: 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74  g;.      x = get
a120: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
a130: 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62  t]);.      put2b
a140: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
a150: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d  ], x);.      x =
a160: 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74   pnext + get2byt
a170: 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d  e(&data[pnext+2]
a180: 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20  ) - pbegin;.    
a190: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
a1a0: 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a  [pbegin+2], x);.
a1b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a1c0: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
a1d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
a1e0: 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
a1f0: 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73 20  ent area begins 
a200: 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b  with a freeblock
a210: 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a  , remove it. */.
a220: 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31    if( data[hdr+1
a230: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26  ]==data[hdr+5] &
a240: 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64  & data[hdr+2]==d
a250: 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20  ata[hdr+6] ){.  
a260: 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70    int top;.    p
a270: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
a280: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
a290: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
a2a0: 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70  [hdr+1], &data[p
a2b0: 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20  begin], 2);.    
a2c0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
a2d0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67  data[hdr+5]) + g
a2e0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
a2f0: 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75  egin+2]);.    pu
a300: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
a310: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20  +5], top);.  }. 
a320: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a330: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
a340: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
a350: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
a360: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
a370: 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67   Decode the flag
a380: 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73  s byte (the firs
a390: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
a3a0: 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65  ader) for a page
a3b0: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
a3c0: 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ze fields of the
a3d0: 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
a3e0: 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  re accordingly..
a3f0: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66  **.** Only the f
a400: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
a410: 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72  tions are suppor
a420: 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64  ted.  Anything d
a430: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69  ifferent.** indi
a440: 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20  cates a corrupt 
a450: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a  database files:.
a460: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  **.**         PT
a470: 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20  F_ZERODATA.**   
a480: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
a490: 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a  TA | PTF_LEAF.**
a4a0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
a4b0: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
a4c0: 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  EY.**         PT
a4d0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
a4e0: 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45  _INTKEY | PTF_LE
a4f0: 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  AF.*/.static int
a500: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d   decodeFlags(Mem
a510: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
a520: 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74   flagByte){.  Bt
a530: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
a540: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50   /* A copy of pP
a550: 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61  age->pBt */..  a
a560: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64  ssert( pPage->hd
a570: 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d  rOffset==(pPage-
a580: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
a590: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
a5a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a5b0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
a5c0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
a5d0: 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66  e->leaf = (u8)(f
a5e0: 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73  lagByte>>3);  as
a5f0: 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d  sert( PTF_LEAF =
a600: 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67  = 1<<3 );.  flag
a610: 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41  Byte &= ~PTF_LEA
a620: 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c  F;.  pPage->chil
a630: 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70  dPtrSize = 4-4*p
a640: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42  Page->leaf;.  pB
a650: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
a660: 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d    if( flagByte==
a670: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20  (PTF_LEAFDATA | 
a680: 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20  PTF_INTKEY) ){. 
a690: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
a6a0: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 1;.    pPage-
a6b0: 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61 67 65  >hasData = pPage
a6c0: 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  ->leaf;.    pPag
a6d0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
a6e0: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
a6f0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
a700: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
a710: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
a720: 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41  Byte==PTF_ZERODA
a730: 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  TA ){.    pPage-
a740: 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20  >intKey = 0;.   
a750: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
a760: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
a770: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
a780: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
a790: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
a7a0: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
a7b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
a7c0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
a7d0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
a7e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a7f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
a800: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
a810: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
a820: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
a830: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
a840: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
a850: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
a860: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
a870: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
a880: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
a890: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
a8a0: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
a8b0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
a8c0: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
a8d0: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
a8e0: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
a8f0: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
a900: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
a910: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
a920: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
a930: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
a940: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
a950: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
a960: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
a970: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
a980: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
a990: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
a9a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
a9b0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
a9c0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
a9d0: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
a9e0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
a9f0: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
aa00: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
aa10: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
aa20: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
aa30: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
aa40: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
aa50: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
aa60: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
aa70: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
aa80: 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  e) );..  if( !pP
aa90: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
aaa0: 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20     u16 pc;      
aab0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
aac0: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
aad0: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
aae0: 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ata[] */.    u8 
aaf0: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
ab00: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
ab10: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
ab20: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20  eader */.    u8 
ab30: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
ab40: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
ab50: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20  e->aData */.    
ab60: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
ab70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
ab80: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
ab90: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 75 73 61  e */.    u16 usa
aba0: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
abb0: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
abc0: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
abd0: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65  ge */.    u16 ce
abe0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
abf0: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
ac00: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
ac10: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
ac20: 2a 2f 0a 20 20 20 20 75 31 36 20 6e 46 72 65 65  */.    u16 nFree
ac30: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
ac40: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
ac50: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
ac60: 2a 2f 0a 20 20 20 20 75 31 36 20 74 6f 70 3b 20  */.    u16 top; 
ac70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
ac80: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
ac90: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
aca0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
acb0: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
acc0: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
acd0: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
ace0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e  offset */.    in
acf0: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
ad00: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
ad10: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
ad20: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20  ock offset */.. 
ad30: 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e     pBt = pPage->
ad40: 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20  pBt;..    hdr = 
ad50: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
ad60: 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
ad70: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69  ge->aData;.    i
ad80: 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  f( decodeFlags(p
ad90: 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29  Page, data[hdr])
ada0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
adb0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
adc0: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
add0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
ade0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
adf0: 33 32 37 36 38 20 29 3b 0a 20 20 20 20 70 50 61  32768 );.    pPa
ae00: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70  ge->maskPage = p
ae10: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
ae20: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76  ;.    pPage->nOv
ae30: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
ae40: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
ae50: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
ae60: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
ae70: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
ae80: 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
ae90: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
aea0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
aeb0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
aec0: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
aed0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
aee0: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
aef0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
af00: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
af10: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
af20: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
af30: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
af40: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
af50: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
af60: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
af70: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
af80: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
af90: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
afa0: 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f  L(pBt) );..    /
afb0: 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61  * A malformed da
afc0: 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68  tabase page migh
afd0: 74 20 63 61 75 73 65 20 75 73 65 20 74 6f 20 72  t cause use to r
afe0: 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  ead past the end
aff0: 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20  .    ** of page 
b000: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63  when parsing a c
b010: 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  ell.  .    **.  
b020: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
b030: 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ng block of code
b040: 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f   checks early to
b050: 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65   see if a cell e
b060: 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61  xtends.    ** pa
b070: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
b080: 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e  page boundary an
b090: 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f  d causes SQLITE_
b0a0: 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20  CORRUPT to be . 
b0b0: 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69     ** returned i
b0c0: 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a  f it does..    *
b0d0: 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74  /.    iCellFirst
b0e0: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
b0f0: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
b100: 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20      iCellLast = 
b110: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
b120: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
b130: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
b140: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
b150: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69     {.      int i
b160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b170: 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63  Index into the c
b180: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
b190: 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73  y */.      int s
b1a0: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z;           /* 
b1b0: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
b1c0: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  /..      if( !pP
b1d0: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
b1e0: 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66  lLast--;.      f
b1f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
b200: 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
b210: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
b220: 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  yte(&data[cellOf
b230: 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  fset+i*2]);.    
b240: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
b250: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
b260: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
b270: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
b280: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
b290: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
b2a0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
b2b0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
b2c0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b2d0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
b2e0: 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
b2f0: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
b300: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
b310: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
b320: 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
b330: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
b340: 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20  c+sz>usableSize 
b350: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
b360: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
b370: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
b380: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
b390: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
b3a0: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b  f ) iCellLast++;
b3b0: 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a  .    }  .#endif.
b3c0: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
b3d0: 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73  the total free s
b3e0: 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
b3f0: 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74   */.    pc = get
b400: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b410: 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d  1]);.    nFree =
b420: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74   data[hdr+7] + t
b430: 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  op;.    while( p
b440: 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36  c>0 ){.      u16
b450: 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20   next, size;.   
b460: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
b470: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
b480: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
b490: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73  /* Free block is
b4a0: 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f   off the page */
b4b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b4c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b4d0: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
b4e0: 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62      next = get2b
b4f0: 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a  yte(&data[pc]);.
b500: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
b510: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
b520: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ]);.      if( ne
b530: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
b540: 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20  +size+3 ){.     
b550: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
b560: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
b570: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
b580: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
b590: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
b5a0: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
b5b0: 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65     nFree = nFree
b5c0: 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70   + size;.      p
b5d0: 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a  c = next;.    }.
b5e0: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
b5f0: 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e  point, nFree con
b600: 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66  tains the sum of
b610: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
b620: 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  he start.    ** 
b630: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
b640: 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68  ent area plus th
b650: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
b660: 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20   bytes within.  
b670: 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f    ** the cell-co
b680: 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74  ntent area. If t
b690: 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74  his is greater t
b6a0: 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73  han the usable-s
b6b0: 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ize.    ** of th
b6c0: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  e page, then the
b6d0: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
b6e0: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68  rrupted. This ch
b6f0: 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20  eck also.    ** 
b700: 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79  serves to verify
b710: 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74   that the offset
b720: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
b730: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
b740: 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61  t.    ** area, a
b750: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
b760: 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65  page header, lie
b770: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
b780: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
b790: 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69  ( nFree>usableSi
b7a0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ze ){.      retu
b7b0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b7c0: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20  T_BKPT; .    }. 
b7d0: 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
b7e0: 3d 20 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  = nFree - iCellF
b7f0: 69 72 73 74 3b 0a 20 20 20 20 70 50 61 67 65 2d  irst;.    pPage-
b800: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d  >isInit = 1;.  }
b810: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b820: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
b830: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
b840: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
b850: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
b860: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
b870: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
b880: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
b890: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
b8a0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
b8b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b8c0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
b8d0: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
b8e0: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
b8f0: 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
b900: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b910: 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
b920: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b930: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
b940: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
b950: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
b960: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b970: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
b980: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
b990: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
b9a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
b9b0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
b9c0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
b9d0: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
b9e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b9f0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
ba00: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
ba10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ba20: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
ba30: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
ba40: 2a 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64  *memset(&data[hd
ba50: 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62  r], 0, pBt->usab
ba60: 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 2a 2f  leSize - hdr);*/
ba70: 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28  .  data[hdr] = (
ba80: 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69  char)flags;.  fi
ba90: 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20  rst = hdr + 8 + 
baa0: 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  4*((flags&PTF_LE
bab0: 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20  AF)==0 ?1:0);.  
bac0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
bad0: 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
bae0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
baf0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
bb00: 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
bb10: 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
bb20: 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e  e->nFree = pBt->
bb30: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72  usableSize - fir
bb40: 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  st;.  decodeFlag
bb50: 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
bb60: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
bb70: 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61  set = hdr;.  pPa
bb80: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
bb90: 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
bba0: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
bbb0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
bbc0: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
bbd0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33  pBt->pageSize<=3
bbe0: 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67 65 2d  2768 );.  pPage-
bbf0: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74 2d  >maskPage = pBt-
bc00: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20  >pageSize - 1;. 
bc10: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
bc20: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  0;.  pPage->isIn
bc30: 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  it = 1;.}.../*.*
bc40: 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61  * Convert a DbPa
bc50: 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ge obtained from
bc60: 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20   the pager into 
bc70: 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62  a MemPage used b
bc80: 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c  y.** the btree l
bc90: 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ayer..*/.static 
bca0: 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
bcb0: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50  geFromDbPage(DbP
bcc0: 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67  age *pDbPage, Pg
bcd0: 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65  no pgno, BtShare
bce0: 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
bcf0: 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d  ge *pPage = (Mem
bd00: 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67  Page*)sqlite3Pag
bd10: 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61  erGetExtra(pDbPa
bd20: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  ge);.  pPage->aD
bd30: 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ata = sqlite3Pag
bd40: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
bd50: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62  e);.  pPage->pDb
bd60: 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a  Page = pDbPage;.
bd70: 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
bd80: 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e  Bt;.  pPage->pgn
bd90: 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67  o = pgno;.  pPag
bda0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70  e->hdrOffset = p
bdb0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
bdc0: 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72  100 : 0;.  retur
bdd0: 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a  n pPage; .}../*.
bde0: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
bdf0: 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49  om the pager.  I
be00: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
be10: 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
be20: 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
be30: 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
be40: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
be50: 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69  noContent flag i
be60: 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20  s set, it means 
be70: 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
be80: 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  are about.** the
be90: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
bea0: 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d  page at this tim
beb0: 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f  e.  So do not go
bec0: 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20   to the disk.** 
bed0: 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e  to fetch the con
bee0: 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c  tent.  Just fill
bef0: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
bf00: 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e  with zeros for n
bf10: 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65  ow..** If in the
bf20: 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20   future we call 
bf30: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
bf40: 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65  e() on this page
bf50: 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20  , that.** means 
bf60: 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20  we have started 
bf70: 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20  to be concerned 
bf80: 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e  about content an
bf90: 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65  d the disk.** re
bfa0: 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
bfb0: 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
bfc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
bfd0: 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53  eeGetPage(.  BtS
bfe0: 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
bff0: 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
c000: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
c010: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c020: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
c030: 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
c040: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
c050: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
c060: 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
c070: 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
c080: 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
c090: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20   /* Do not load 
c0a0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66 20  page content if 
c0b0: 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  true */.){.  int
c0c0: 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
c0d0: 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
c0e0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
c0f0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
c100: 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
c110: 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
c120: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
c130: 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44  o, (DbPage**)&pD
c140: 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74  bPage, noContent
c150: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
c160: 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61  turn rc;.  *ppPa
c170: 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72  ge = btreePageFr
c180: 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
c190: 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
c1a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c1b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  ;.}../*.** Retri
c1c0: 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  eve a page from 
c1d0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
c1e0: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
c1f0: 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a  d page is not.**
c200: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
c210: 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75  pager cache retu
c220: 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c  rn NULL. Initial
c230: 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
c240: 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
c250: 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
c260: 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s if needed..*/.
c270: 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
c280: 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
c290: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
c2a0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50  gno pgno){.  DbP
c2b0: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
c2c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c2d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
c2e0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50  mutex) );.  pDbP
c2f0: 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
c300: 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50  erLookup(pBt->pP
c310: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
c320: 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20  f( pDbPage ){.  
c330: 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
c340: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
c350: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
c360: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
c370: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
c380: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
c390: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c3a0: 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65  in pages. If the
c3b0: 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f  re is any kind o
c3c0: 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75  f.** error, retu
c3d0: 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  rn ((unsigned in
c3e0: 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  t)-1)..*/.static
c3f0: 20 50 67 6e 6f 20 70 61 67 65 72 50 61 67 65 63   Pgno pagerPagec
c400: 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  ount(BtShared *p
c410: 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  Bt){.  int nPage
c420: 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 3b   = -1;.  int rc;
c430: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
c440: 70 50 61 67 65 31 20 29 3b 0a 20 20 72 63 20 3d  pPage1 );.  rc =
c450: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
c460: 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
c470: 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 61  er, &nPage);.  a
c480: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
c490: 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d 3d 2d  E_OK || nPage==-
c4a0: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 50  1 );.  return (P
c4b0: 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a  gno)nPage;.}../*
c4c0: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
c4d0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e  rom the pager an
c4e0: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e  d initialize it.
c4f0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
c500: 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76  * is just a conv
c510: 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20  enience wrapper 
c520: 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20  around separate 
c530: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 62 74 72 65  calls to.** btre
c540: 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 62  eGetPage() and b
c550: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
c560: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
c570: 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
c580: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
c590: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
c5a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
c5b0: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
c5c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c5d0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
c5e0: 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  get */.  MemPage
c5f0: 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 2f 2a   **ppPage     /*
c600: 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
c610: 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
c620: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
c630: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
c640: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c650: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
c660: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
c670: 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ( pgno==0 ){.   
c680: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c690: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
c6a0: 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6f 66  }..  /* It is of
c6b0: 74 65 6e 20 74 68 65 20 63 61 73 65 20 74 68 61  ten the case tha
c6c0: 74 20 74 68 65 20 70 61 67 65 20 77 65 20 77 61  t the page we wa
c6d0: 6e 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  nt is already in
c6e0: 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49 66 20   cache..  ** If 
c6f0: 73 6f 2c 20 67 65 74 20 69 74 20 64 69 72 65 63  so, get it direc
c700: 74 6c 79 2e 20 20 54 68 69 73 20 73 61 76 65 73  tly.  This saves
c710: 20 75 73 20 66 72 6f 6d 20 68 61 76 69 6e 67 20   us from having 
c720: 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70 61 67  to call.  ** pag
c730: 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20 74 6f  erPagecount() to
c740: 20 6d 61 6b 65 20 73 75 72 65 20 70 67 6e 6f 20   make sure pgno 
c750: 69 73 20 77 69 74 68 69 6e 20 6c 69 6d 69 74 73  is within limits
c760: 2c 20 77 68 69 63 68 20 72 65 73 75 6c 74 73 0a  , which results.
c770: 20 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73 75 72    ** in a measur
c780: 65 61 62 6c 65 20 70 65 72 66 6f 72 6d 61 6e 63  eable performanc
c790: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73 2e 0a  e improvements..
c7a0: 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 20 3d    */.  *ppPage =
c7b0: 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
c7c0: 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 70 67  geLookup(pBt, pg
c7d0: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  no);.  if( pPage
c7e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65 20   ){.    /* Page 
c7f0: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  is already in ca
c800: 63 68 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  che */.    rc = 
c810: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
c820: 73 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65 20  se{.    /* Page 
c830: 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 20 41  not in cache.  A
c840: 63 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a 20 20  cquire it. */.  
c850: 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f    testcase( pgno
c860: 3d 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  ==pagerPagecount
c870: 28 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28  (pBt) );.    if(
c880: 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63   pgno>pagerPagec
c890: 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
c8a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c8b0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c8c0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 62      }.    rc = b
c8d0: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
c8e0: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30   pgno, ppPage, 0
c8f0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
c900: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
c910: 50 61 67 65 20 3d 20 2a 70 70 50 61 67 65 3b 0a  Page = *ppPage;.
c920: 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
c930: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
c940: 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
c950: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
c960: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c970: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  OK ){.    releas
c980: 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
c990: 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
c9a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c9b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
c9c0: 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
c9d0: 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
c9e0: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
c9f0: 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
ca00: 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a  o btreeGetPage..
ca10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
ca20: 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
ca30: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
ca40: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61  ( pPage ){.    a
ca50: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
ca60: 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 73 71  verflow==0 || sq
ca70: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
ca80: 66 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 44  fcount(pPage->pD
ca90: 62 50 61 67 65 29 3e 31 20 29 3b 0a 20 20 20 20  bPage)>1 );.    
caa0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
cab0: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
cac0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
cad0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
cae0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
caf0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
cb00: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
cb10: 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ge );.    assert
cb20: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
cb30: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
cb40: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
cb50: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
cb60: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
cb70: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
cb80: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
cb90: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
cba0: 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
cbb0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
cbc0: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
cbd0: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
cbe0: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
cbf0: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
cc00: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
cc10: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
cc20: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
cc30: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
cc40: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
cc50: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
cc60: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
cc70: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
cc80: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
cc90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
cca0: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
ccb0: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
ccc0: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
ccd0: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
cce0: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
ccf0: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
cd00: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
cd10: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
cd20: 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
cd30: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
cd40: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
cd50: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
cd60: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
cd70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
cd80: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
cd90: 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
cda0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
cdb0: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
cdc0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
cdd0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
cde0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
cdf0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
ce00: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
ce10: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
ce20: 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
ce30: 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
ce40: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
ce50: 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
ce60: 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
ce70: 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
ce80: 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
ce90: 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
cea0: 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
ceb0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
cec0: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
ced0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
cee0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
cef0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
cf00: 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
cf10: 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
cf20: 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
cf30: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
cf40: 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
cf50: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
cf60: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
cf70: 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
cf80: 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
cf90: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
cfa0: 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
cfb0: 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
cfc0: 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
cfd0: 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
cfe0: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
cff0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
d000: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
d010: 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
d020: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
d030: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
d040: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
d050: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
d060: 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
d070: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
d080: 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
d090: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d0a0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
d0b0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
d0c0: 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
d0d0: 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
d0e0: 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
d0f0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
d100: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
d110: 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
d120: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
d130: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
d140: 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
d150: 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61  ame is NULL.** a
d160: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 77 69   new database wi
d170: 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65  th a random name
d180: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
d190: 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65  is randomly name
d1a0: 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  d.** database fi
d1b0: 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
d1c0: 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ed when sqlite3B
d1d0: 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
d1e0: 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46 69  alled..** If zFi
d1f0: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
d200: 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
d210: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
d220: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
d230: 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
d240: 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
d250: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
d260: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
d270: 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
d280: 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20  y opened in the 
d290: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f  same database co
d2a0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  nnection.** and 
d2b0: 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65 64  we are in shared
d2c0: 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65   cache mode, the
d2d0: 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20  n the open will 
d2e0: 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20  fail with an.** 
d2f0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
d300: 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e  T error.  We can
d310: 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72  not allow two or
d320: 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a   more BtShared.*
d330: 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  * objects in the
d340: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
d350: 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20  onnection since 
d360: 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65  doing so will le
d370: 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d  ad.** to problem
d380: 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a  s with locking..
d390: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
d3a0: 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74  reeOpen(.  const
d3b0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
d3c0: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
d3d0: 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
d3e0: 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
d3f0: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
d400: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
d410: 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
d420: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
d430: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
d440: 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
d450: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
d460: 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
d470: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
d480: 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
d490: 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
d4a0: 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
d4b0: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
d4c0: 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
d4d0: 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
d4e0: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
d4f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
d500: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
d510: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74      /* The VFS t
d520: 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
d530: 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  tree */.  BtShar
d540: 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
d550: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
d560: 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65  ed part of btree
d570: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
d580: 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20  Btree *p;       
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d5a0: 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75  * Handle to retu
d5b0: 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rn */.  sqlite3_
d5c0: 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e  mutex *mutexOpen
d5d0: 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e   = 0;  /* Preven
d5e0: 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  ts a race condit
d5f0: 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33  ion. Ticket #353
d600: 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  7 */.  int rc = 
d610: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
d620: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
d630: 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66  code from this f
d640: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  unction */.  u8 
d650: 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20  nReserve;       
d660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
d670: 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70  yte of unused sp
d680: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
d690: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
d6a0: 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30  har zDbHeader[10
d6b0: 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  0];  /* Database
d6c0: 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20   header content 
d6d0: 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  */..  /* Set the
d6e0: 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64   variable isMemd
d6f0: 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e  b to true for an
d700: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
d710: 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61  ase, or .  ** fa
d720: 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62  lse for a file-b
d730: 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 20 54  ased database. T
d740: 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e  his symbol is on
d750: 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 0a 20  ly required if. 
d760: 20 2a 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68   ** either of th
d770: 65 20 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72  e shared-data or
d780: 20 61 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74   autovacuum feat
d790: 75 72 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65  ures are compile
d7a0: 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  d .  ** into the
d7b0: 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23   library..  */.#
d7c0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
d7d0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
d7e0: 41 43 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65  ACHE) || !define
d7f0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d(SQLITE_OMIT_AU
d800: 54 4f 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64  TOVACUUM).  #ifd
d810: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
d820: 45 4d 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73  EMORYDB.    cons
d830: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
d840: 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63  0;.  #else.    c
d850: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
d860: 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20   = zFilename && 
d870: 21 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d  !strcmp(zFilenam
d880: 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a  e, ":memory:");.
d890: 20 20 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a    #endif.#endif.
d8a0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
d8b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d8c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d8d0: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  (db->mutex) );..
d8e0: 20 20 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66    pVfs = db->pVf
d8f0: 73 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  s;.  p = sqlite3
d900: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
d910: 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
d920: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
d930: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
d940: 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
d950: 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
d960: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66   p->db = db;.#if
d970: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d980: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
d990: 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d  p->lock.pBtree =
d9a0: 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54   p;.  p->lock.iT
d9b0: 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  able = 1;.#endif
d9c0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
d9d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
d9e0: 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
d9f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
da00: 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
da10: 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
da20: 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
da30: 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
da40: 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
da50: 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
da60: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
da70: 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
da80: 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
da90: 20 69 73 4d 65 6d 64 62 3d 3d 30 20 26 26 20 7a   isMemdb==0 && z
daa0: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
dab0: 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
dac0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
dad0: 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61  lConfig.sharedCa
dae0: 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20  cheEnabled ){.  
daf0: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
db00: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
db10: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
db20: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
db30: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
db40: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
db50: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
db60: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
db70: 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d  Shared;.      p-
db80: 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
db90: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
dba0: 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43  = SQLITE_SharedC
dbb0: 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66 28 20  ache;.      if( 
dbc0: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
dbd0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
dbe0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
dbf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dc00: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
dc10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46        sqlite3OsF
dc20: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
dc30: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75  , zFilename, nFu
dc40: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
dc50: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
dc60: 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71    mutexOpen = sq
dc70: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
dc80: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
dc90: 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20  TIC_OPEN);.     
dca0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
dcb0: 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b  nter(mutexOpen);
dcc0: 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
dcd0: 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
dce0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
dcf0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
dd00: 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  R);.      sqlite
dd10: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
dd20: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
dd30: 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c    for(pBt=GLOBAL
dd40: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
dd50: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
dd60: 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74  t); pBt; pBt=pBt
dd70: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
dd80: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
dd90: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Ref>0 );.       
dda0: 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a   if( 0==strcmp(z
ddb0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71  FullPathname, sq
ddc0: 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
ddd0: 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  me(pBt->pPager))
dde0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ddf0: 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
de00: 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72  rVfs(pBt->pPager
de10: 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20  )==pVfs ){.     
de20: 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
de30: 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d          for(iDb=
de40: 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d  db->nDb-1; iDb>=
de50: 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20  0; iDb--){.     
de60: 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45         Btree *pE
de70: 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44  xisting = db->aD
de80: 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
de90: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69          if( pExi
dea0: 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69  sting && pExisti
deb0: 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a  ng->pBt==pBt ){.
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
ded0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
dee0: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
df00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
df10: 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
df20: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
df30: 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
df40: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
df50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
df60: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
df70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
df80: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
df90: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
dfa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dfb0: 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
dfc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
dfd0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
dfe0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
dff0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e000: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e010: 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
e020: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
e030: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
e040: 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
e050: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
e060: 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
e070: 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
e080: 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
e090: 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
e0a0: 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
e0b0: 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
e0c0: 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
e0d0: 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
e0e0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
e0f0: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
e100: 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
e110: 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
e120: 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
e130: 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
e140: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
e150: 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
e160: 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
e170: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
e180: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
e190: 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
e1a0: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
e1b0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
e1c0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
e1d0: 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
e1e0: 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
e1f0: 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
e200: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
e210: 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
e220: 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
e230: 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
e240: 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
e250: 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
e260: 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
e270: 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
e280: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
e290: 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
e2a0: 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d   || sizeof(i64)=
e2b0: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
e2c0: 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38  ( sizeof(u64)==8
e2d0: 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d   || sizeof(u64)=
e2e0: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
e2f0: 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34  ( sizeof(u32)==4
e300: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e310: 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
e320: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
e330: 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b  zeof(Pgno)==4 );
e340: 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71  .  .    pBt = sq
e350: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
e360: 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b   sizeof(*pBt) );
e370: 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20  .    if( pBt==0 
e380: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
e390: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
e3a0: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
e3b0: 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
e3c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
e3d0: 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
e3e0: 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
e3f0: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67  EXTRA_SIZE, flag
e420: 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  s, vfsFlags);.  
e430: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e440: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
e450: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
e460: 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74  adFileheader(pBt
e470: 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28  ->pPager,sizeof(
e480: 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65  zDbHeader),zDbHe
e490: 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ader);.    }.   
e4a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e4b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
e4c0: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
e4d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
e4e0: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c  db = db;.    sql
e4f0: 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
e500: 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61  handler(pBt->pPa
e510: 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65  ger, btreeInvoke
e520: 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74  BusyHandler, pBt
e530: 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20  );.    p->pBt = 
e540: 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69  pBt;.  .    sqli
e550: 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69  te3PagerSetReini
e560: 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ter(pBt->pPager,
e570: 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20   pageReinit);.  
e580: 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
e590: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   0;.    pBt->pPa
e5a0: 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ge1 = 0;.    pBt
e5b0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c  ->readOnly = sql
e5c0: 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
e5d0: 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29  nly(pBt->pPager)
e5e0: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
e5f0: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
e600: 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a  zDbHeader[16]);.
e610: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67      if( pBt->pag
e620: 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
e630: 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
e640: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
e650: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42           || ((pB
e660: 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70  t->pageSize-1)&p
e670: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30  Bt->pageSize)!=0
e680: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
e690: 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66  ageSize = 0;.#if
e6a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e6b0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
e6c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69    /* If the magi
e6d0: 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
e6e0: 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e  " will create an
e6f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
e700: 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ase, then.      
e710: 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74  ** leave the aut
e720: 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20  oVacuum mode at 
e730: 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76  0 (do not auto-v
e740: 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a  acuum), even if.
e750: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
e760: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
e770: 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74  UM is true. On t
e780: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
e790: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
e7a0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
e7b0: 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64  has been defined
e7c0: 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a  , then ":memory:
e7d0: 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20  " is just a.    
e7e0: 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c    ** regular fil
e7f0: 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e-name. In this 
e800: 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61  case the auto-va
e810: 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20  cuum applies as 
e820: 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20  per normal..    
e830: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a    */.      if( z
e840: 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d  Filename && !isM
e850: 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
e860: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
e870: 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
e880: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31  T_AUTOVACUUM ? 1
e890: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70   : 0);.        p
e8a0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
e8b0: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
e8c0: 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f  _AUTOVACUUM==2 ?
e8d0: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d   1 : 0);.      }
e8e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52  .#endif.      nR
e8f0: 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20  eserve = 0;.    
e900: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65  }else{.      nRe
e910: 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65  serve = zDbHeade
e920: 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74  r[20];.      pBt
e930: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
e940: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
e950: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
e960: 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61  UUM.      pBt->a
e970: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
e980: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
e990: 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
e9a0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63  ;.      pBt->inc
e9b0: 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
e9c0: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
e9d0: 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
e9e0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
e9f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
ea00: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
ea10: 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
ea20: 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
ea30: 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rve);.    if( rc
ea40: 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70   ) goto btree_op
ea50: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d  en_out;.    pBt-
ea60: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
ea70: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
ea80: 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
ea90: 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69  rt( (pBt->pageSi
eaa0: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f  ze & 7)==0 );  /
eab0: 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
eac0: 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a  nt of pageSize *
ead0: 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e  /.   .#if !defin
eae0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
eaf0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
eb00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
eb10: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20  OMIT_DISKIO).   
eb20: 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
eb30: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
eb40: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
eb50: 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68  st sharable BtSh
eb60: 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  areds..    */.  
eb70: 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
eb80: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
eb90: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
eba0: 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74  hared;.      pBt
ebb0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
ebc0: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
ebd0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
ebe0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
ebf0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
ec00: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
ec10: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71  THREADSAFE && sq
ec20: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
ec30: 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
ec40: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74          pBt->mut
ec50: 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
ec60: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
ec70: 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
ec80: 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65     if( pBt->mute
ec90: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
eca0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
ecb0: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64  MEM;.          d
ecc0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ecd0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 0;.          g
ece0: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
ecf0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
ed00: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
ed10: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
ed20: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
ed30: 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
ed40: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
ed50: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
ed60: 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
ed70: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
ed80: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
ed90: 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
eda0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
edb0: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
edc0: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
edd0: 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
ede0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
edf0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
ee00: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
ee10: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
ee20: 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
ee30: 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
ee40: 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
ee50: 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
ee60: 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
ee70: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
ee80: 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
ee90: 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
eea0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
eeb0: 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
eec0: 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
eed0: 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
eee0: 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
eef0: 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
ef00: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
ef10: 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
ef20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
ef30: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
ef40: 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
ef50: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
ef60: 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
ef70: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
ef80: 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
ef90: 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
efa0: 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
efb0: 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62   if( p->pBt<pSib
efc0: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
efd0: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
efe0: 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
eff0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
f000: 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
f010: 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
f020: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f030: 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
f040: 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78  xt && pSib->pNex
f050: 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b  t->pBt<p->pBt ){
f060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
f070: 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
f080: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
f090: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
f0a0: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
f0b0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
f0c0: 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
f0d0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
f0e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f0f0: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
f100: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
f110: 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
f120: 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
f130: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
f140: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
f150: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
f160: 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
f170: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
f180: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f190: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
f1a0: 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
f1b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f1c0: 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
f1d0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  >pPager);.    }.
f1e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
f1f0: 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
f200: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
f210: 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
f220: 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65  }.  if( mutexOpe
f230: 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
f240: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f250: 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29  eld(mutexOpen) )
f260: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
f270: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
f280: 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pen);.  }.  retu
f290: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f2a0: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74  Decrement the Bt
f2b0: 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
f2c0: 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65  ter.  When it re
f2d0: 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72  aches zero,.** r
f2e0: 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72  emove the BtShar
f2f0: 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ed structure fro
f300: 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  m the sharing li
f310: 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  st.  Return.** t
f320: 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61  rue if the BtSha
f330: 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
f340: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e   reaches zero an
f350: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73  d return.** fals
f360: 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c  e if it is still
f370: 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74   positive..*/.st
f380: 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46  atic int removeF
f390: 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42  romSharingList(B
f3a0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23  tShared *pBt){.#
f3b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f3c0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
f3d0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
f3e0: 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68  *pMaster;.  BtSh
f3f0: 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69  ared *pList;.  i
f400: 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a  nt removed = 0;.
f410: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f420: 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
f430: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
f440: 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    pMaster = sqli
f450: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
f460: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
f470: 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c  C_MASTER);.  sql
f480: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
f490: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
f4a0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
f4b0: 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
f4c0: 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
f4d0: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
f4e0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
f4f0: 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
f500: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
f510: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
f520: 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
f530: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
f540: 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
f550: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
f560: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
f570: 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
f580: 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
f590: 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
f5a0: 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
f5b0: 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
f5c0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
f5d0: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
f5e0: 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
f5f0: 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
f600: 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
f610: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f620: 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
f630: 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
f640: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
f650: 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
f660: 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
f670: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
f680: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f690: 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
f6a0: 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
f6b0: 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
f6c0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
f6d0: 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
f6e0: 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
f6f0: 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
f700: 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
f710: 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a  ZE(pBt) bytes..*
f720: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
f730: 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
f740: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
f750: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70    if( !pBt->pTmp
f760: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
f770: 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
f780: 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
f790: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
f7a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
f7b0: 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d  ree the pBt->pTm
f7c0: 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f  pSpace allocatio
f7d0: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
f7e0: 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42   freeTempSpace(B
f7f0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
f800: 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
f810: 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
f820: 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  );.  pBt->pTmpSp
f830: 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ace = 0;.}../*.*
f840: 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
f850: 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
f860: 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
f870: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
f880: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
f890: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
f8a0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
f8b0: 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
f8c0: 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  Cur;..  /* Close
f8d0: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
f8e0: 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
f8f0: 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  dle.  */.  asser
f900: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
f910: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
f920: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
f930: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
f940: 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75   pCur = pBt->pCu
f950: 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  rsor;.  while( p
f960: 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72  Cur ){.    BtCur
f970: 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72  sor *pTmp = pCur
f980: 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75  ;.    pCur = pCu
f990: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  r->pNext;.    if
f9a0: 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d  ( pTmp->pBtree==
f9b0: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
f9c0: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
f9d0: 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a  or(pTmp);.    }.
f9e0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61    }..  /* Rollba
f9f0: 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72  ck any active tr
fa00: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72  ansaction and fr
fa10: 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74  ee the handle st
fa20: 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
fa30: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
fa40: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29  3BtreeRollback()
fa50: 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65   drops any table
fa60: 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20  -locks held by. 
fa70: 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   ** this handle.
fa80: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
fa90: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  treeRollback(p);
faa0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
fab0: 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  eave(p);..  /* I
fac0: 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
fad0: 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
fae0: 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
faf0: 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
fb00: 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
fb10: 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
fb20: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
fb30: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
fb40: 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
fb50: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
fb60: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
fb70: 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
fb80: 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30   && p->locked==0
fb90: 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   );.  if( !p->sh
fba0: 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65  arable || remove
fbb0: 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
fbc0: 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
fbd0: 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e  he pBt is no lon
fbe0: 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69  ger on the shari
fbf0: 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63  ng list, so we c
fc00: 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a  an access.    **
fc10: 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69   it without havi
fc20: 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ng to hold the m
fc30: 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  utex..    **.   
fc40: 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e   ** Clean out an
fc50: 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53  d delete the BtS
fc60: 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20  hared object..  
fc70: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
fc80: 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
fc90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
fca0: 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
fcb0: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42  ger);.    if( pB
fcc0: 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26  t->xFreeSchema &
fcd0: 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29  & pBt->pSchema )
fce0: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72  {.      pBt->xFr
fcf0: 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53  eeSchema(pBt->pS
fd00: 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20  chema);.    }.  
fd10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
fd20: 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
fd30: 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
fd40: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
fd50: 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
fd60: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fd70: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
fd80: 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
fd90: 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
fda0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
fdb0: 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
fdc0: 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
fdd0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
fde0: 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
fdf0: 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
fe00: 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
fe10: 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
fe20: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
fe30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fe40: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
fe50: 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
fe60: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
fe70: 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ages allowed in 
fe80: 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
fe90: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
fea0: 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
feb0: 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  es is set to the
fec0: 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c   absolute.** val
fed0: 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49  ue of mxPage.  I
fee0: 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
fef0: 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20  tive, the pager 
ff00: 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20  will.** operate 
ff10: 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d  asynchronously -
ff20: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f   it will not sto
ff30: 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73  p to do fsync()s
ff40: 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61  .** to insure da
ff50: 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
ff60: 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
ff70: 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74  e before.** cont
ff80: 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63  inuing.  Transac
ff90: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b  tions still work
ffa0: 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   if synchronous 
ffb0: 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74  is off,.** and t
ffc0: 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
ffd0: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
ffe0: 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a  if this program.
fff0: 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74  ** crashes.  But
10000 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
10010 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
10020 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   or there is.** 
10030 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
10040 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e  failure when syn
10050 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
10060 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
10070 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69   could be left i
10080 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
10090 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61  t and unrecovera
100a0 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79  ble state..** Sy
100b0 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20  nchronous is on 
100c0 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61  by default so da
100d0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
100e0 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d  n is not.** norm
100f0 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f  ally a worry..*/
10100 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
10110 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
10120 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
10130 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
10140 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
10150 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10160 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
10170 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
10180 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
10190 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
101a0 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
101b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
101c0 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
101d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
101e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
101f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
10200 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
10210 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
10220 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
10230 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
10240 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
10250 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
10260 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
10270 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
10280 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
10290 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
102a0 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
102b0 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
102c0 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
102d0 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
102e0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
102f0 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
10300 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
10310 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
10320 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
10330 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
10340 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
10350 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
10360 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
10370 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
10380 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
10390 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
103a0 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
103b0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
103c0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
103d0 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
103e0 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65  BtreeSetSafetyLe
103f0 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  vel(Btree *p, in
10400 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c  t level, int ful
10410 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72  lSync){.  BtShar
10420 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
10430 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
10440 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
10450 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
10460 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
10470 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
10480 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
10490 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  evel(pBt->pPager
104a0 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e  , level, fullSyn
104b0 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  c);.  sqlite3Btr
104c0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
104d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
104e0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
104f0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
10500 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69  he given btree i
10510 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20  s set to safety 
10520 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68  level 1.  In oth
10530 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74  er.** words, ret
10540 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73  urn TRUE if no s
10550 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20  ync() occurs on 
10560 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a  the disk files..
10570 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10580 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
10590 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
105a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
105b0 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pBt;.  int rc;. 
105c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
105d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
105e0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20  b->mutex) );  . 
105f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
10600 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
10610 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
10620 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ger );.  rc = sq
10630 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
10640 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
10650 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
10660 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
10670 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  rc;.}..#if !defi
10680 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
10690 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
106a0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
106b0 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f  E_OMIT_VACUUM)./
106c0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
106d0 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
106e0 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
106f0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
10700 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
10710 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
10720 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
10730 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
10740 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
10750 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
10760 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
10770 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
10780 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
10790 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
107a0 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
107b0 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
107c0 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
107d0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
107e0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
107f0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
10800 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
10810 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
10820 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
10830 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
10840 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
10850 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
10860 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
10870 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
10880 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
10890 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
108a0 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
108b0 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
108c0 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
108d0 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
108e0 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
108f0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
10900 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
10910 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
10920 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
10930 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
10940 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
10950 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
10960 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
10970 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
10980 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
10990 20 74 68 65 20 70 61 67 65 53 69 7a 65 46 69 78   the pageSizeFix
109a0 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ed flag is set s
109b0 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
109c0 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
109d0 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
109e0 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
109f0 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
10a00 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
10a10 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
10a20 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
10a30 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
10a40 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
10a50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
10a60 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
10a70 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
10a80 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
10a90 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
10aa0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
10ab0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
10ac0 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
10ad0 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
10ae0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
10af0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10b00 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
10b10 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
10b20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
10b30 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
10b40 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
10b50 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
10b60 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
10b70 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
10b80 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
10b90 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
10ba0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
10bb0 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
10bc0 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
10bd0 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
10be0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
10bf0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
10c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
10c10 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42  t->pPage1 && !pB
10c20 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
10c30 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
10c40 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b  = (u16)pageSize;
10c50 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
10c60 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  ce(pBt);.  }.  r
10c70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10c80 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
10c90 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
10ca0 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
10cb0 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c  e);.  pBt->usabl
10cc0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
10cd0 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65  eSize - (u16)nRe
10ce0 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69  serve;.  if( iFi
10cf0 78 20 29 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  x ) pBt->pageSiz
10d00 65 46 69 78 65 64 20 3d 20 31 3b 0a 20 20 73 71  eFixed = 1;.  sq
10d10 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10d20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
10d30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10d40 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
10d50 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  efined page size
10d60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
10d70 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
10d80 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
10d90 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
10da0 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Size;.}../*.** R
10db0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
10dc0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
10dd0 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
10de0 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
10df0 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61  .** are intentua
10e00 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e  lly left unused.
10e10 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72    This is the "r
10e20 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74  eserved" space t
10e30 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69  hat is.** someti
10e40 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65  mes used by exte
10e50 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  nsions..*/.int s
10e60 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
10e70 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b  serve(Btree *p){
10e80 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
10e90 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
10ea0 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  ;.  n = p->pBt->
10eb0 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42  pageSize - p->pB
10ec0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
10ed0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
10ee0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
10ef0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
10f00 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
10f10 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74   count for a dat
10f20 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20  abase if mxPage 
10f30 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20  is positive..** 
10f40 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
10f50 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ade if mxPage is
10f60 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a   0 or negative..
10f70 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
10f80 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78   the value of mx
10f90 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
10fa0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
10fb0 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
10fc0 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
10fd0 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  ount(Btree *p, i
10fe0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
10ff0 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
11000 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
11010 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
11020 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70  axPageCount(p->p
11030 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
11040 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
11050 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
11060 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69  eturn n;.}.#endi
11070 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
11080 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
11090 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
110a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
110b0 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a  _VACUUM) */../*.
110c0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
110d0 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
110e0 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
110f0 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
11100 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
11110 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
11120 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
11130 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
11140 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
11150 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
11160 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
11170 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
11180 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
11190 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
111a0 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
111b0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
111c0 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
111d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
111e0 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
111f0 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
11200 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
11210 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
11220 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
11230 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
11240 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
11250 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
11260 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11270 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28  _OK;.  u8 av = (
11280 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a  u8)autoVacuum;..
11290 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
112a0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
112b0 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
112c0 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70   && (av ?1:0)!=p
112d0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
112e0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
112f0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
11300 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
11310 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31  toVacuum = av ?1
11320 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  :0;.    pBt->inc
11330 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20  rVacuum = av==2 
11340 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ?1:0;.  }.  sqli
11350 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11360 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
11370 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
11380 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
11390 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
113a0 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
113b0 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
113c0 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
113d0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
113e0 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
113f0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
11400 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
11410 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
11420 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
11430 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
11440 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
11450 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
11460 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
11470 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
11480 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
11490 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
114a0 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
114b0 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
114c0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
114d0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
114e0 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
114f0 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
11500 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
11510 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
11520 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
11530 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  .}.../*.** Get a
11540 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
11550 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
11560 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
11570 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
11580 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
11590 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
115a0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
115b0 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
115c0 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
115d0 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
115e0 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
115f0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
11600 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
11610 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
11620 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
11630 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
11640 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
11650 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
11660 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
11670 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
11680 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
11690 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
116a0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
116b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
116c0 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
116d0 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73  int nPage;..  as
116e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
116f0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11700 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
11710 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
11720 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65   );.  rc = btree
11730 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
11740 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
11750 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11760 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
11770 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
11780 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
11790 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
117a0 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
117b0 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
117c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
117d0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
117e0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
117f0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
11800 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
11810 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11820 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
11830 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65  _failed;.  }else
11840 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
11850 20 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65      int pageSize
11860 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65  ;.    int usable
11870 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
11880 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
11890 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
118a0 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
118b0 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
118c0 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
118d0 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
118e0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
118f0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
11900 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
11910 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >1 ){.      pBt-
11920 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
11930 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
11940 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
11950 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
11960 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
11970 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
11980 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61  mum embedded fra
11990 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78  ction must be ex
119a0 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20  actly 25%.  And 
119b0 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20  the minimum.    
119c0 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61 63  ** embedded frac
119d0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e  tion must be 12.
119e0 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66  5% for both leaf
119f0 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65  -data and non-le
11a00 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20  af-data..    ** 
11a10 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
11a20 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73  ign allowed thes
11a30 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72  e amounts to var
11a40 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20  y, but as of.   
11a50 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e   ** version 3.6.
11a60 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68  0, we require th
11a70 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a  em to be fixed..
11a80 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d      */.    if( m
11a90 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d  emcmp(&page1[21]
11aa0 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22  , "\100\040\040"
11ab0 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,3)!=0 ){.      
11ac0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
11ad0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
11ae0 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74    pageSize = get
11af0 32 62 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d  2byte(&page1[16]
11b00 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  );.    if( ((pag
11b10 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
11b20 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a  e)!=0 || pageSiz
11b30 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20 20 20  e<512 ||.       
11b40 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47   (SQLITE_MAX_PAG
11b50 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26 26 20  E_SIZE<32768 && 
11b60 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
11b70 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20  MAX_PAGE_SIZE). 
11b80 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
11b90 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
11ba0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ed;.    }.    as
11bb0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
11bc0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75  & 7)==0 );.    u
11bd0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65  sableSize = page
11be0 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d  Size - page1[20]
11bf0 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53 69  ;.    if( pageSi
11c00 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze!=pBt->pageSiz
11c10 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66  e ){.      /* Af
11c20 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  ter reading the 
11c30 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
11c40 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d  e database assum
11c50 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a  ing a page size.
11c60 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68        ** of BtSh
11c70 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77  ared.pageSize, w
11c80 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65  e have discovere
11c90 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
11ca0 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  size is.      **
11cb0 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69   actually pageSi
11cc0 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  ze. Unlock the d
11cd0 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70  atabase, leave p
11ce0 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20  Bt->pPage1 at.  
11cf0 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20      ** zero and 
11d00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11d10 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
11d20 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  l call this func
11d30 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67  tion.      ** ag
11d40 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72  ain with the cor
11d50 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a  rect page-size..
11d60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
11d70 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
11d80 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75  1);.      pBt->u
11d90 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36  sableSize = (u16
11da0 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20  )usableSize;.   
11db0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
11dc0 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65   = (u16)pageSize
11dd0 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
11de0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
11df0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
11e00 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
11e10 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
11e20 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
11e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
11e50 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
11e60 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ze);.      if( r
11e70 63 20 29 20 67 6f 74 6f 20 70 61 67 65 31 5f 69  c ) goto page1_i
11e80 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
11e90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11ea0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
11eb0 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
11ec0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
11ed0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
11ee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
11ef0 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  >pageSize = (u16
11f00 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70  )pageSize;.    p
11f10 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
11f20 20 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65   (u16)usableSize
11f30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
11f40 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
11f50 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
11f60 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
11f70 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
11f80 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
11f90 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
11fa0 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
11fb0 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
11fc0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
11fd0 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
11fe0 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
11ff0 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
12000 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
12010 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
12020 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
12030 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
12040 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
12050 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
12060 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
12070 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
12080 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
12090 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
120a0 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
120b0 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
120c0 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
120d0 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
120e0 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
120f0 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
12100 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
12110 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
12120 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
12130 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
12140 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
12150 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
12160 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
12170 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
12180 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
12190 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72  poiner, a header
121a0 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
121b0 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
121c0 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
121d0 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
121e0 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
121f0 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
12200 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
12210 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
12220 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >maxLocal = (pBt
12230 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
12240 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *64/255 - 23;.  
12250 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
12260 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
12270 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
12280 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
12290 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
122a0 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e  ze - 35;.  pBt->
122b0 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e  minLeaf = (pBt->
122c0 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
122d0 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73  2/255 - 23;.  as
122e0 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
122f0 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
12300 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
12310 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
12320 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e  pPage1;.  return
12330 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
12340 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a  e1_init_failed:.
12350 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
12360 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
12370 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
12380 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12390 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
123a0 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
123b0 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
123c0 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
123d0 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
123e0 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
123f0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
12400 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
12410 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
12420 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
12430 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
12440 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
12450 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
12460 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
12470 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
12480 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
12490 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
124a0 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
124b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
124c0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
124d0 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
124e0 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
124f0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
12500 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12510 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
12520 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
12530 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  t( pBt->pCursor=
12540 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
12550 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
12560 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
12570 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
12580 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
12590 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
125a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
125b0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
125c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
125d0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
125e0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
125f0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
12600 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  t( pBt->pPage1->
12610 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c  aData );.    rel
12620 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50  easePage(pBt->pP
12630 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age1);.    pBt->
12640 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a  pPage1 = 0;.  }.
12650 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
12660 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 62  a new database b
12670 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
12680 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
12690 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f   the.** file..*/
126a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
126b0 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
126c0 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
126d0 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
126e0 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
126f0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
12700 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
12710 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12720 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12730 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
12740 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
12750 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
12760 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
12770 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61  SQLITE_OK || nPa
12780 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ge>0 ){.    retu
12790 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31  rn rc;.  }.  pP1
127a0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
127b0 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
127c0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
127d0 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
127e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
127f0 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
12800 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
12810 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
12820 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
12830 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
12840 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
12850 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
12860 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
12870 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
12880 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65  a[16], pBt->page
12890 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38  Size);.  data[18
128a0 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
128b0 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
128c0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
128d0 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
128e0 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
128f0 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
12900 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
12910 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
12920 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
12930 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
12940 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
12950 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
12960 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
12970 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
12980 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
12990 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
129a0 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
129b0 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
129c0 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69  );.  pBt->pageSi
129d0 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66  zeFixed = 1;.#if
129e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
129f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
12a00 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
12a10 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
12a20 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
12a30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
12a40 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
12a50 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
12a60 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
12a70 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
12a80 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
12a90 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
12aa0 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
12ab0 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
12ac0 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  m);.#endif.  ret
12ad0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12ae0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
12af0 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
12b00 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
12b10 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
12b20 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
12b30 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12b40 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
12b50 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
12b60 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
12b70 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
12b80 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
12b90 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
12ba0 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
12bb0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
12bc0 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
12bd0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
12be0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
12bf0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
12c00 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
12c10 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
12c20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
12c30 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
12c40 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
12c50 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
12c60 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
12c70 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
12c80 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
12c90 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
12ca0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
12cb0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
12cc0 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
12cd0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
12ce0 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
12cf0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
12d00 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
12d10 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
12d20 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
12d30 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
12d40 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
12d50 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
12d60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
12d70 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
12d80 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
12d90 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
12da0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
12db0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
12dc0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
12dd0 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
12de0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
12df0 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
12e00 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
12e10 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
12e20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
12e30 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
12e40 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
12e50 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
12e60 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
12e70 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
12e80 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
12e90 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
12ea0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
12eb0 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
12ec0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
12ed0 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
12ee0 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
12ef0 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
12f00 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
12f10 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
12f20 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
12f30 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
12f40 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
12f50 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
12f60 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
12f70 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
12f80 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
12f90 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
12fa0 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
12fb0 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
12fc0 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
12fd0 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
12fe0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
12ff0 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
13000 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
13010 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
13020 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
13030 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
13040 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
13050 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
13060 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
13070 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
13080 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
13090 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
130a0 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
130b0 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
130c0 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
130d0 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
130e0 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
130f0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
13100 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
13110 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
13120 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
13130 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
13140 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
13150 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
13160 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
13170 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
13180 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
13190 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
131a0 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71  nt wrflag){.  sq
131b0 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20  lite3 *pBlock = 
131c0 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  0;.  BtShared *p
131d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
131e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
131f0 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K;..  sqlite3Btr
13200 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
13210 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
13220 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
13230 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
13240 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
13250 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
13260 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
13270 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
13280 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
13290 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
132a0 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
132b0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
132c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
132d0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
132e0 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
132f0 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
13300 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
13310 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
13320 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
13330 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
13340 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
13350 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
13360 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
13370 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
13380 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
13390 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
133a0 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
133b0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
133c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
133d0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
133e0 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
133f0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
13400 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
13410 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
13420 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
13430 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
13440 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
13450 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
13460 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
13470 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
13480 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
13490 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KED..  */.  if( 
134a0 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
134b0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
134c0 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70  RANS_WRITE) || p
134d0 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b  Bt->isPending ){
134e0 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42  .    pBlock = pB
134f0 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
13500 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c    }else if( wrfl
13510 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f  ag>1 ){.    BtLo
13520 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66  ck *pIter;.    f
13530 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
13540 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
13550 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
13560 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
13570 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
13580 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20         pBlock = 
13590 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64  pIter->pBtree->d
135a0 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  b;.        break
135b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
135c0 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b    }.  if( pBlock
135d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
135e0 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
135f0 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
13600 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13610 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
13620 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  CHE;.    goto tr
13630 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23  ans_begun;.  }.#
13640 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20  endif..  /* Any 
13650 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61  read-only or rea
13660 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d-write transact
13670 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65  ion implies a re
13680 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a  ad-lock on .  **
13690 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73   page 1. So if s
136a0 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  ome other shared
136b0 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c  -cache client al
136c0 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74  ready has a writ
136d0 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  e-lock .  ** on 
136e0 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e  page 1, the tran
136f0 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  saction cannot b
13700 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 69  e opened. */.  i
13710 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
13720 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
13730 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
13740 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
13750 41 44 5f 4c 4f 43 4b 29 29 20 29 7b 0a 20 20 20  AD_LOCK)) ){.   
13760 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
13770 6e 3b 0a 20 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20  n;.  }..  do {. 
13780 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42     /* Call lockB
13790 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74  tree() until eit
137a0 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20  her pBt->pPage1 
137b0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a  is populated or.
137c0 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65      ** lockBtree
137d0 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
137e0 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
137f0 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42  SQLITE_OK. lockB
13800 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61  tree().    ** ma
13810 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
13820 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74  OK but leave pBt
13830 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20  ->pPage1 set to 
13840 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a  0 if after.    *
13850 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31  * reading page 1
13860 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68   it discovers th
13870 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
13880 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
13890 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73   .    ** file is
138a0 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69   not pBt->pageSi
138b0 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ze. In this case
138c0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c   lockBtree() wil
138d0 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20  l update.    ** 
138e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f  pBt->pageSize to
138f0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
13900 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
13910 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  sk..    */.    w
13920 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65  hile( pBt->pPage
13930 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  1==0 && SQLITE_O
13940 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72  K==(rc = lockBtr
13950 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20  ee(pBt)) );..   
13960 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13970 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
13980 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72        if( pBt->r
13990 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
139a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
139b0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
139c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
139d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
139e0 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
139f0 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65  ,wrflag>1,sqlite
13a00 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d  3TempInMemory(p-
13a10 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69  >db));.        i
13a20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13a30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
13a40 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
13a50 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
13a60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
13a70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13a80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
13a90 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
13aa0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
13ab0 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
13ac0 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
13ad0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
13ae0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
13af0 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
13b00 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
13b10 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
13b20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13b30 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
13b40 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
13b50 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
13b60 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
13b70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13b80 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
13b90 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
13ba0 6c 65 20 29 7b 0a 09 61 73 73 65 72 74 28 20 70  le ){..assert( p
13bb0 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70  ->lock.pBtree==p
13bc0 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62   && p->lock.iTab
13bd0 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  le==1 );.       
13be0 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d   p->lock.eLock =
13bf0 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
13c00 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78      p->lock.pNex
13c10 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a  t = pBt->pLock;.
13c20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f          pBt->pLo
13c30 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20  ck = &p->lock;. 
13c40 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
13c50 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61    }.    p->inTra
13c60 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41  ns = (wrflag?TRA
13c70 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52  NS_WRITE:TRANS_R
13c80 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  EAD);.    if( p-
13c90 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e  >inTrans>pBt->in
13ca0 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
13cb0 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
13cc0 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54  saction = p->inT
13cd0 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rans;.    }.#ifn
13ce0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13cf0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
13d00 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20   if( wrflag ){. 
13d10 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
13d20 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
13d30 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
13d40 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
13d50 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 28  >isExclusive = (
13d60 75 38 29 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20  u8)(wrflag>1);. 
13d70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
13d80 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
13d90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13da0 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
13db0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
13dc0 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
13dd0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
13de0 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
13df0 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  r of.    ** open
13e00 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20   savepoints. If 
13e10 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
13e20 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20  eter is greater 
13e30 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a  than 0 and.    *
13e40 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
13e50 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
13e60 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77   open, then it w
13e70 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65  ill be opened he
13e80 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  re..    */.    r
13e90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
13ea0 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
13eb0 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
13ec0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->nSavepoint);. 
13ed0 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
13ee0 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
13ef0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
13f00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13f10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13f20 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
13f30 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
13f40 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
13f50 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
13f60 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
13f70 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
13f80 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
13f90 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
13fa0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
13fb0 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
13fc0 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
13fd0 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
13fe0 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
13ff0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
14000 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
14010 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
14020 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14040 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
14050 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
14060 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14080 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
14090 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
140a0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
140b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
140d0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
140e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
140f0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69  age->pBt;.  u8 i
14100 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
14110 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
14120 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
14130 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
14140 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
14150 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
14160 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
14170 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
14180 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
14190 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
141a0 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
141b0 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
141c0 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
141d0 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
141e0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
141f0 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
14200 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
14210 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63  age, i);..    rc
14220 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
14230 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
14240 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
14250 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14260 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
14270 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
14280 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
14290 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
142a0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
142b0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
142c0 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ll);.      rc = 
142d0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
142e0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
142f0 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
14300 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
14310 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65  ITE_OK ) goto se
14320 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
14330 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
14340 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
14350 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
14360 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
14370 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
14380 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
14390 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d  et+8]);.    rc =
143a0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
143b0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
143c0 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a  P_BTREE, pgno);.
143d0 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
143e0 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
143f0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
14400 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
14410 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14420 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
14430 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ge is a pointer 
14440 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20  to page iFrom.  
14450 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
14460 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ter so.** that i
14470 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e  t points to iTo.
14480 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
14490 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
144a0 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
144b0 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64  o.** be modified
144c0 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  , as  follows:.*
144d0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
144e0 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
144f0 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
14500 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
14510 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14530 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
14540 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
14550 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
14560 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
14570 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
14580 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
14590 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
145a0 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
145b0 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
145c0 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
145d0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
145e0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
145f0 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
14600 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
14610 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
14620 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
14630 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
14640 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
14650 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
14660 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
14670 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
14680 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
14690 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
146a0 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
146b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
146c0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
146d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
146e0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
146f0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
14700 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
14710 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
14720 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
14730 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
14740 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
14750 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
14760 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
14770 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
14780 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
14790 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
147a0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
147b0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
147c0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
147d0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
147e0 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a  e->aData, iTo);.
147f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
14800 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
14810 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20  ge->isInit;.    
14820 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
14830 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65  Cell;..    btree
14840 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
14850 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  .    nCell = pPa
14860 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  ge->nCell;..    
14870 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
14880 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38  ; i++){.      u8
14890 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
148a0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
148b0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
148c0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
148d0 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  ){.        CellI
148e0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
148f0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
14900 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
14910 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
14920 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
14930 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
14940 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74    if( iFrom==get
14950 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
14960 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b  o.iOverflow]) ){
14970 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
14980 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
14990 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54  o.iOverflow], iT
149a0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
149b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
149c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
149d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
149e0 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
149f0 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
14a00 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
14a10 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
14a20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
14a30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14a40 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
14a50 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
14a60 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
14a70 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
14a80 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
14a90 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
14aa0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
14ab0 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
14ac0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
14ad0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
14ae0 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
14af0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
14b00 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
14b10 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
14b20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iTo);.    }..   
14b30 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
14b40 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d   isInitOrig;.  }
14b50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14b60 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
14b70 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
14b80 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
14b90 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
14ba0 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
14bb0 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
14bc0 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
14bd0 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
14be0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14bf0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
14c00 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
14c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
14c20 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
14c30 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
14c40 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
14c50 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
14c60 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
14c70 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
14c80 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
14c90 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
14ca0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
14cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
14cc0 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
14cd0 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
14ce0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
14cf0 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20  FreePage,       
14d00 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
14d10 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
14d20 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  ge to */.  int i
14d30 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d  sCommit.){.  Mem
14d40 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
14d50 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
14d60 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
14d70 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
14d80 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
14d90 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
14da0 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
14db0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
14dc0 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
14dd0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
14de0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
14df0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
14e00 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
14e10 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
14e20 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
14e30 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
14e40 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
14e50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
14e60 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
14e70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
14e80 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
14e90 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
14ea0 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
14eb0 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
14ec0 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
14ed0 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
14ee0 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
14ef0 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
14f00 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
14f10 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
14f20 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
14f30 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
14f40 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
14f50 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
14f60 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
14f70 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
14f80 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
14f90 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
14fa0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14fb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
14fc0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
14fd0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
14fe0 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
14ff0 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
15000 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
15010 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
15020 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
15030 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
15040 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
15050 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
15060 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
15070 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
15080 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
15090 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
150a0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
150b0 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
150c0 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
150d0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
150e0 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
150f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
15100 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
15110 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
15120 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
15130 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
15140 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
15150 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
15160 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
15170 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
15180 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
15190 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
151a0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
151b0 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
151c0 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
151d0 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
151e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
151f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
15200 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
15210 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
15220 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
15230 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
15240 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
15250 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
15260 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
15270 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
15280 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
15290 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20  iFreePage);.    
152a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
152b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
152c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
152d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
152e0 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
152f0 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
15300 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
15310 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
15320 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
15330 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
15340 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
15350 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
15360 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
15370 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
15380 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
15390 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
153a0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
153b0 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
153c0 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
153d0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
153e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
153f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15400 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
15410 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
15420 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
15430 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
15440 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15450 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
15460 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
15470 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
15480 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
15490 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
154a0 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
154b0 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
154c0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
154d0 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
154e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
154f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
15500 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
15510 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
15520 20 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20   iPtrPage);.    
15530 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
15540 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
15550 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
15560 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
15570 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
15580 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
15590 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
155a0 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
155b0 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
155c0 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
155d0 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
155e0 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
155f0 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
15600 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72  successful,.** r
15610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
15620 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
15630 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
15640 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20  therefore no.** 
15650 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67  point in calling
15660 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
15670 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51  gain), return SQ
15680 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
15690 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79   More specificly
156a0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
156b0 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
156c0 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20  rganize the .** 
156d0 64 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74  database so that
156e0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
156f0 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
15700 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69  ntly in use.** i
15710 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75  s no longer in u
15720 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
15730 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20   nFin parameter 
15740 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
15750 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
15760 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20  assumes.** that 
15770 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
15780 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63  keep calling inc
15790 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e  rVacuumStep() un
157a0 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e  til.** it return
157b0 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  s SQLITE_DONE or
157c0 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
157d0 68 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a  hat nFin is the.
157e0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
157f0 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
15800 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69  file will contai
15810 6e 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a  n after this .**
15820 20 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70   process is comp
15830 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lete..*/.static 
15840 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74  int incrVacuumSt
15850 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ep(BtShared *pBt
15860 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e  , Pgno nFin, Pgn
15870 6f 20 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67  o iLastPg){.  Pg
15880 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20  no nFreeList;   
15890 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
158a0 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c  r of pages still
158b0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
158c0 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
158d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
158e0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
158f0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73  ;.  assert( iLas
15900 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69  tPg>nFin );..  i
15910 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
15920 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
15930 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
15940 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
15950 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  t) ){.    int rc
15960 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
15970 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
15980 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
15990 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
159a0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
159b0 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
159c0 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
159d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
159e0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
159f0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
15a00 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
15a10 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
15a20 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
15a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15a40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15a50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
15a60 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
15a70 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
15a80 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
15a90 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
15aa0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
15ab0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
15ac0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e  {.      if( nFin
15ad0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
15ae0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
15af0 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
15b00 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
15b10 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
15b20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e  .        ** if n
15b30 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  Fin is non-zero.
15b40 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
15b50 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
15b60 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
15b70 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
15b80 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
15b90 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
15ba0 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
15bb0 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
15bc0 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
15bd0 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
15be0 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
15bf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
15c00 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
15c10 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
15c20 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
15c30 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
15c40 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
15c50 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
15c60 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20  astPg, 1);.     
15c70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15c80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15c90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
15ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
15cb0 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
15cc0 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
15cd0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
15ce0 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
15cf0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
15d00 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
15d10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15d20 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
15d30 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
15d40 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
15d50 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
15d60 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  ;..      rc = bt
15d70 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
15d80 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50  iLastPg, &pLastP
15d90 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
15da0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15db0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
15dc0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
15dd0 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69      /* If nFin i
15de0 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
15df0 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
15e00 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
15e10 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
15e20 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
15e30 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
15e40 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
15e50 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
15e60 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
15e70 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
15e80 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61   if nFin is grea
15e90 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
15ea0 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
15eb0 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
15ec0 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
15ed0 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
15ee0 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
15ef0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
15f00 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
15f10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f       */.      do
15f20 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
15f30 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
15f40 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
15f50 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
15f60 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
15f70 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ePg, 0, 0);.    
15f80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15f90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15fa0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
15fb0 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20  LastPg);.       
15fc0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15fe0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
15ff0 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ePg);.      }whi
16000 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69  le( nFin!=0 && i
16010 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20  FreePg>nFin );. 
16020 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
16030 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a  eePg<iLastPg );.
16040 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
16050 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
16060 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62  ite(pLastPg->pDb
16070 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
16080 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16090 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
160a0 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
160b0 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
160c0 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
160d0 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20  Pg, nFin!=0);.  
160e0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
160f0 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
16100 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16110 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16120 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16130 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16140 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30  }..  if( nFin==0
16150 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d   ){.    iLastPg-
16160 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c  -;.    while( iL
16170 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
16180 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50  YTE_PAGE(pBt)||P
16190 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
161a0 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20  , iLastPg) ){.  
161b0 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
161c0 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
161d0 50 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  Pg) ){.        M
161e0 65 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20 20 20  emPage *pPg;.   
161f0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 62 74       int rc = bt
16200 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
16210 69 4c 61 73 74 50 67 2c 20 26 70 50 67 2c 20 30  iLastPg, &pPg, 0
16220 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16230 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16240 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16250 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
16260 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16270 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
16280 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
16290 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
162a0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69  (pPg);.        i
162b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
162c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
162d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
162e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
162f0 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
16300 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
16310 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
16320 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61  pBt->pPager, iLa
16330 73 74 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  stPg);.  }.  ret
16340 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16350 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ../*.** A write-
16360 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
16370 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72   be opened befor
16380 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
16390 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70  unction..** It p
163a0 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65  erforms a single
163b0 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f   unit of work to
163c0 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65  wards an increme
163d0 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a  ntal vacuum..**.
163e0 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d  ** If the increm
163f0 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20  ental vacuum is 
16400 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74  finished after t
16410 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
16420 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f   run,.** SQLITE_
16430 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
16440 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66  . If it is not f
16450 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20  inished, but no 
16460 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a  error occurred,.
16470 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
16480 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
16490 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
164a0 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e  ror code. .*/.in
164b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
164c0 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  crVacuum(Btree *
164d0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
164e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
164f0 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
16500 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
16510 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
16520 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
16530 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
16540 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
16550 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
16560 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
16570 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
16580 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
16590 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
165a0 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
165b0 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  (pBt);.    rc = 
165c0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
165d0 42 74 2c 20 30 2c 20 70 61 67 65 72 50 61 67 65  Bt, 0, pagerPage
165e0 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20 20 7d  count(pBt));.  }
165f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16600 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16610 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
16620 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
16630 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
16640 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
16650 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
16660 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
16670 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  ted for an auto-
16680 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e  vacuum database.
16690 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
166a0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
166b0 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69   then *pnTrunc i
166c0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
166d0 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
166e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
166f0 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  e should be trun
16700 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20  cated to during 
16710 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
16720 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65  ss. .** i.e. the
16730 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
16740 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73  en reorganized s
16750 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20  o that only the 
16760 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a  first *pnTrunc.*
16770 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  * pages are in u
16780 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
16790 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  t autoVacuumComm
167a0 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  it(BtShared *pBt
167b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
167c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
167d0 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
167e0 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e  pPager;.  VVA_ON
167f0 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  LY( int nRef = s
16800 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
16810 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  unt(pPager) );..
16820 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16830 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
16840 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e  ->mutex) );.  in
16850 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
16860 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
16870 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74   assert(pBt->aut
16880 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20  oVacuum);.  if( 
16890 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  !pBt->incrVacuum
168a0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69   ){.    Pgno nFi
168b0 6e 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  n;.    Pgno nFre
168c0 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 74 72  e;.    Pgno nPtr
168d0 6d 61 70 3b 0a 20 20 20 20 50 67 6e 6f 20 69 46  map;.    Pgno iF
168e0 72 65 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  ree;.    const i
168f0 6e 74 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70  nt pgsz = pBt->p
16900 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 50 67 6e  ageSize;.    Pgn
16910 6f 20 6e 4f 72 69 67 20 3d 20 70 61 67 65 72 50  o nOrig = pagerP
16920 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 0a  agecount(pBt);..
16930 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
16940 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
16950 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44  ) || nOrig==PEND
16960 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
16970 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  t) ){.      /* I
16980 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
16990 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61  e to create a da
169a0 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68  tabase for which
169b0 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a   the final page.
169c0 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
169d0 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  er a pointer-map
169e0 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e   page or the pen
169f0 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20  ding-byte page. 
16a00 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20  If one.      ** 
16a10 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
16a20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63  this indicates c
16a30 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
16a40 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
16a50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
16a60 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
16a70 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
16a80 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
16a90 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
16aa0 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
16ab0 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
16ac0 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
16ad0 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f 35  +pgsz/5)/(pgsz/5
16ae0 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f  );.    nFin = nO
16af0 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
16b00 74 72 6d 61 70 3b 0a 20 20 20 20 69 66 28 20 6e  trmap;.    if( n
16b10 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
16b20 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
16b30 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
16b40 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
16b50 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20      nFin--;.    
16b60 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  }.    while( PTR
16b70 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
16b80 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50  nFin) || nFin==P
16b90 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
16ba0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
16bb0 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Fin--;.    }.   
16bc0 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20   if( nFin>nOrig 
16bd0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
16be0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20  CORRUPT_BKPT;.. 
16bf0 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72     for(iFree=nOr
16c00 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26  ig; iFree>nFin &
16c10 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
16c20 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20   iFree--){.     
16c30 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
16c40 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
16c50 69 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  iFree);.    }.  
16c60 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
16c70 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51  E_DONE || rc==SQ
16c80 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65  LITE_OK) && nFre
16c90 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
16ca0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
16cb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
16cc0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
16cd0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
16ce0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
16cf0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
16d00 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
16d10 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
16d20 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
16d30 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  36], 0);.      s
16d40 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
16d50 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
16d60 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  ager, nFin);.   
16d70 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
16d80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16d90 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
16da0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
16db0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
16dc0 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74  ert( nRef==sqlit
16dd0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
16de0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
16df0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
16e00 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
16e10 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
16e20 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65  M */.# define se
16e30 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29  tChildPtrmaps(x)
16e40 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
16e50 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
16e60 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
16e70 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
16e80 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
16e90 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
16ea0 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
16eb0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
16ec0 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
16ed0 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
16ee0 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
16ef0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
16f00 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
16f10 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
16f20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
16f30 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
16f40 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
16f50 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
16f60 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
16f70 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
16f80 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
16f90 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
16fa0 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
16fb0 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
16fc0 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
16fd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
16fe0 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
16ff0 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
17000 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
17010 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
17020 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17030 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
17040 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
17050 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
17060 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
17070 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
17080 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
17090 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
170a0 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
170b0 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
170c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
170d0 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
170e0 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
170f0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
17100 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  wo() for the sec
17110 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
17120 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
17130 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
17140 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
17150 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
17160 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
17170 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
17180 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
17190 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
171a0 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
171b0 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
171c0 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
171d0 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
171e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
171f0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
17200 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
17210 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
17220 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
17230 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
17240 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
17250 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
17260 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
17270 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
17280 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
17290 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
172a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
172b0 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
172c0 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
172d0 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
172e0 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
172f0 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
17300 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
17310 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
17320 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
17330 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
17340 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
17350 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
17360 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
17370 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
17380 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
17390 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
173a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
173b0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
173c0 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
173d0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
173e0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
173f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
17400 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
17410 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
17420 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
17430 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
17440 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17450 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17460 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
17470 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
17480 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
17490 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d   rc = autoVacuum
174a0 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
174b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
174c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
174d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
174e0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
174f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
17500 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
17510 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
17520 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
17530 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
17540 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
17550 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17560 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
17570 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17580 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
17590 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74   called from bot
175a0 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  h BtreeCommitPha
175b0 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65  seTwo() and Btre
175c0 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61  eRollback().** a
175d0 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
175e0 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
175f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
17600 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61  d btreeEndTransa
17610 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b  ction(Btree *p){
17620 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17630 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43   = p->pBt;.  BtC
17640 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 61  ursor *pCsr;.  a
17650 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
17660 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
17670 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68   );..  /* Search
17680 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 68 65   for a cursor he
17690 6c 64 20 6f 70 65 6e 20 62 79 20 74 68 69 73 20  ld open by this 
176a0 62 2d 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f  b-tree connectio
176b0 6e 2e 20 49 66 20 6f 6e 65 20 65 78 69 73 74 73  n. If one exists
176c0 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20  ,.  ** then the 
176d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
176e0 20 62 65 20 64 6f 77 6e 67 72 61 64 65 64 20 74   be downgraded t
176f0 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  o a read-only tr
17700 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
17710 6e 73 74 65 61 64 20 6f 66 20 61 63 74 75 61 6c  nstead of actual
17720 6c 79 20 63 6f 6e 63 6c 75 64 65 64 2e 20 41 20  ly concluded. A 
17730 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20  subsequent call 
17740 74 6f 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  to CommitPhaseTw
17750 6f 28 29 20 0a 20 20 2a 2a 20 6f 72 20 52 6f 6c  o() .  ** or Rol
17760 6c 62 61 63 6b 28 29 20 77 69 6c 6c 20 66 69 6e  lback() will fin
17770 69 73 68 20 74 68 65 20 74 72 61 6e 73 61 63 74  ish the transact
17780 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
17790 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  he database.  */
177a0 0a 20 20 66 6f 72 28 70 43 73 72 3d 70 42 74 2d  .  for(pCsr=pBt-
177b0 3e 70 43 75 72 73 6f 72 3b 20 70 43 73 72 20 26  >pCursor; pCsr &
177c0 26 20 70 43 73 72 2d 3e 70 42 74 72 65 65 21 3d  & pCsr->pBtree!=
177d0 70 3b 20 70 43 73 72 3d 70 43 73 72 2d 3e 70 4e  p; pCsr=pCsr->pN
177e0 65 78 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ext);.  assert( 
177f0 70 43 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e  pCsr==0 || p->in
17800 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
17810 20 29 3b 0a 0a 20 20 62 74 72 65 65 43 6c 65 61   );..  btreeClea
17820 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
17830 3b 0a 20 20 69 66 28 20 70 43 73 72 20 29 7b 0a  ;.  if( pCsr ){.
17840 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
17850 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
17860 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
17870 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
17880 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
17890 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
178a0 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
178b0 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
178c0 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
178d0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
178e0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
178f0 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
17900 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
17910 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
17920 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
17930 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
17940 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
17950 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
17960 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
17970 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
17980 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
17990 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
179a0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
179b0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
179c0 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
179d0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
179e0 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
179f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
17a00 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
17a10 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
17a20 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
17a30 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
17a40 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
17a50 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
17a60 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
17a70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
17a80 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
17a90 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
17aa0 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
17ab0 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
17ac0 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
17ad0 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
17ae0 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
17af0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
17b00 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
17b10 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
17b20 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
17b30 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
17b40 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
17b50 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
17b60 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
17b70 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
17b80 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
17b90 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
17ba0 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
17bb0 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
17bc0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
17bd0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
17be0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
17bf0 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
17c00 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
17c10 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
17c20 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
17c30 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
17c40 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
17c50 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
17c60 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
17c70 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
17c80 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
17c90 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
17ca0 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
17cb0 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
17cc0 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
17cd0 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
17ce0 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
17cf0 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
17d00 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
17d10 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
17d20 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
17d30 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
17d40 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
17d50 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
17d60 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
17d70 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
17d80 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  cks..**.** This 
17d90 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
17da0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
17db0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17dc0 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
17dd0 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
17de0 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
17df0 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
17e00 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
17e10 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
17e20 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
17e30 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
17e40 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
17e50 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17e60 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
17e70 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
17e80 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
17e90 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  as a write-trans
17ea0 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d  action open, com
17eb0 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62  mit the shared-b
17ec0 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e  trees .  ** tran
17ed0 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20  saction and set 
17ee0 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
17ef0 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a   to TRANS_READ..
17f00 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
17f10 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
17f20 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
17f30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
17f40 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
17f50 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
17f60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
17f70 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
17f80 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
17f90 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
17fa0 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61  haseTwo(pBt->pPa
17fb0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
17fc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17fd0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
17fe0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
17ff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18000 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  }.    pBt->inTra
18010 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
18020 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74  _READ;.  }..  bt
18030 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
18040 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
18050 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18070 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
18080 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
18090 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
180a0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
180b0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
180c0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
180d0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
180e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
180f0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
18100 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
18110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18120 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
18130 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
18140 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  o(p);.  }.  sqli
18150 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18160 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18170 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
18180 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
18190 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74  e number of writ
181a0 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  e-cursors open o
181b0 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54  n this handle. T
181c0 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
181d0 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
181e0 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
181f0 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
18200 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
18210 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
18220 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
18230 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
18240 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63  utine, a write-c
18250 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
18260 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
18270 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e  apable of writin
18280 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65  g to the databse
18290 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68  .  That means th
182a0 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20  e cursor was.** 
182b0 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65  originally opene
182c0 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  d for writing an
182d0 64 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  d the cursor has
182e0 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64   not be disabled
182f0 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74  .** by having it
18300 73 20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20  s state changed 
18310 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e  to CURSOR_FAULT.
18320 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
18330 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
18340 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
18350 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
18360 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
18370 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
18380 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
18390 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
183a0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
183b0 77 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e  wrFlag && pCur->
183c0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46  eState!=CURSOR_F
183d0 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  AULT ) r++; .  }
183e0 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
183f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
18400 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
18410 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
18420 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
18430 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
18440 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
18450 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74  ery cursor on Bt
18460 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
18470 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
18480 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
18490 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c  rsor is tripped,
184a0 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
184b0 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a  rs that belong.*
184c0 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  * to other datab
184d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
184e0 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
184f0 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65  e sharing.** the
18500 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
18510 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
18520 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
18530 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
18540 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c  ck occurs..** Al
18550 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20  l cursors using 
18560 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d  the same cache m
18570 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a  ust be tripped.*
18580 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  * to prevent the
18590 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  m from trying to
185a0 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61   use the btree a
185b0 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  fter.** the roll
185c0 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62  back.  The rollb
185d0 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c  ack may have del
185e0 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f  eted tables.** o
185f0 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67  r moved root pag
18600 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74  es, so it is not
18610 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a   sufficient to.*
18620 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65  * save the state
18630 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
18640 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
18650 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
18660 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
18670 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
18680 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
18690 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
186a0 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  e){.  BtCursor *
186b0 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  p;.  sqlite3Btre
186c0 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
186d0 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
186e0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
186f0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
18700 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c    int i;.    sql
18710 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
18720 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e  rsor(p);.    p->
18730 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
18740 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b  FAULT;.    p->sk
18750 69 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  ip = errCode;.  
18760 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
18770 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
18780 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18790 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  p->apPage[i]);. 
187a0 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
187b0 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
187c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
187d0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
187e0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
187f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
18800 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
18810 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
18820 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
18830 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
18840 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
18850 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
18860 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
18870 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
18880 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
18890 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
188a0 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
188b0 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
188c0 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
188d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
188e0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
188f0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
18900 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
18910 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
18920 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
18930 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18940 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
18950 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
18960 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
18970 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
18980 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
18990 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
189a0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61  er(p);.  rc = sa
189b0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
189c0 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
189d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
189e0 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
189f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18a00 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
18a10 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61  a horrible situa
18a20 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d  tion. An IO or m
18a30 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
18a40 63 75 72 72 65 64 20 77 68 69 6c 73 74 0a 20 20  curred whilst.  
18a50 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73    ** trying to s
18a60 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ave cursor posit
18a70 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73  ions. If this is
18a80 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f   an automatic ro
18a90 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a  llback (as.    *
18aa0 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * the result of 
18ab0 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61  a constraint, ma
18ac0 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f  lloc() failure o
18ad0 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e  r IO error) then
18ae0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63   .    ** the cac
18af0 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e  he may be intern
18b00 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ally inconsisten
18b10 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76  t (not contain v
18b20 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20  alid trees) so. 
18b30 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20     ** we cannot 
18b40 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68  simply return th
18b50 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63  e error to the c
18b60 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20  aller. Instead, 
18b70 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c  abort .    ** al
18b80 6c 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d  l queries that m
18b90 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20  ay be using any 
18ba0 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
18bb0 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61  hat failed to sa
18bc0 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ve..    */.    s
18bd0 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
18be0 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29  llCursors(p, rc)
18bf0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62  ;.  }.#endif.  b
18c00 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
18c10 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
18c20 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
18c30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
18c40 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
18c50 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
18c60 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
18c70 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
18c80 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
18c90 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
18ca0 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
18cb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
18cc0 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
18cd0 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
18ce0 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
18cf0 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
18d00 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
18d10 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
18d20 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
18d30 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
18d40 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
18d50 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
18d60 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
18d70 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
18d80 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
18d90 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
18da0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18db0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
18dc0 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
18dd0 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72   assert( countWr
18de0 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d  iteCursors(pBt)=
18df0 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
18e00 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
18e10 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
18e20 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
18e30 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
18e40 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18e50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18e60 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
18e70 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
18e80 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
18e90 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
18ea0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
18eb0 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
18ec0 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
18ed0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
18ee0 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
18ef0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
18f00 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
18f10 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
18f20 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
18f30 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
18f40 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
18f50 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
18f60 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
18f70 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
18f80 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
18f90 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
18fa0 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
18fb0 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
18fc0 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
18fd0 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
18fe0 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
18ff0 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
19000 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
19010 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
19020 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
19030 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
19040 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
19050 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
19060 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
19070 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
19080 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
19090 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
190a0 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
190b0 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
190c0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
190d0 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
190e0 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
190f0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
19100 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
19110 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
19120 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
19130 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
19140 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
19150 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
19160 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
19170 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
19180 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
19190 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
191a0 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
191b0 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
191c0 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
191d0 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
191e0 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
191f0 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
19200 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
19210 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
19220 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
19230 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
19240 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
19250 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
19260 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
19270 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
19280 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
19290 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
192a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
192b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
192c0 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
192d0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
192e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 72 65   assert( pBt->re
192f0 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61  adOnly==0 );.  a
19300 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
19310 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
19320 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64   iStatement>p->d
19330 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b  b->nSavepoint );
19340 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e  .  if( NEVER(p->
19350 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
19360 52 49 54 45 20 7c 7c 20 70 42 74 2d 3e 72 65 61  RITE || pBt->rea
19370 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 63  dOnly) ){.    rc
19380 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e   = SQLITE_INTERN
19390 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AL;.  }else{.   
193a0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
193b0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
193c0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
193d0 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20  /* At the pager 
193e0 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65  level, a stateme
193f0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
19400 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69  s a savepoint wi
19410 74 68 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 64  th.    ** an ind
19420 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
19430 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
19440 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
19450 79 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 53  y using.    ** S
19460 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49  QL statements. I
19470 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
19480 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72  open, release or
19490 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20   rollback any.  
194a0 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
194b0 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
194c0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
194d0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
194e0 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f  s active..    */
194f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19500 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
19510 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
19520 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
19530 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
19540 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
19550 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19560 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
19570 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
19580 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
19590 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
195a0 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
195b0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
195c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
195d0 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
195e0 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
195f0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
19600 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
19610 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
19620 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
19630 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
19640 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
19650 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
19660 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
19670 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
19680 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
19690 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
196a0 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
196b0 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
196c0 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
196d0 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
196e0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
196f0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
19700 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
19710 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
19720 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
19730 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
19740 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
19750 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
19760 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
19770 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
19780 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
19790 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
197a0 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
197b0 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
197c0 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
197d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
197e0 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
197f0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
19800 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
19810 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
19820 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
19830 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
19840 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
19850 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
19860 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
19870 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
19880 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
19890 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
198a0 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
198b0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
198c0 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  (p);.    rc = sq
198d0 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
198e0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
198f0 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
19900 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
19910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19920 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
19930 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pBt);.    }.  
19940 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19950 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
19960 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19970 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
19980 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
19990 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
199a0 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
199b0 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65   iTable. If a re
199c0 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69  ad-only cursor i
199d0 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
199e0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
199f0 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c  ** the caller al
19a00 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61  ready has at lea
19a10 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  st a read-only t
19a20 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a  ransaction open.
19a30 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
19a40 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61  se already. If a
19a50 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
19a60 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e   requested, then
19a70 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
19a80 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76  s assumed to hav
19a90 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
19aa0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
19ab0 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c  ** If wrFlag==0,
19ac0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
19ad0 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
19ae0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a  d for reading..*
19af0 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20  * If wrFlag==1, 
19b00 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
19b10 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
19b20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a  reading or for.*
19b30 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  * writing if oth
19b40 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
19b50 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c  r writing are al
19b60 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a  so met.  These.*
19b70 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  * are the condit
19b80 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
19b90 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66  e met in order f
19ba0 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a  or writing to.**
19bb0 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
19bc0 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
19bd0 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
19be0 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
19bf0 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20  lag==1.**.** 2: 
19c00 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
19c10 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
19c20 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
19c30 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
19c40 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
19c50 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
19c60 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
19c70 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
19c80 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
19c90 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
19ca0 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
19cb0 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
19cc0 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
19cd0 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
19ce0 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
19cf0 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
19d00 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
19d10 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
19d20 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
19d30 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
19d40 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
19d50 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
19d60 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
19d70 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
19d80 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
19d90 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
19da0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
19db0 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
19dc0 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
19dd0 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
19de0 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
19df0 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
19e00 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
19e10 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
19e20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
19e30 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
19e40 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
19e50 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  **.** It is assu
19e60 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c  med that the sql
19e70 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
19e80 69 7a 65 28 29 20 62 79 74 65 73 20 6f 66 20 6d  ize() bytes of m
19e90 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e 74 65  emory .** pointe
19ea0 64 20 74 6f 20 62 79 20 70 43 75 72 20 68 61 76  d to by pCur hav
19eb0 65 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79  e been zeroed by
19ec0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
19ed0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
19ee0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
19ef0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
19f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f10 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
19f20 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
19f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
19f50 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
19f60 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
19f70 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f90 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
19fa0 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
19fb0 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
19fc0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
19fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
19fe0 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
19ff0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
1a000 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
1a010 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
1a020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
1a030 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
1a040 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
1a050 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1a060 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1a070 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
1a080 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20  ee handle */..  
1a090 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1a0a0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1a0b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
1a0c0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c  rFlag==0 || wrFl
1a0d0 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ag==1 );..  /* T
1a0e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1a0f0 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76  ert statements v
1a100 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68  erify that if th
1a110 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65  is is a sharable
1a120 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61   .  ** b-tree da
1a130 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e  tabase, the conn
1a140 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
1a150 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  g the required t
1a160 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a  able locks, .  *
1a170 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74  * and that no ot
1a180 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
1a190 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73  as any open curs
1a1a0 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74  or that conflict
1a1b0 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69  s with .  ** thi
1a1c0 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73  s lock.  */.  as
1a1d0 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
1a1e0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
1a1f0 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66   iTable, pKeyInf
1a200 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20  o!=0, wrFlag+1) 
1a210 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1a220 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
1a230 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
1a240 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
1a250 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
1a260 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
1a270 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
1a280 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
1a290 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1a2a0 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
1a2b0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1a2c0 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
1a2d0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1a2e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1a2f0 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
1a300 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
1a310 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
1a320 77 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e 72  wrFlag && pBt->r
1a330 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadOnly) ){.    
1a340 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
1a350 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
1a360 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 70  ( iTable==1 && p
1a370 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1a380 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  t)==0 ){.    ret
1a390 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  urn SQLITE_EMPTY
1a3a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
1a3b0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
1a3c0 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
1a3d0 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
1a3e0 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
1a3f0 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
1a400 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
1a410 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
1a420 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
1a430 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
1a440 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
1a450 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
1a460 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
1a470 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
1a480 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
1a490 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
1a4a0 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77  = pBt;.  pCur->w
1a4b0 72 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c  rFlag = (u8)wrFl
1a4c0 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78  ag;.  pCur->pNex
1a4d0 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
1a4e0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e  ;.  if( pCur->pN
1a4f0 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ext ){.    pCur-
1a500 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1a510 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  pCur;.  }.  pBt-
1a520 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
1a530 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
1a540 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1a550 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64  ;.  pCur->cached
1a560 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 72 65 74  Rowid = 0;.  ret
1a570 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a580 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a590 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
1a5a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
1a5d0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
1a5e0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a600 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1a610 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
1a620 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
1a630 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a650 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
1a660 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
1a670 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
1a680 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6a0 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1a6b0 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20  xCompare() */.  
1a6c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1a6f0 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20  rite new cursor 
1a700 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1a710 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1a720 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
1a730 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
1a740 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
1a750 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
1a760 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
1a770 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1a780 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a790 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
1a7a0 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20  e of a BtCursor 
1a7b0 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e  object in bytes.
1a7c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65  .**.** This inte
1a7d0 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64  rfaces is needed
1a7e0 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f   so that users o
1a7f0 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72  f cursors can pr
1a800 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66  eallocate.** suf
1a810 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20  ficient storage 
1a820 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72  to hold a cursor
1a830 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20  .  The BtCursor 
1a840 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65  object is opaque
1a850 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20  .** to users so 
1a860 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74  they cannot do t
1a870 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d  he sizeof() them
1a880 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75  selves - they mu
1a890 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20  st call.** this 
1a8a0 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20  routine..*/.int 
1a8b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1a8c0 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20  orSize(void){.  
1a8d0 72 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42 74  return sizeof(Bt
1a8e0 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Cursor);.}../*.*
1a8f0 2a 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64  * Set the cached
1a900 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20   rowid value of 
1a910 65 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20  every cursor in 
1a920 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
1a930 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75  e file.** as pCu
1a940 72 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65  r and having the
1a950 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20   same root page 
1a960 6e 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20  number as pCur. 
1a970 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a   The value is.**
1a980 20 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a   set to iRowid..
1a990 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74  **.** Only posit
1a9a0 69 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73  ive rowid values
1a9b0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
1a9c0 76 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63  valid for this c
1a9d0 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63  ache..** The cac
1a9e0 68 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  he is initialize
1a9f0 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63  d to zero, indic
1aa00 61 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64  ating an invalid
1aa10 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72   cache..** A btr
1aa20 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ee will work fin
1aa30 65 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e  e with zero or n
1aa40 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20  egative rowids. 
1aa50 20 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a   We just cannot.
1aa60 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72  ** cache zero or
1aa70 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1aa80 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61  , which means ta
1aa90 62 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65  bles that use ze
1aaa0 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76  ro or.** negativ
1aab0 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72  e rowids might r
1aac0 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
1aad0 65 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63  er.  But in prac
1aae0 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tice, zero.** or
1aaf0 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1ab00 20 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d   are very uncomm
1ab10 6f 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c  on so this shoul
1ab20 64 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  d not be a probl
1ab30 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  em..*/.void sqli
1ab40 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
1ab50 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  dRowid(BtCursor 
1ab60 2a 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69  *pCur, sqlite3_i
1ab70 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20  nt64 iRowid){.  
1ab80 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66  BtCursor *p;.  f
1ab90 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e  or(p=pCur->pBt->
1aba0 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
1abb0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1abc0 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43   p->pgnoRoot==pC
1abd0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70  ur->pgnoRoot ) p
1abe0 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20  ->cachedRowid = 
1abf0 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73  iRowid;.  }.  as
1ac00 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68  sert( pCur->cach
1ac10 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20  edRowid==iRowid 
1ac20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1ac30 72 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f  rn the cached ro
1ac40 77 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65  wid for the give
1ac50 6e 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67  n cursor.  A neg
1ac60 61 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a  ative or zero.**
1ac70 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
1ac80 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1ac90 20 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20   rowid cache is 
1aca0 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75  invalid and shou
1acb0 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64  ld be.** ignored
1acc0 2e 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20  .  If the rowid 
1acd0 63 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20  cache has never 
1ace0 62 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c  before been set,
1acf0 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20   then a.** zero 
1ad00 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1ad10 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
1ad20 6c 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63  lite3BtreeGetCac
1ad30 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f  hedRowid(BtCurso
1ad40 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
1ad50 72 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  rn pCur->cachedR
1ad60 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  owid;.}../*.** C
1ad70 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
1ad80 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
1ad90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ada0 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
1adb0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
1adc0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
1add0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ade0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
1adf0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1ae00 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
1ae10 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
1ae20 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
1ae30 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1ae40 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1ae50 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
1ae60 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1ae70 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73  r(pBtree);.    s
1ae80 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1ae90 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
1aea0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
1aeb0 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  v ){.      pCur-
1aec0 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
1aed0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
1aee0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42   }else{.      pB
1aef0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
1af00 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
1af10 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e      if( pCur->pN
1af20 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ext ){.      pCu
1af30 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
1af40 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
1af50 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
1af60 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
1af70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
1af80 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
1af90 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
1afa0 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  }.    unlockBtre
1afb0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1afc0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
1afd0 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
1afe0 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
1aff0 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f  3_free(pCur); */
1b000 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1b010 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1b020 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1b030 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1b040 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
1b050 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
1b060 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
1b070 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
1b080 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
1b090 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
1b0a0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
1b0b0 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65  id, call.** btre
1b0c0 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20  eParseCell() to 
1b0d0 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a  fill it in..**.*
1b0e0 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
1b0f0 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68  is a cache of th
1b100 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
1b110 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c   the current cel
1b120 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73  l..** Using this
1b130 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74   cache reduces t
1b140 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  he number of cal
1b150 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ls to btreeParse
1b160 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30  Cell()..**.** 20
1b170 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65  07-06-25:  There
1b180 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d   is a bug in som
1b190 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53  e versions of MS
1b1a0 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68  VC that cause th
1b1b0 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f  e.** compiler to
1b1c0 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43   crash when getC
1b1d0 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70  ellInfo() is imp
1b1e0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61  lemented as a ma
1b1f0 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72  cro..** But ther
1b200 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62  e is a measureab
1b210 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61  le speed advanta
1b220 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20  ge to using the 
1b230 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20  macro on gcc.** 
1b240 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69  (when less compi
1b250 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ler optimization
1b260 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f  s like -Os or -O
1b270 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74  0 are used and t
1b280 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69  he.** compiler i
1b290 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65  s not doing agre
1b2a0 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29  ssive inlining.)
1b2b0 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65    So we use a re
1b2c0 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  al function.** f
1b2d0 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61  or MSVC and a ma
1b2e0 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69  cro for everythi
1b2f0 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74  ng else.  Ticket
1b300 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64   #2457..*/.#ifnd
1b310 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
1b320 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
1b330 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
1b340 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
1b350 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
1b360 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1b370 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
1b380 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
1b390 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
1b3a0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1b3b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1b3c0 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
1b3d0 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a  iPage], &info);.
1b3e0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63      assert( memc
1b3f0 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d  mp(&info, &pCur-
1b400 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  >info, sizeof(in
1b410 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23  fo))==0 );.  }.#
1b420 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61  else.  #define a
1b430 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29  ssertCellInfo(x)
1b440 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
1b450 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65  MSC_VER.  /* Use
1b460 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
1b470 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b   in MSVC to work
1b480 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20   around bugs in 
1b490 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a  that compiler. *
1b4a0 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  /.  static void 
1b4b0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
1b4c0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
1b4d0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1b4e0 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
1b4f0 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1b500 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20  ur->iPage;.     
1b510 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1b520 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1b530 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
1b540 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
1b550 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  fo);.      pCur-
1b560 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
1b570 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b580 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1b590 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
1b5a0 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74  .#else /* if not
1b5b0 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f   _MSC_VER */.  /
1b5c0 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e  * Use a macro in
1b5d0 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69   all other compi
1b5e0 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  lers so that the
1b5f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c   function is inl
1b600 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ined */.#define 
1b610 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1b620 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b650 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
1b660 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
1b670 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6a0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e          \.    in
1b6b0 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1b6c0 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  iPage;          
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6f0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62           \.    b
1b700 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1b710 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1b720 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
1b730 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
1b740 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76  ); \.    pCur->v
1b750 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20  alidNKey = 1;   
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b790 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20      \.  }else{  
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7e0 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72       \.    asser
1b7f0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b830 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64        \.  }.#end
1b840 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a  if /* _MSC_VER *
1b850 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  /../*.** Set *pS
1b860 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
1b870 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65  of the buffer ne
1b880 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  eded to hold the
1b890 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
1b8a0 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72   key for the cur
1b8b0 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20  rent entry.  If 
1b8c0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
1b8d0 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  t pointing.** to
1b8e0 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20   a valid entry, 
1b8f0 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
1b900 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61   0. .**.** For a
1b910 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
1b920 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c  INTKEY flag set,
1b930 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1b940 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a  turns the key.**
1b950 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65   itself, not the
1b960 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1b970 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a   in the key..*/.
1b980 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1b990 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72  KeySize(BtCursor
1b9a0 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69   *pCur, i64 *pSi
1b9b0 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ze){.  int rc;..
1b9c0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1b9d0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1b9e0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1b9f0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1ba00 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1ba10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ba20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1ba30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1ba40 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
1ba50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1ba60 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28  VALID );.    if(
1ba70 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1ba80 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
1ba90 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
1baa0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1bab0 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
1bac0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53  pCur);.      *pS
1bad0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
1bae0 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nKey;.    }.  }
1baf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bb00 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
1bb10 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
1bb20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
1bb30 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
1bb40 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
1bb50 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
1bb60 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
1bb70 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61  SQLITE_OK..** Fa
1bb80 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
1bb90 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63  sible.  If the c
1bba0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72  ursor is not cur
1bbb0 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69  rently.** pointi
1bbc0 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28  ng to an entry (
1bbd0 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e  which can happen
1bbe0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
1bbf0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
1bc00 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e  e is empty) then
1bc10 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
1bc20 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  o 0..*/.int sqli
1bc30 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
1bc40 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1bc50 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
1bc60 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1bc70 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1bc80 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
1bc90 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
1bca0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
1bcb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1bcc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1bcd0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1bce0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1bcf0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
1bd00 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1bd10 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
1bd20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1bd30 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
1bd40 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  /* Not pointing 
1bd50 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  at a valid entry
1bd60 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f   - set *pSize to
1bd70 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53   0. */.      *pS
1bd80 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
1bd90 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  se{.      getCel
1bda0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
1bdb0 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
1bdc0 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  ->info.nData;.  
1bdd0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1bde0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
1bdf0 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
1be00 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
1be10 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
1be20 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
1be30 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
1be40 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
1be50 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1be60 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
1be70 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
1be80 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
1be90 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
1bea0 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
1beb0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
1bec0 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
1bed0 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
1bee0 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
1bef0 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
1bf00 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
1bf10 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1bf20 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
1bf30 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1bf40 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1bf50 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  :.**.** The page
1bf60 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
1bf70 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
1bf80 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
1bf90 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74  list is .** writ
1bfa0 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
1bfb0 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20  t. If page ovfl 
1bfc0 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
1bfd0 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a   in its linked .
1bfe0 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ** list, *pPgnoN
1bff0 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
1c000 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
1c010 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
1c020 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63  , and a referenc
1c030 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  e to the MemPage
1c040 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
1c050 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65  nding.** to page
1c060 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61   number pOvfl wa
1c070 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e  s obtained, then
1c080 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1c090 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
1c0a0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49  .** reference. I
1c0b0 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
1c0c0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
1c0d0 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65  aller to call re
1c0e0 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f  leasePage().** o
1c0f0 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65  n *ppPage to fre
1c100 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e  e the reference.
1c110 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   In no reference
1c120 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62   was obtained (b
1c130 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f  ecause.** the po
1c140 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73  inter-map was us
1c150 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
1c160 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e   value for *pPgn
1c170 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  oNext), then.** 
1c180 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
1c190 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  o zero..*/.stati
1c1a0 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
1c1b0 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
1c1c0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
1c1d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1c1e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1c1f0 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c210 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  Current overflow
1c220 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
1c230 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
1c240 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
1c250 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68  * OUT: MemPage h
1c260 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55  andle (may be NU
1c270 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  LL) */.  Pgno *p
1c280 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20  PgnoNext        
1c290 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
1c2a0 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
1c2b0 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
1c2c0 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20  Pgno next = 0;. 
1c2d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1c2e0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
1c2f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
1c300 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1c310 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1c320 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1c330 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69  (pPgnoNext);..#i
1c340 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c350 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
1c360 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
1c370 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
1c380 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
1c390 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
1c3a0 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
1c3b0 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
1c3c0 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
1c3d0 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
1c3e0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
1c3f0 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
1c400 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
1c410 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
1c420 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
1c430 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
1c440 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
1c450 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
1c460 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
1c470 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
1c480 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
1c490 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
1c4a0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1c4b0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
1c4c0 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
1c4d0 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
1c4e0 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
1c4f0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1c500 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
1c510 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
1c520 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1c530 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
1c540 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1c550 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72 50 61   iGuess<=pagerPa
1c560 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
1c570 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
1c580 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
1c590 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
1c5a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1c5b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79  SQLITE_OK && eTy
1c5c0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1c5d0 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76  LOW2 && pgno==ov
1c5e0 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  fl ){.        ne
1c5f0 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20  xt = iGuess;.   
1c600 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c610 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
1c620 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1c630 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1c650 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1c660 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c  t, ovfl, &pPage,
1c670 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1c680 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1c690 20 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20   pPage==0);.    
1c6a0 69 66 28 20 6e 65 78 74 3d 3d 30 20 26 26 20 72  if( next==0 && r
1c6b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c6c0 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
1c6d0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1c6e0 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
1c6f0 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
1c700 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67  ext;.  if( ppPag
1c710 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  e ){.    *ppPage
1c720 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73   = pPage;.  }els
1c730 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  e{.    releasePa
1c740 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
1c750 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
1c760 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
1c770 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
1c780 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
1c790 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
1c7a0 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
1c7b0 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
1c7c0 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
1c7d0 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
1c7e0 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
1c7f0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
1c800 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
1c810 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
1c820 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
1c830 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
1c840 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
1c850 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
1c860 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
1c870 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
1c880 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
1c890 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
1c8a0 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
1c8b0 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
1c8c0 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
1c8d0 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
1c8e0 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
1c8f0 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
1c900 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
1c910 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1c920 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
1c930 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
1c940 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
1c950 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
1c960 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
1c970 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
1c980 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
1c990 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
1c9a0 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
1c9b0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1c9c0 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
1c9d0 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
1c9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c9f0 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
1ca00 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
1ca10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ca20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
1ca30 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
1ca40 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
1ca50 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
1ca60 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
1ca70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
1ca80 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
1ca90 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
1caa0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1cab0 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
1cac0 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
1cad0 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
1cae0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1caf0 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
1cb00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1cb10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1cb20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1cb30 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
1cb40 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
1cb50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1cb60 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
1cb70 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
1cb80 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
1cb90 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
1cba0 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
1cbb0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
1cbc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1cbd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1cbe0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1cbf0 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
1cc00 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
1cc10 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
1cc20 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
1cc30 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
1cc40 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
1cc50 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61  If the eOp.** pa
1cc60 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
1cc70 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
1cc80 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70  ration (data cop
1cc90 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66  ied into.** buff
1cca0 65 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20  er pBuf). If it 
1ccb0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77  is non-zero, a w
1ccc0 72 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65  rite (data copie
1ccd0 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72  d from.** buffer
1cce0 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20   pBuf)..**.** A 
1ccf0 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
1cd00 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72  ytes are read or
1cd10 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69   written beginni
1cd20 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ng at "offset"..
1cd30 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20  ** Data is read 
1cd40 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62  to or from the b
1cd50 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
1cd60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
1cd70 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64  oes not make a d
1cd80 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65  istinction betwe
1cd90 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e  en key and data.
1cda0 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64  .** It just read
1cdb0 73 20 6f 72 20 77 72 69 74 65 73 20 62 79 74 65  s or writes byte
1cdc0 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f  s from the paylo
1cdd0 61 64 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d  ad area.  Data m
1cde0 69 67 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20  ight .** appear 
1cdf0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
1ce00 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64   or be scattered
1ce10 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65   out on multiple
1ce20 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61   overflow .** pa
1ce30 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ges..**.** If th
1ce40 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63  e BtCursor.isInc
1ce50 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
1ce60 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65   is set, and the
1ce70 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73   current.** curs
1ce80 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
1ce90 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
1cea0 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66  ow pages, this f
1ceb0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63  unction.** alloc
1cec0 61 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61  ates space for a
1ced0 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61  nd lazily poplua
1cee0 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
1cef0 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63   page-list .** c
1cf00 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75  ache array (BtCu
1cf10 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e  rsor.aOverflow).
1cf20 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
1cf30 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61  s use this.** ca
1cf40 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b  che to make seek
1cf50 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
1cf60 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20  ied offset more 
1cf70 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
1cf80 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
1cf90 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
1cfa0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
1cfb0 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a  ated, it may be.
1cfc0 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
1cfd0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
1cfe0 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
1cff0 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
1d000 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
1d010 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
1d020 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
1d030 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
1d040 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
1d050 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
1d060 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
1d070 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
1d080 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1d090 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
1d0a0 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
1d0b0 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
1d0c0 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
1d0d0 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
1d0e0 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
1d0f0 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
1d100 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
1d110 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
1d120 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d130 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
1d140 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
1d150 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
1d160 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
1d170 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
1d180 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20  /.  u32 offset, 
1d190 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
1d1a0 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
1d1b0 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
1d1c0 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20  */.  u32 amt,   
1d1d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
1d1e0 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
1d1f0 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
1d200 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
1d210 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
1d220 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
1d230 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65  */ .  int skipKe
1d240 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  y,         /* of
1d250 66 73 65 74 20 62 65 67 69 6e 73 20 61 74 20 64  fset begins at d
1d260 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
1d270 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  rue */.  int eOp
1d280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d290 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
1d2a0 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
1d2b0 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
1d2c0 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
1d2d0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
1d2e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e  LITE_OK;.  u32 n
1d2f0 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  Key;.  int iIdx 
1d300 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
1d310 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1d320 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1d330 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
1d340 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
1d350 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
1d360 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
1d370 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d380 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
1d390 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
1d3a0 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
1d3b0 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
1d3c0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1d3d0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1d3e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1d3f0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1d400 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1d410 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  l );.  assert( c
1d420 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1d430 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43  pCur) );..  getC
1d440 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1d450 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
1d460 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70  ->info.pCell + p
1d470 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
1d480 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61  r;.  nKey = (pPa
1d490 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a  ge->intKey ? 0 :
1d4a0 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
1d4b0 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 73  .nKey);..  if( s
1d4c0 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66  kipKey ){.    of
1d4d0 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  fset += nKey;.  
1d4e0 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61  }.  if( offset+a
1d4f0 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e  mt > nKey+pCur->
1d500 69 6e 66 6f 2e 6e 44 61 74 61 20 0a 20 20 20 7c  info.nData .   |
1d510 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  | &aPayload[pCur
1d520 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e  ->info.nLocal] >
1d530 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
1d540 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a  Bt->usableSize].
1d550 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69    ){.    /* Tryi
1d560 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
1d570 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
1d580 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
1d590 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
1d5a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1d5b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1d5c0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
1d5d0 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
1d5e0 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
1d5f0 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
1d600 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
1d610 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
1d620 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
1d630 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
1d640 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
1d650 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1d660 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
1d670 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1d680 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
1d690 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
1d6a0 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
1d6b0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
1d6c0 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62   eOp, pPage->pDb
1d6d0 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65  Page);.    offse
1d6e0 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20  t = 0;.    pBuf 
1d6f0 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d  += a;.    amt -=
1d700 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
1d710 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d   offset -= pCur-
1d720 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
1d730 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
1d740 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
1d750 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
1d760 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
1d770 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
1d780 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
1d790 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
1d7a0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
1d7b0 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
1d7c0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1d7d0 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
1d7e0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
1d7f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d800 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1d810 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63   /* If the isInc
1d820 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
1d830 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20   is set and the 
1d840 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
1d850 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20  ow[].    ** has 
1d860 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
1d870 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
1d880 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69  now. The array i
1d890 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a  s sized at.    *
1d8a0 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20  * one entry for 
1d8b0 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  each overflow pa
1d8c0 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
1d8d0 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20  ow chain. The.  
1d8e0 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72    ** page number
1d8f0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
1d900 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73  erflow page is s
1d910 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c  tored in aOverfl
1d920 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74  ow[0],.    ** et
1d930 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20  c. A value of 0 
1d940 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  in the aOverflow
1d950 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22  [] array means "
1d960 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20  not yet known". 
1d970 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65     ** (the cache
1d980 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c   is lazily popul
1d990 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ated)..    */.  
1d9a0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e    if( pCur->isIn
1d9b0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20  crblobHandle && 
1d9c0 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
1d9d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
1d9e0 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66  vfl = (pCur->inf
1d9f0 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d  o.nPayload-pCur-
1da00 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66  >info.nLocal+ovf
1da10 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a  lSize-1)/ovflSiz
1da20 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  e;.      pCur->a
1da30 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f  Overflow = (Pgno
1da40 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
1da50 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f  Zero(sizeof(Pgno
1da60 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  )*nOvfl);.      
1da70 69 66 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43  if( nOvfl && !pC
1da80 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
1da90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1daa0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1dab0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1dac0 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  * If the overflo
1dad0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
1dae0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
1daf0 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20  ated and the.   
1db00 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68   ** entry for th
1db10 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64  e first required
1db20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1db30 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20  s valid, skip.  
1db40 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
1db50 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
1db60 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
1db70 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
1db80 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76  erflow[offset/ov
1db90 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20  flSize] ){.     
1dba0 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
1dbb0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
1dbc0 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
1dbd0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1dbe0 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  ];.      offset 
1dbf0 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
1dc00 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ze);.    }.#endi
1dc10 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63  f..    for( ; rc
1dc20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
1dc30 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65  mt>0 && nextPage
1dc40 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e  ; iIdx++){..#ifn
1dc50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1dc60 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f  INCRBLOB.      /
1dc70 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70  * If required, p
1dc80 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
1dc90 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1dca0 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ache. */.      i
1dcb0 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
1dcc0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ow ){.        as
1dcd0 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65  sert(!pCur->aOve
1dce0 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70  rflow[iIdx] || p
1dcf0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1dd00 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b  Idx]==nextPage);
1dd10 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61  .        pCur->a
1dd20 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
1dd30 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20   nextPage;.     
1dd40 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
1dd50 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
1dd60 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
1dd70 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
1dd80 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
1dd90 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
1dda0 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
1ddb0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
1ddc0 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
1ddd0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
1dde0 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
1ddf0 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
1de00 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
1de10 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
1de20 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
1de30 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
1de40 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
1de50 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
1de60 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
1de70 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
1de80 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
1de90 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
1dea0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1deb0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1dec0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
1ded0 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
1dee0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1def0 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
1df00 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
1df10 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1df20 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20  x+1];.        } 
1df30 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20  else .#endif.   
1df40 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
1df50 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
1df60 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
1df70 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
1df80 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c    offset -= ovfl
1df90 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Size;.      }els
1dfa0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  e{.        /* Ne
1dfb0 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  ed to read this 
1dfc0 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49  page properly. I
1dfd0 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  t contains some 
1dfe0 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
1dff0 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20  * range of data 
1e000 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65  that is being re
1e010 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77  ad (eOp==0) or w
1e020 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e  ritten (eOp!=0).
1e030 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1e040 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
1e050 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  age;.        int
1e060 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
1e070 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e080 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
1e090 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
1e0a0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1e0b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e0c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e0d0 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
1e0e0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
1e0f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1e100 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
1e110 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29  t4byte(aPayload)
1e120 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e130 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66  a + offset > ovf
1e140 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
1e150 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
1e160 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
1e170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e180 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
1e190 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
1e1a0 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
1e1b0 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a   eOp, pDbPage);.
1e1c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e1d0 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
1e1e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1e1f0 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
1e200 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
1e210 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20 2b            pBuf +
1e220 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = a;.        }. 
1e230 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e240 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1e250 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
1e260 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1e270 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e280 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1e290 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
1e2a0 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79   part of the key
1e2b0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1e2c0 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
1e2d0 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
1e2e0 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
1e2f0 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
1e300 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
1e310 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
1e320 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
1e330 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1e340 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
1e350 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
1e360 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
1e370 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
1e380 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
1e390 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
1e3a0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
1e3b0 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
1e3c0 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
1e3d0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
1e3e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
1e3f0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
1e400 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
1e410 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1e420 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1e430 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1e440 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
1e450 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1e460 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1e470 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1e480 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1e490 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1e4a0 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
1e4b0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
1e4c0 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
1e4d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
1e4e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 70      if( pCur->ap
1e4f0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
1e500 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e510 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e520 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
1e530 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1e540 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1e550 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1e560 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
1e570 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
1e580 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
1e590 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
1e5a0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
1e5b0 75 66 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  uf, 0, 0);.  }. 
1e5c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e5d0 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
1e5e0 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63  f the data assoc
1e5f0 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
1e600 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
1e610 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
1e620 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
1e630 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
1e640 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
1e650 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
1e660 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
1e670 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1e680 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
1e690 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
1e6a0 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
1e6b0 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
1e6c0 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
1e6d0 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
1e6e0 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
1e6f0 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
1e700 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e710 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73  BtreeData(BtCurs
1e720 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
1e730 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
1e740 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
1e750 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53  t rc;..#ifndef S
1e760 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
1e770 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d  LOB.  if ( pCur-
1e780 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1e790 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  INVALID ){.    r
1e7a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
1e7b0 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  RT;.  }.#endif..
1e7c0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1e7d0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1e7e0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1e7f0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1e800 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1e810 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e820 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1e830 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1e840 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
1e850 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1e860 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
1e870 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1e880 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1e890 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1e8a0 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
1e8b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1e8c0 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
1e8d0 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
1e8e0 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
1e8f0 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20  , amt, pBuf, 1, 
1e900 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1e910 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1e920 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1e930 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
1e940 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
1e950 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
1e960 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
1e970 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
1e980 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
1e990 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1e9a0 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
1e9b0 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69  skipKey==0 and i
1e9c0 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
1e9d0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
1e9e0 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d  a if.** skipKey=
1e9f0 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  =1.  The number 
1ea00 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
1ea10 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69  lable key/data i
1ea20 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
1ea30 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
1ea40 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
1ea50 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77  value returned w
1ea60 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20  ill not be.** a 
1ea70 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
1ea80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ea90 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
1eaa0 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
1eab0 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
1eac0 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
1ead0 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
1eae0 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
1eaf0 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
1eb00 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
1eb10 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
1eb20 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
1eb30 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
1eb40 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
1eb50 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
1eb60 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
1eb70 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
1eb80 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
1eb90 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
1eba0 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
1ebb0 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
1ebc0 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
1ebd0 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20  o reassemble.** 
1ebe0 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
1ebf0 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
1ec00 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
1ec10 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
1ec20 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
1ec30 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
1ec40 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
1ec50 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
1ec60 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
1ec70 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
1ec80 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
1ec90 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
1eca0 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
1ecb0 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
1ecc0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
1ecd0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1ece0 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64  ar *fetchPayload
1ecf0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1ed00 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
1ed10 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
1ed20 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
1ed30 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74  m */.  int *pAmt
1ed40 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ,           /* W
1ed50 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
1ed60 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
1ed70 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  es here */.  int
1ed80 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20   skipKey        
1ed90 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e    /* read beginn
1eda0 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74  ing at data if t
1edb0 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29  his is true */.)
1edc0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
1edd0 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d  r *aPayload;.  M
1ede0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
1edf0 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32   u32 nKey;.  u32
1ee00 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65   nLocal;..  asse
1ee10 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
1ee20 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
1ee30 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1ee40 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61  ur->iPage]);.  a
1ee50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1ee60 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1ee70 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  D );.  assert( c
1ee80 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1ee90 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65  pCur) );.  pPage
1eea0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1eeb0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
1eec0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1eed0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1eee0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1eef0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
1ef00 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
1ef10 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
1ef20 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ell;.  aPayload 
1ef30 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48  += pCur->info.nH
1ef40 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61  eader;.  if( pPa
1ef50 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
1ef60 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65    nKey = 0;.  }e
1ef70 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  lse{.    nKey = 
1ef80 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
1ef90 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
1efa0 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  skipKey ){.    a
1efb0 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b  Payload += nKey;
1efc0 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
1efd0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1efe0 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b  - nKey;.  }else{
1eff0 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
1f000 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
1f010 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e  .    if( nLocal>
1f020 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c  nKey ){.      nL
1f030 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20  ocal = nKey;.   
1f040 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d   }.  }.  *pAmt =
1f050 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72   nLocal;.  retur
1f060 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  n aPayload;.}...
1f070 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
1f080 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
1f090 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
1f0a0 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
1f0b0 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
1f0c0 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
1f0d0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
1f0e0 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
1f0f0 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
1f100 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
1f110 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
1f120 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
1f130 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
1f140 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
1f150 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
1f160 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
1f170 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
1f180 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
1f190 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
1f1a0 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
1f1b0 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
1f1c0 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
1f1d0 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
1f1e0 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
1f1f0 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
1f200 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
1f210 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
1f220 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
1f230 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
1f240 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
1f250 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
1f260 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
1f270 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
1f280 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
1f290 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
1f2a0 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
1f2b0 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
1f2c0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65  qlite3BtreeKeyFe
1f2d0 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
1f2e0 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
1f2f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f300 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1f310 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1f320 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1f330 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1f340 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
1f350 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1f360 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
1f370 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e  .    return (con
1f380 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
1f390 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
1f3a0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
1f3b0 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f  rn 0;.}.const vo
1f3c0 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
1f3d0 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73  DataFetch(BtCurs
1f3e0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1f3f0 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Amt){.  assert( 
1f400 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1f410 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1f420 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1f430 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1f440 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1f450 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1f460 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1f470 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
1f480 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
1f490 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
1f4a0 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a  , pAmt, 1);.  }.
1f4b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
1f4c0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1f4d0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
1f4e0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
1f4f0 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
1f500 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
1f510 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1f520 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
1f530 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61   move to..*/.sta
1f540 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68  tic int moveToCh
1f550 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ild(BtCursor *pC
1f560 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29  ur, u32 newPgno)
1f570 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
1f580 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  t i = pCur->iPag
1f590 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  e;.  MemPage *pN
1f5a0 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72  ewPage;.  BtShar
1f5b0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
1f5c0 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
1f5d0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1f5e0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1f5f0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1f600 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1f610 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1f620 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52  ->iPage<BTCURSOR
1f630 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20  _MAX_DEPTH );.  
1f640 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
1f650 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  =(BTCURSOR_MAX_D
1f660 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72  EPTH-1) ){.    r
1f670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1f680 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
1f690 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
1f6a0 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
1f6b0 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20  o, &pNewPage);. 
1f6c0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1f6d0 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50   rc;.  pCur->apP
1f6e0 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50  age[i+1] = pNewP
1f6f0 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49  age;.  pCur->aiI
1f700 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70  dx[i+1] = 0;.  p
1f710 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20  Cur->iPage++;.. 
1f720 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1f730 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
1f740 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
1f750 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43  if( pNewPage->nC
1f760 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74  ell<1 ){.    ret
1f770 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1f780 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
1f790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f7a0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
1f7b0 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50  UG./*.** Page pP
1f7c0 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
1f7d0 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
1f7e0 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
1f7f0 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
1f800 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
1f810 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
1f820 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
1f830 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
1f840 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
1f850 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
1f860 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
1f870 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1f880 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
1f890 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
1f8a0 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
1f8b0 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
1f8c0 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
1f8d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1f8e0 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
1f8f0 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
1f900 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
1f910 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
1f920 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
1f930 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
1f940 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
1f950 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
1f960 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
1f970 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
1f980 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
1f990 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
1f9a0 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
1f9b0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
1f9c0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
1f9d0 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
1f9e0 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
1f9f0 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
1fa00 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
1fa10 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
1fa20 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1fa30 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
1fa40 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
1fa50 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
1fa60 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
1fa70 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
1fa80 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
1fa90 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
1faa0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
1fab0 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
1fac0 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
1fad0 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
1fae0 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
1faf0 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
1fb00 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
1fb10 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
1fb20 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
1fb30 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
1fb40 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
1fb50 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
1fb60 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1fb70 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1fb80 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1fb90 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1fba0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1fbb0 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
1fbc0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
1fbd0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
1fbe0 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e  );.  assertParen
1fbf0 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72  tIndex(.    pCur
1fc00 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1fc10 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
1fc20 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1fc30 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
1fc40 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1fc50 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20  ->iPage]->pgno. 
1fc60 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67   );.  releasePag
1fc70 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  e(pCur->apPage[p
1fc80 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
1fc90 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
1fca0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1fcb0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
1fcc0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a  alidNKey = 0;.}.
1fcd0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1fce0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f  cursor to the ro
1fcf0 6f 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69  ot page.*/.stati
1fd00 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74  c int moveToRoot
1fd10 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1fd20 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  {.  MemPage *pRo
1fd30 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ot;.  int rc = S
1fd40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65  QLITE_OK;.  Btre
1fd50 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
1fd60 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
1fd70 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
1fd80 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1fd90 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1fda0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
1fdb0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
1fdc0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
1fdd0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
1fde0 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
1fdf0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1fe00 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
1fe10 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
1fe20 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
1fe30 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
1fe40 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
1fe50 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
1fe60 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
1fe70 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
1fe80 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ULT ){.      ret
1fe90 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
1fea0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1feb0 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
1fec0 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20  r(pCur);.  }..  
1fed0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
1fee0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
1fef0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
1ff00 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
1ff10 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
1ff20 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
1ff30 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge[i]);.    }.  
1ff40 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
1ff50 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1ff60 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54  if( .      SQLIT
1ff70 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41  E_OK!=(rc = getA
1ff80 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
1ff90 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
1ffa0 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  &pCur->apPage[0]
1ffb0 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
1ffc0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1ffd0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1ffe0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1fff0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
20000 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20  iPage = 0;..    
20010 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
20020 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
20030 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
20040 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
20050 69 73 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a  is cursor.    **
20060 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65   expected to ope
20070 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78  n it on an index
20080 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
20090 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20  se, if pKeyInfo 
200a0 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20  is.    ** NULL, 
200b0 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63  the caller expec
200c0 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ts a table b-tre
200d0 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  e. If this is no
200e0 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 20 20  t the case,.    
200f0 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
20100 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
20110 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  r.  */.    asser
20120 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
20130 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  0]->intKey==1 ||
20140 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
20150 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
20160 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 70 4b     if( (pCur->pK
20170 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72  eyInfo==0)!=pCur
20180 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
20190 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
201a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
201b0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
201c0 20 7d 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43   }..  pRoot = pC
201d0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
201e0 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
201f0 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
20200 52 6f 6f 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Root );.  pCur->
20210 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
20220 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
20230 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74   = 0;.  pCur->at
20240 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72  Last = 0;.  pCur
20250 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
20260 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ..  if( pRoot->n
20270 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f  Cell==0 && !pRoo
20280 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
20290 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
202a0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
202b0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
202c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
202d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
202e0 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a  oot->pgno==1 );.
202f0 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
20300 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
20310 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
20320 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61  ffset+8]);.    a
20330 73 73 65 72 74 28 20 73 75 62 70 61 67 65 3e 30  ssert( subpage>0
20340 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   );.    pCur->eS
20350 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
20360 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  LID;.    rc = mo
20370 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
20380 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73  subpage);.  }els
20390 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  e{.    pCur->eSt
203a0 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e  ate = ((pRoot->n
203b0 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56  Cell>0)?CURSOR_V
203c0 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41  ALID:CURSOR_INVA
203d0 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LID);.  }.  retu
203e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
203f0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
20400 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
20410 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
20420 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
20430 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
20440 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
20450 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
20460 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
20470 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
20480 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
20490 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
204a0 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
204b0 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
204c0 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
204d0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
204e0 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
204f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20500 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
20510 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
20520 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
20530 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
20540 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
20550 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
20560 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
20570 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20580 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
20590 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
205a0 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
205b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
205c0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
205d0 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
205e0 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
205f0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
20600 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49  pPage, pCur->aiI
20610 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  dx[pCur->iPage])
20620 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
20630 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
20640 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
20650 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
20660 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
20670 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
20680 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
20690 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
206a0 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
206b0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
206c0 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
206d0 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
206e0 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
206f0 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
20700 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
20710 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
20720 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
20730 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
20740 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
20750 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
20760 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
20770 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
20780 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
20790 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
207a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
207b0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
207c0 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
207d0 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
207e0 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
207f0 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
20800 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20810 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
20820 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
20830 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
20840 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20850 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
20860 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
20870 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
20880 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
20890 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
208a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
208b0 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
208c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
208d0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
208e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
208f0 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
20900 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
20910 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
20920 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
20930 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
20940 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
20950 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
20960 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
20970 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
20980 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  gno);.  }.  if( 
20990 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
209a0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
209b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
209c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
209d0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
209e0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
209f0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
20a00 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
20a10 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
20a20 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
20a30 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
20a40 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
20a50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
20a60 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
20a70 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
20a80 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
20a90 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
20aa0 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
20ab0 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
20ac0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
20ad0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
20ae0 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
20af0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
20b00 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
20b10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
20b20 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
20b30 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
20b40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
20b50 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
20b60 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
20b70 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
20b80 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
20b90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20ba0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
20bb0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
20bc0 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
20bd0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
20be0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
20bf0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
20c00 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
20c10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20c20 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
20c30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
20c40 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20c50 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
20c60 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
20c70 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
20c80 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
20c90 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ur);.    }.  }. 
20ca0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20cb0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
20cc0 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
20cd0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
20ce0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
20cf0 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
20d00 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
20d10 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
20d20 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
20d30 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
20d40 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
20d50 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
20d60 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
20d70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
20d80 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
20d90 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
20da0 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65  int rc;. .  asse
20db0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
20dc0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
20dd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
20de0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
20df0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
20e00 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
20e10 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61  the cursor alrea
20e20 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
20e30 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69   last entry, thi
20e40 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  s is a no-op. */
20e50 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41  .  if( CURSOR_VA
20e60 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
20e70 65 20 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73  e && pCur->atLas
20e80 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  t ){.#ifdef SQLI
20e90 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
20ea0 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
20eb0 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  s to assert() th
20ec0 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65  at the cursor re
20ed0 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20  ally does point 
20ee0 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c  .    ** to the l
20ef0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
20f00 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20   b-tree. */.    
20f10 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
20f20 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69  ii=0; ii<pCur->i
20f30 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
20f40 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
20f50 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72  >aiIdx[ii]==pCur
20f60 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43  ->apPage[ii]->nC
20f70 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ell );.    }.   
20f80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
20f90 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
20fa0 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
20fb0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
20fc0 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73  ell-1 );.    ass
20fd0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
20fe0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
20ff0 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  leaf );.#endif. 
21000 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21010 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
21020 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
21030 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
21040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
21050 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
21060 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
21070 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21080 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21090 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
210a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
210b0 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
210c0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
210d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
210e0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
210f0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
21100 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
21110 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
21120 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74  ;.      pCur->at
21130 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54  Last = rc==SQLIT
21140 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d  E_OK ?1:0;.    }
21150 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
21160 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
21170 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
21180 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
21190 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
211a0 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
211b0 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
211c0 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
211d0 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
211e0 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
211f0 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
21200 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
21210 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
21220 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
21230 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
21240 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
21250 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
21260 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
21270 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
21280 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
21290 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
212a0 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
212b0 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
212c0 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
212d0 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
212e0 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
212f0 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
21300 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
21310 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
21320 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
21330 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
21340 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
21350 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
21360 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
21370 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
21380 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
21390 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
213a0 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
213b0 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
213c0 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
213d0 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
213e0 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
213f0 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
21400 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
21410 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
21420 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
21430 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
21440 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
21450 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
21460 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
21470 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
21480 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
21490 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
214a0 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
214b0 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
214c0 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
214d0 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
214e0 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
214f0 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
21500 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
21510 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
21520 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
21530 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
21540 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
21550 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
21560 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
21570 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
21580 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
21590 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
215a0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
215b0 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
215c0 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
215d0 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a  /pIdxKey..**.*/.
215e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
215f0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
21600 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
21610 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
21620 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
21630 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
21640 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
21650 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
21660 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
21670 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
21680 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
21690 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
216a0 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
216b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
216c0 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
216d0 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
216e0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
216f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21700 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
21710 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
21720 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
21730 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
21740 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
21750 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
21760 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
21770 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
21780 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
21790 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
217a0 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
217b0 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
217c0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
217d0 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
217e0 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
217f0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
21800 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
21810 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
21820 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20  CURSOR_VALID && 
21830 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
21840 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50  .   && pCur->apP
21850 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a  age[0]->intKey .
21860 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
21870 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
21880 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
21890 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
218a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
218b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
218c0 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70  Cur->atLast && p
218d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
218e0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
218f0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
21900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21910 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
21920 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
21930 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
21940 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
21950 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
21960 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21970 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
21980 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
21990 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
219a0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
219b0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
219c0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
219d0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
219e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
219f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21a00 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
21a10 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
21a20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
21a30 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
21a40 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
21a50 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
21a60 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
21a70 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20  t lwr, upr;.    
21a80 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
21a90 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
21aa0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
21ab0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
21ac0 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a   int c = -1;  /*
21ad0 20 70 52 65 73 20 72 65 74 75 72 6e 20 69 66 20   pRes return if 
21ae0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d  table is empty m
21af0 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20  ust be -1 */.   
21b00 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
21b10 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
21b20 2d 31 3b 0a 20 20 20 20 69 66 28 20 28 21 70 50  -1;.    if( (!pP
21b30 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70  age->intKey && p
21b40 49 64 78 4b 65 79 3d 3d 30 29 20 7c 7c 20 75 70  IdxKey==0) || up
21b50 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  r<0 ){.      rc 
21b60 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
21b70 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
21b80 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
21b90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
21ba0 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20  iasRight ){.    
21bb0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
21bc0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
21bd0 36 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  6)upr;.    }else
21be0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  {.      pCur->ai
21bf0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
21c00 20 3d 20 28 75 31 36 29 28 28 75 70 72 2b 6c 77   = (u16)((upr+lw
21c10 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
21c20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
21c30 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
21c40 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
21c50 65 5d 3b 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  e]; /* Index of 
21c60 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
21c70 70 50 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 75  pPage */.      u
21c80 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  8 *pCell;       
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ca0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
21cb0 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
21cc0 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20   pPage */..     
21cd0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
21ce0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 65  e = 0;.      pCe
21cf0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
21d00 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67  age, idx) + pPag
21d10 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
21d20 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
21d30 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
21d40 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
21d50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
21d60 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
21d70 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75            u32 du
21d80 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mmy;.          p
21d90 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e  Cell += getVarin
21da0 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79  t32(pCell, dummy
21db0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
21dc0 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
21dd0 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65  Cell, (u64*)&nCe
21de0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
21df0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  if( nCellKey==in
21e00 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
21e10 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
21e20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
21e30 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
21e40 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a          c = -1;.
21e50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21e60 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
21e70 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
21e80 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
21e90 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
21ea0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61          pCur->va
21eb0 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
21ec0 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
21ed0 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
21ee0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21ef0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78        /* The max
21f00 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
21f10 61 67 65 2d 73 69 7a 65 20 69 73 20 33 32 37 36  age-size is 3276
21f20 38 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65  8 bytes. This me
21f30 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  ans that.       
21f40 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   ** the maximum 
21f50 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  number of record
21f60 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e   bytes stored on
21f70 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65   an index B-Tree
21f80 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
21f90 20 69 73 20 61 74 20 6d 6f 73 74 20 38 31 39 38   is at most 8198
21fa0 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 6d 61   bytes, which ma
21fb0 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
21fc0 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20   2-byte.        
21fd0 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20  ** varint. This 
21fe0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
21ff0 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74  sed to attempt t
22000 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20  o avoid parsing 
22010 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
22020 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63  entire cell by c
22030 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20  hecking for the 
22040 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
22050 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20  record is .     
22060 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74     ** stored ent
22070 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65  irely within the
22080 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20   b-tree page by 
22090 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66  inspecting the f
220a0 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  irst .        **
220b0 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   2 bytes of the 
220c0 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cell..        */
220d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65  .        int nCe
220e0 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20  ll = pCell[0];. 
220f0 20 20 20 20 20 20 20 69 66 28 20 21 28 6e 43 65         if( !(nCe
22100 6c 6c 20 26 20 30 78 38 30 29 20 26 26 20 6e 43  ll & 0x80) && nC
22110 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ell<=pPage->maxL
22120 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
22130 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
22140 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63   runs if the rec
22150 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  ord-size field o
22160 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a  f the cell is a.
22170 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
22180 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20  gle byte varint 
22190 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66  and the record f
221a0 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
221b0 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20  the main.       
221c0 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67     ** b-tree pag
221d0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
221e0 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
221f0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
22200 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
22210 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[1], pIdxKey);
22220 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
22230 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20  f( !(pCell[1] & 
22240 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20  0x80) .         
22250 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e   && (nCell = ((n
22260 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b  Cell&0x7f)<<7) +
22270 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67   pCell[1])<=pPag
22280 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20  e->maxLocal.    
22290 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
222a0 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73   /* The record-s
222b0 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32  ize field is a 2
222c0 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
222d0 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20   the record .   
222e0 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65         ** fits e
222f0 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
22300 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ain b-tree page.
22310 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
22320 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
22330 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
22340 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
22350 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [2], pIdxKey);. 
22360 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22370 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
22380 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72  ecord flows over
22390 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   onto one or mor
223a0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
223b0 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  . In.          *
223c0 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  * this case the 
223d0 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73  whole cell needs
223e0 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61   to be parsed, a
223f0 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
22400 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  d.          ** a
22410 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nd accessPayload
22420 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69  () used to retri
22430 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  eve the record i
22440 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
22450 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f    ** buffer befo
22460 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  re VdbeRecordCom
22470 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61  pare() can be ca
22480 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lled. */.       
22490 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65     void *pCellKe
224a0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  y;.          u8 
224b0 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64  * const pCellBod
224c0 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67  y = pCell - pPag
224d0 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
224e0 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
224f0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
22500 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26  ge, pCellBody, &
22510 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
22520 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28         nCell = (
22530 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
22540 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
22550 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
22560 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29  3Malloc( nCell )
22570 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22580 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
22590 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
225a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
225b0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
225c0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
225d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
225e0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
225f0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
22600 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64  nCell, (unsigned
22610 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c   char*)pCellKey,
22620 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
22630 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
22640 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
22650 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  Cell, pCellKey, 
22660 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
22670 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22680 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
22690 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
226a0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
226b0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
226c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
226d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
226e0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
226f0 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
22700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
22710 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
22720 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31     upr = lwr - 1
22730 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
22740 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
22750 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65  {.          *pRe
22760 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
22770 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22780 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
22790 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
227a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
227b0 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29  .      if( c<0 )
227c0 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20  {.        lwr = 
227d0 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c  idx+1;.      }el
227e0 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20  se{.        upr 
227f0 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d  = idx-1;.      }
22800 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75  .      if( lwr>u
22810 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  pr ){.        br
22820 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
22830 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
22840 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
22850 31 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29  16)((lwr+upr)/2)
22860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
22870 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29  rt( lwr==upr+1 )
22880 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
22890 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
228a0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
228b0 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  af ){.      chld
228c0 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  Pg = 0;.    }els
228d0 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65  e if( lwr>=pPage
228e0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
228f0 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
22900 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
22910 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
22920 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
22930 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
22940 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
22950 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b  ll(pPage, lwr));
22960 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
22970 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  hldPg==0 ){.    
22980 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22990 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
229a0 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
229b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
229c0 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ell );.      if(
229d0 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20   pRes ) *pRes = 
229e0 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
229f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
22a00 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
22a10 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  h;.    }.    pCu
22a20 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
22a30 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72  Page] = (u16)lwr
22a40 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
22a50 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
22a60 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
22a70 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
22a80 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
22a90 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
22aa0 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
22ab0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f  o_finish;.  }.mo
22ac0 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72  veto_finish:.  r
22ad0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
22ae0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
22af0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
22b00 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
22b10 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
22b20 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
22b30 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
22b40 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
22b50 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
22b60 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
22b70 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
22b80 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
22b90 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
22ba0 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
22bb0 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
22bc0 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
22bd0 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
22be0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
22bf0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
22c00 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
22c10 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
22c20 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
22c30 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
22c40 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
22c50 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
22c60 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
22c70 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
22c80 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
22c90 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
22ca0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
22cb0 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
22cc0 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
22cd0 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
22ce0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
22cf0 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
22d00 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
22d10 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
22d20 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
22d30 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
22d40 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
22d50 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
22d60 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
22d70 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
22d80 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
22d90 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
22da0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
22db0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
22dc0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
22dd0 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
22de0 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
22df0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22e00 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
22e10 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
22e20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
22e30 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
22e40 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
22e50 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
22e60 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
22e70 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
22e80 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
22e90 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
22ea0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
22eb0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
22ec0 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
22ed0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
22ee0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
22ef0 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
22f00 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
22f10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
22f20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e   if( pCur->skip>
22f30 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
22f40 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  kip = 0;.    *pR
22f50 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
22f60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
22f70 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d  }.  pCur->skip =
22f80 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70   0;..  pPage = p
22f90 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22fa0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
22fb0 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
22fc0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
22fd0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
22fe0 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
22ff0 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e  t( idx<=pPage->n
23000 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d  Cell );..  pCur-
23010 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
23020 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
23030 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64  ey = 0;.  if( id
23040 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
23050 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
23060 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
23070 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
23080 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
23090 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
230a0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
230b0 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
230c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
230d0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
230e0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
230f0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
23100 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
23110 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  c;.    }.    do{
23120 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
23130 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
23140 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
23150 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
23160 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
23170 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
23180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
231a0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
231b0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
231c0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
231d0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
231e0 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69  }while( pCur->ai
231f0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
23200 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
23210 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
23220 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
23230 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
23240 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
23250 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
23260 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
23270 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23280 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OK;.    }.    re
23290 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
232a0 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRes = 0;.  if( 
232b0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
232c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
232d0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
232e0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
232f0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
23300 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65  c;.}.../*.** Ste
23310 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
23320 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
23330 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
23340 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
23350 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
23360 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
23370 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
23380 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
23390 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
233a0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
233b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
233c0 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
233d0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
233e0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
233f0 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
23400 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
23410 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
23420 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
23430 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
23440 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
23450 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
23460 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
23470 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
23480 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
23490 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
234a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
234b0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
234c0 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
234d0 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
234e0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
234f0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
23500 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
23510 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
23520 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20  f( pCur->skip<0 
23530 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
23540 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  p = 0;.    *pRes
23550 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
23560 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
23570 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
23580 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
23590 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
235a0 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
235b0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
235c0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
235d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
235e0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
235f0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
23600 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
23610 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
23620 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
23630 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20  age, idx)));.   
23640 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
23650 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
23660 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  }.    rc = moveT
23670 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
23680 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
23690 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
236a0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
236b0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
236c0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
236d0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
236e0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
236f0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
23700 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
23710 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23720 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
23730 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
23740 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
23750 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
23760 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
23770 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
23780 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
23790 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
237a0 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75  .    pPage = pCu
237b0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
237c0 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20  iPage];.    if( 
237d0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
237e0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
237f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23800 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
23810 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
23820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
23830 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
23840 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73     }.  }.  *pRes
23850 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
23860 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
23870 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
23880 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
23890 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
238a0 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61  e new page is ma
238b0 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
238c0 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
238d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
238e0 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65  te().** has alre
238f0 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
23900 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  on the new page.
23910 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  )  The new page 
23920 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e  has also.** been
23930 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20   referenced and 
23940 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
23950 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ine is responsib
23960 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a  le for calling.*
23970 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  * sqlite3PagerUn
23980 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77  ref() on the new
23990 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73   page when it is
239a0 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   done..**.** SQL
239b0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
239c0 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
239d0 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
239e0 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
239f0 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a  .** an error.  *
23a00 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e  ppPage and *pPgn
23a10 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20  o are undefined 
23a20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
23a30 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20  an error..** Do 
23a40 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  not invoke sqlit
23a50 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
23a60 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20  n *ppPage if an 
23a70 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
23a80 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
23a90 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74  "nearby" paramet
23aa0 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65  er is not 0, the
23ab0 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66 66  n a (feeble) eff
23ac0 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
23ad0 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
23ae0 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
23af0 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
23b00 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
23b10 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
23b20 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
23b30 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
23b40 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
23b50 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
23b60 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
23b70 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
23b80 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
23b90 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
23ba0 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70 61  f the "exact" pa
23bb0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
23bc0 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e  , and the page-n
23bd0 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78 69  umber nearby exi
23be0 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65  sts .** anywhere
23bf0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
23c00 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
23c10 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72  arenteed to be r
23c20 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
23c30 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
23c40 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
23c50 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f  abases when allo
23c60 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  cating a new tab
23c70 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
23c80 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
23c90 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
23ca0 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65  *pBt, .  MemPage
23cb0 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67   **ppPage, .  Pg
23cc0 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67  no *pPgno, .  Pg
23cd0 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20  no nearby,.  u8 
23ce0 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61  exact.){.  MemPa
23cf0 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
23d00 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20  t rc;.  u32 n;  
23d10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
23d20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
23d30 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b  elist */.  u32 k
23d40 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
23d50 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
23d60 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
23d70 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
23d80 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
23d90 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
23da0 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67  vTrunk = 0;.  Pg
23db0 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f  no mxPage;     /
23dc0 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
23dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23de0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
23df0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
23e00 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
23e10 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74  ;.  pPage1 = pBt
23e20 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61  ->pPage1;.  mxPa
23e30 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ge = pagerPageco
23e40 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20  unt(pBt);.  n = 
23e50 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
23e60 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
23e70 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50  testcase( n==mxP
23e80 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  age-1 );.  if( n
23e90 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  >=mxPage ){.    
23ea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
23eb0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
23ec0 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
23ed0 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
23ee0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
23ef0 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
23f00 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
23f10 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
23f20 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
23f30 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
23f40 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
23f50 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
23f60 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
23f70 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74      .    /* If t
23f80 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d  he 'exact' param
23f90 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e  eter was true an
23fa0 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
23fb0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
23fc0 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
23fd0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
23fe0 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
23ff0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
24000 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
24010 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
24020 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
24030 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
24040 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
24050 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
24060 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74 20  M.    if( exact 
24070 26 26 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67  && nearby<=mxPag
24080 65 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54  e ){.      u8 eT
24090 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ype;.      asser
240a0 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20  t( nearby>0 );. 
240b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
240c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
240d0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
240e0 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
240f0 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
24100 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
24110 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66  urn rc;.      if
24120 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
24130 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
24140 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
24150 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
24160 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62    *pPgno = nearb
24170 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  y;.    }.#endif.
24180 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
24190 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  t the free-list 
241a0 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20  count by 1. Set 
241b0 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e  iTrunk to the in
241c0 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  dex of the.    *
241d0 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73  * first free-lis
241e0 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50  t trunk page. iP
241f0 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74  revTrunk is init
24200 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a  ially 1..    */.
24210 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24220 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
24230 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
24240 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
24250 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74   rc;.    put4byt
24260 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
24270 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20  [36], n-1);..   
24280 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74   /* The code wit
24290 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  hin this loop is
242a0 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69   run only once i
242b0 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73  f the 'searchLis
242c0 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  t' variable.    
242d0 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20  ** is not true. 
242e0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75  Otherwise, it ru
242f0 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
24300 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74   trunk-page on t
24310 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c  he.    ** free-l
24320 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61  ist until the pa
24330 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  ge 'nearby' is l
24340 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ocated..    */. 
24350 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
24360 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
24370 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
24380 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
24390 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
243a0 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
243b0 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
243c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
243d0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
243e0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
243f0 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
24400 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24410 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
24420 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
24430 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  unk>mxPage ){.  
24440 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
24450 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
24460 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24470 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
24480 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
24490 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
244a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
244b0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
244c0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
244d0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
244e0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
244f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20     }..      k = 
24500 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
24510 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
24520 20 20 20 74 65 73 74 63 61 73 65 28 20 6b 3d 3d     testcase( k==
24530 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
24540 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 3b 0a  eSize/4 - 2) );.
24550 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
24560 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
24570 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
24580 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
24590 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
245a0 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
245b0 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
245c0 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
245d0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
245e0 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
245f0 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
24600 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
24610 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
24620 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
24630 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
24640 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24650 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
24660 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
24670 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
24680 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
24690 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
246a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
246b0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
246c0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
246d0 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
246e0 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
246f0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
24700 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
24710 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
24720 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
24730 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
24740 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
24750 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
24760 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
24770 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
24780 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70  se if( k>(u32)(p
24790 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
247a0 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20   - 2) ){.       
247b0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
247c0 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
247d0 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
247e0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
247f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
24800 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
24810 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
24820 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
24830 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
24840 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
24850 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
24860 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69  ist && nearby==i
24870 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
24880 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
24890 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
248a0 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
248b0 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
248c0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
248d0 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
248e0 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
248f0 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
24900 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
24910 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69  ssert( *pPgno==i
24920 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20  Trunk );.       
24930 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
24940 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
24950 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
24960 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
24970 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
24980 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
24990 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
249a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
249b0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
249c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
249d0 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
249e0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
249f0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
24a00 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
24a10 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
24a20 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
24a30 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
24a40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24a50 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
24a60 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
24a70 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
24a80 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
24a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
24aa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
24ab0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67  /* The trunk pag
24ac0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  e is required by
24ad0 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20   the caller but 
24ae0 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20  it contains .   
24af0 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
24b00 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20  rs to free-list 
24b10 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73  leaves. The firs
24b20 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61  t leaf becomes a
24b30 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20   trunk.         
24b40 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
24b50 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20   case..         
24b60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65   */.          Me
24b70 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b  mPage *pNewTrunk
24b80 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  ;.          Pgno
24b90 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74   iNewTrunk = get
24ba0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
24bb0 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
24bc0 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e      if( iNewTrun
24bd0 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20  k>mxPage ){ .   
24be0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
24bf0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
24c00 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
24c10 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
24c20 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
24c30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73   }.          tes
24c40 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b  tcase( iNewTrunk
24c50 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
24c60 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
24c70 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65  GetPage(pBt, iNe
24c80 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
24c90 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
24ca0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24cb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
24cc0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
24cd0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
24ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24cf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
24d00 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
24d10 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
24d20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
24d30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24d40 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
24d50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
24d60 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
24d70 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
24d80 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
24d90 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
24da0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
24db0 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
24dc0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
24dd0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
24de0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
24df0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
24e00 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
24e10 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
24e20 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
24e30 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
24e40 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
24e50 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
24e60 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
24e70 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
24e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
24e90 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
24ea0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
24eb0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge1->pDbPage) );
24ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
24ed0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
24ee0 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
24ef0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
24f00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
24f10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
24f20 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
24f30 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
24f40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
24f50 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
24f60 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
24f70 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
24f80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24f90 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
24fa0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
24fb0 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
24fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
24fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24fe0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
24ff0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
25000 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
25010 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
25020 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
25030 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
25040 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
25050 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
25060 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
25070 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
25080 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f  .        u32 clo
25090 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
250a0 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
250b0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
250c0 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
250d0 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
250e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
250f0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
25100 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
25110 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
25120 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
25130 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
25140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
25150 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
25160 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a           u32 i;.
25170 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69            int di
25180 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  st;.          cl
25190 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
251a0 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74 34       dist = get4
251b0 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
251c0 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
251d0 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20 29      if( dist<0 )
251e0 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20   dist = -dist;. 
251f0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
25200 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
25210 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
25220 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
25230 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
25240 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  by;.            
25250 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20  if( d2<0 ) d2 = 
25260 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -d2;.           
25270 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a   if( d2<dist ){.
25280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
25290 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
252a0 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
252b0 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
252c0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
252d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
252e0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
252f0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
25300 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
25310 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
25320 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
25330 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25340 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
25350 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61  .        if( iPa
25360 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  ge>mxPage ){.   
25370 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25380 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25390 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
253a0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
253b0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
253c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
253d0 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
253e0 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
253f0 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65  rchList || iPage
25400 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  ==nearby ){.    
25410 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74        int noCont
25420 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  ent;.          *
25430 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20  pPgno = iPage;. 
25440 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
25450 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
25460 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
25470 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
25480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
25490 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
254a0 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
254b0 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
254c0 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
254d0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
254e0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
254f0 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
25500 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
25510 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
25520 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
25530 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
25540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25550 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
25560 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
25570 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
25580 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
25590 65 61 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70 44  eable(pTrunk->pD
255a0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
255b0 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20      noContent = 
255c0 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74  !btreeGetHasCont
255d0 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  ent(pBt, *pPgno)
255e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
255f0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
25600 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
25610 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
25620 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
25630 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25640 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
25650 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
25660 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
25670 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
25680 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25690 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
256a0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
256b0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
256c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
256d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
256e0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
256f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
25700 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
25710 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
25720 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
25730 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
25740 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a  ( searchList );.
25750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
25760 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
25770 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
25780 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20  st, so create a 
25790 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a  new page at the.
257a0 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68      ** end of th
257b0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  e file */.    in
257c0 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50  t nPage = pagerP
257d0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
257e0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67     *pPgno = nPag
257f0 65 20 2b 20 31 3b 0a 0a 20 20 20 20 69 66 28 20  e + 1;..    if( 
25800 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f  *pPgno==PENDING_
25810 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
25820 7b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29  {.      (*pPgno)
25830 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ++;.    }..#ifnd
25840 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
25850 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
25860 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
25870 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
25880 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20  GE(pBt, *pPgno) 
25890 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
258a0 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
258b0 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
258c0 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
258d0 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
258e0 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
258f0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
25900 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
25910 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
25920 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
25930 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
25940 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
25950 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
25960 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
25970 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
25980 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
25990 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
259a0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
259b0 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
259c0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
259d0 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20  ", *pPgno));.   
259e0 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
259f0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
25a00 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
25a10 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
25a20 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
25a30 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  , &pPg, 0);.    
25a40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25a50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
25a60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25a70 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
25a80 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
25a90 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
25aa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
25ab0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
25ac0 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b  .      (*pPgno)+
25ad0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50  +;.      if( *pP
25ae0 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno==PENDING_BYT
25af0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 28  E_PAGE(pBt) ){ (
25b00 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20  *pPgno)++; }.   
25b10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61   }.#endif..    a
25b20 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
25b30 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
25b40 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20  (pBt) );.    rc 
25b50 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
25b60 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
25b70 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
25b80 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
25b90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25ba0 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
25bb0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
25bc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25bd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
25be0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
25bf0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
25c00 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
25c10 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
25c20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
25c30 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
25c40 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
25c50 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
25c60 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
25c70 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
25c80 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
25c90 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
25ca0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20  evTrunk);.  if( 
25cb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25cc0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
25cd0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
25ce0 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
25cf0 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
25d00 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
25d10 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
25d20 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
25d30 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
25d40 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73     (*ppPage)->is
25d50 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Init = 0;.  }els
25d60 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
25d70 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
25d80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
25d90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
25da0 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
25db0 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
25dc0 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
25dd0 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
25de0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
25df0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
25e00 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
25e10 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
25e20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
25e30 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
25e40 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
25e50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25e60 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
25e70 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
25e80 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
25e90 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
25ea0 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
25eb0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
25ec0 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
25ed0 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
25ee0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
25ef0 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
25f00 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
25f10 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
25f20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
25f30 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
25f40 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
25f50 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
25f60 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
25f70 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
25f80 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
25f90 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
25fa0 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
25fb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
25fc0 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
25fd0 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
25fe0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
25ff0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
26000 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
26010 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
26020 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
26030 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
26040 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
26050 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
26060 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
26070 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
26080 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
26090 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
260a0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
260b0 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
260c0 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
260d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
260e0 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
260f0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
26100 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
26110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26120 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
26130 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
26140 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26160 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
26170 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
26180 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
26190 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
261a0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
261b0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
261c0 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61  ( iPage>1 );.  a
261d0 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65  ssert( !pMemPage
261e0 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67   || pMemPage->pg
261f0 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20  no==iPage );..  
26200 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a  if( pMemPage ){.
26210 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d      pPage = pMem
26220 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Page;.    sqlite
26230 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d  3PagerRef(pPage-
26240 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c  >pDbPage);.  }el
26250 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  se{.    pPage = 
26260 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
26270 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d  pBt, iPage);.  }
26280 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
26290 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
262a0 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
262b0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
262c0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
262d0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
262e0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
262f0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72  epage_out;.  nFr
26300 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
26310 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
26320 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
26330 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
26340 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69 66  , nFree+1);..#if
26350 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
26360 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66  E_DELETE.  /* If
26370 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55   the SQLITE_SECU
26380 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c  RE_DELETE compil
26390 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
263a0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
263b0 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
263c0 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
263d0 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
263e0 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a  ith zeros..  */.
263f0 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
26400 20 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50   (rc = btreeGetP
26410 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
26420 26 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20 20  &pPage, 0))).   
26430 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 72  ||            (r
26440 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
26450 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
26460 50 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20 20  Page)).  ){.    
26470 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
26480 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  t;.  }.  memset(
26490 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
264a0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
264b0 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  eSize);.#endif..
264c0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
264d0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
264e0 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
264f0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
26500 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
26510 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
26520 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
26530 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
26540 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
26550 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
26560 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50  ut(pBt, iPage, P
26570 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
26580 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
26590 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
265a0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
265b0 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
265c0 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
265d0 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
265e0 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
265f0 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
26600 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
26610 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
26620 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
26630 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
26640 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
26650 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
26660 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
26670 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
26680 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
26690 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
266a0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
266b0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
266c0 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
266d0 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
266e0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
266f0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
26700 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
26710 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
26720 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
26730 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
26740 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
26750 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
26760 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 61 66  ){.    int nLeaf
26770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26780 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
26790 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
267a0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
267b0 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
267c0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
267d0 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
267e0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
267f0 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
26800 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
26810 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26820 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
26830 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
26840 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
26850 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
26860 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
26870 20 20 20 20 69 66 28 20 6e 4c 65 61 66 3c 30 20      if( nLeaf<0 
26880 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
26890 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
268a0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  T;.      goto fr
268b0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
268c0 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 3c  }.    if( nLeaf<
268d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
268e0 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
268f0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
26900 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20  here is room on 
26910 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74  the trunk page t
26920 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67  o insert the pag
26930 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  e.      ** being
26940 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20   freed as a new 
26950 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  leaf..      **. 
26960 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
26970 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
26980 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
26990 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
269a0 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
269b0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
269c0 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
269d0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
269e0 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
269f0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
26a00 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
26a10 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
26a20 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
26a30 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
26a40 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
26a50 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
26a60 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
26a70 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
26a80 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
26a90 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
26aa0 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
26ab0 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
26ac0 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
26ad0 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
26ae0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
26af0 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
26b00 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
26b10 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
26b20 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74  e will contain t
26b30 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e  o restrict the n
26b40 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
26b50 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   to usableSize/4
26b60 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f   - 8.      ** fo
26b70 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20  r now.  At some 
26b80 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
26b90 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f  ure (once everyo
26ba0 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a  ne has upgraded.
26bb0 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e        ** to 3.6.
26bc0 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73  0 or later) we s
26bd0 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66  hould consider f
26be0 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74  ixing the condit
26bf0 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20  ional above.    
26c00 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73    ** to read "us
26c10 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e  ableSize/4-2" in
26c20 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65  stead of "usable
26c30 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20  Size/4-8"..     
26c40 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
26c50 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
26c60 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
26c70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
26c80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26c90 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
26ca0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
26cb0 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20  , nLeaf+1);.    
26cc0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
26cd0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c  runk->aData[8+nL
26ce0 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a  eaf*4], iPage);.
26cf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53  #ifndef SQLITE_S
26d00 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
26d10 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29       if( pPage )
26d20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
26d30 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
26d40 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
26d50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
26d60 64 69 66 0a 20 20 20 20 20 20 20 20 72 63 20 3d  dif.        rc =
26d70 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
26d80 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b  ent(pBt, iPage);
26d90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
26da0 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
26db0 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
26dc0 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
26dd0 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
26de0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
26df0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
26e00 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
26e10 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c  /* If control fl
26e20 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ows to this poin
26e30 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e  t, then it was n
26e40 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ot possible to a
26e50 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  dd the.  ** the 
26e60 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
26e70 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20   as a leaf page 
26e80 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75  of the first tru
26e90 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
26ea0 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62  ist..  ** Possib
26eb0 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ly because the f
26ec0 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74  ree-list is empt
26ed0 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62  y, or possibly b
26ee0 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  ecause the .  **
26ef0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
26f00 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
26f10 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61   full. Either wa
26f20 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  y, the page bein
26f30 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c  g freed.  ** wil
26f40 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
26f50 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
26f60 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
26f70 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 20  st..  */.  if(  
26f80 20 28 28 21 70 50 61 67 65 29 20 26 26 20 28 30   ((!pPage) && (0
26f90 20 21 3d 20 28 72 63 20 3d 20 62 74 72 65 65 47   != (rc = btreeG
26fa0 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
26fb0 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 29 29  e, &pPage, 0))))
26fc0 0a 20 20 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  .     || (0 != (
26fd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
26fe0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
26ff0 62 50 61 67 65 29 29 29 0a 20 20 29 7b 0a 20 20  bPage))).  ){.  
27000 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
27010 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62  out;.  }.  put4b
27020 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
27030 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74  , iTrunk);.  put
27040 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
27050 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75  ata[4], 0);.  pu
27060 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
27070 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65  aData[32], iPage
27080 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45  );.  TRACE(("FRE
27090 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
270a0 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
270b0 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ing %d\n", pPage
270c0 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29  ->pgno, iTrunk))
270d0 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a  ;..freepage_out:
270e0 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
270f0 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
27100 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c  t = 0;.  }.  rel
27110 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
27120 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
27130 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e  Trunk);.  return
27140 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e   rc;.}.static in
27150 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  t freePage(MemPa
27160 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  ge *pPage){.  re
27170 74 75 72 6e 20 66 72 65 65 50 61 67 65 32 28 70  turn freePage2(p
27180 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65  Page->pBt, pPage
27190 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
271a0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
271b0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
271c0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
271d0 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e   the given Cell.
271e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
271f0 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65  learCell(MemPage
27200 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65   *pPage, unsigne
27210 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a  d char *pCell){.
27220 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
27230 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
27240 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
27250 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a   Pgno ovflPgno;.
27260 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
27270 6e 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76 66  nOvfl;.  u16 ovf
27280 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73  lPageSize;..  as
27290 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
272a0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
272b0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
272c0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
272d0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
272e0 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
272f0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30  nfo.iOverflow==0
27300 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
27310 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f  QLITE_OK;  /* No
27320 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
27330 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
27340 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  doing anything *
27350 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f  /.  }.  ovflPgno
27360 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
27370 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
27380 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w]);.  assert( p
27390 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e  Bt->usableSize >
273a0 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65   4 );.  ovflPage
273b0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
273c0 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f  leSize - 4;.  nO
273d0 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79  vfl = (info.nPay
273e0 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63  load - info.nLoc
273f0 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  al + ovflPageSiz
27400 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53  e - 1)/ovflPageS
27410 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ize;.  assert( o
27420 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f  vflPgno==0 || nO
27430 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  vfl>0 );.  while
27440 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
27450 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b   Pgno iNext = 0;
27460 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
27470 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  vfl = 0;.    if(
27480 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f   ovflPgno<2 || o
27490 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61 67  vflPgno>pagerPag
274a0 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
274b0 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74       /* 0 is not
274c0 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75   a legal page nu
274d0 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20  mber and page 1 
274e0 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20  cannot be an .  
274f0 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
27500 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20  page. Therefore 
27510 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72  if ovflPgno<2 or
27520 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
27530 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66   the .      ** f
27540 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ile the database
27550 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
27560 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
27570 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
27580 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
27590 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20   if( nOvfl ){.  
275a0 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
275b0 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76  flowPage(pBt, ov
275c0 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20  flPgno, &pOvfl, 
275d0 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69  &iNext);.      i
275e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
275f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
27600 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c  = freePage2(pBt,
27610 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f   pOvfl, ovflPgno
27620 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c  );.    if( pOvfl
27630 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27640 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
27650 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  l->pDbPage);.   
27660 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
27670 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f  return rc;.    o
27680 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b  vflPgno = iNext;
27690 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
276a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
276b0 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
276c0 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
276d0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
276e0 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
276f0 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
27700 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
27710 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
27720 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
27730 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
27740 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
27750 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
27760 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
27770 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
27780 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
27790 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
277a0 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
277b0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
277c0 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
277d0 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
277e0 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
277f0 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
27800 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
27810 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
27820 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
27830 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
27840 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
27850 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
27860 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
27870 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
27880 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
27890 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
278a0 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
278b0 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
278c0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
278d0 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
278e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
278f0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
27900 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
27910 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
27920 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
27930 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
27940 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
27950 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
27960 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
27970 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63  * The key */.  c
27980 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
27990 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a  ,int nData,   /*
279a0 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   The data */.  i
279b0 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
279c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
279d0 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65   Extra zero byte
279e0 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70  s to append to p
279f0 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  Data */.  int *p
27a00 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
27a10 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
27a20 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
27a30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
27a40 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
27a50 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
27a60 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
27a70 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
27a80 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
27a90 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
27aa0 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
27ab0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
27ac0 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
27ad0 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
27ae0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
27af0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
27b00 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
27b10 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  = 0;.  int nHead
27b20 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  er;.  CellInfo i
27b30 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  nfo;..  assert( 
27b40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
27b50 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
27b60 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70  utex) );..  /* p
27b70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  Page is not nece
27b80 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c  ssarily writeabl
27b90 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69  e since pCell mi
27ba0 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79  ght be auxiliary
27bb0 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61  .  ** buffer spa
27bc0 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72  ce that is separ
27bd0 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ate from the pPa
27be0 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a  ge buffer area *
27bf0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  /.  assert( pCel
27c00 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  l<pPage->aData |
27c10 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d  | pCell>=&pPage-
27c20 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
27c30 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
27c40 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
27c50 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
27c60 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
27c70 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
27c80 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e  e header. */.  n
27c90 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66  Header = 0;.  if
27ca0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
27cb0 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
27cc0 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   4;.  }.  if( pP
27cd0 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
27ce0 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
27cf0 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
27d00 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b  nHeader], nData+
27d10 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  nZero);.  }else{
27d20 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65  .    nData = nZe
27d30 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48  ro = 0;.  }.  nH
27d40 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
27d50 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
27d60 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79  r], *(u64*)&nKey
27d70 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43  );.  btreeParseC
27d80 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
27d90 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61  ell, &info);.  a
27da0 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61  ssert( info.nHea
27db0 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a  der==nHeader );.
27dc0 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
27dd0 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61  Key==nKey );.  a
27de0 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74  ssert( info.nDat
27df0 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e  a==(u32)(nData+n
27e00 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a  Zero) );.  .  /*
27e10 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79   Fill in the pay
27e20 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f  load */.  nPaylo
27e30 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65  ad = nData + nZe
27e40 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ro;.  if( pPage-
27e50 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70  >intKey ){.    p
27e60 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
27e70 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
27e80 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20     nData = 0;.  
27e90 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20  }else{ .    if( 
27ea0 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  nKey>0x7fffffff 
27eb0 7c 7c 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  || pKey==0 ){.  
27ec0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27ed0 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  E_CORRUPT;.    }
27ee0 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d  .    nPayload +=
27ef0 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20   (int)nKey;.    
27f00 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pSrc = pKey;.   
27f10 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65   nSrc = (int)nKe
27f20 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65  y;.  }.  *pnSize
27f30 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
27f40 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66   spaceLeft = inf
27f50 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79  o.nLocal;.  pPay
27f60 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
27f70 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72  eader];.  pPrior
27f80 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69   = &pCell[info.i
27f90 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68  Overflow];..  wh
27fa0 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
27fb0 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
27fc0 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Left==0 ){.#ifnd
27fd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
27fe0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
27ff0 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
28000 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
28010 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
28020 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
28030 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
28040 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
28050 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
28060 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
28070 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
28080 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
28090 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
280a0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
280b0 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
280c0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
280d0 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
280e0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
280f0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
28100 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
28110 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
28120 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
28130 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28140 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
28150 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
28160 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
28170 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
28180 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
28190 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
281a0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
281b0 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
281c0 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
281d0 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
281e0 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
281f0 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
28200 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
28210 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
28220 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
28230 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
28240 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
28250 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
28260 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
28270 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
28280 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
28290 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
282a0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
282b0 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
282c0 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
282d0 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
282e0 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
282f0 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
28300 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73   the uninitialis
28310 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
28320 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
28330 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
28340 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
28350 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
28360 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
28370 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
28380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28390 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
283a0 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
283b0 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
283c0 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
283d0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
283e0 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  t(pBt, pgnoOvfl,
283f0 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d   eType, pgnoPtrm
28400 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ap);.        if(
28410 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
28420 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
28430 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
28440 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
28450 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
28460 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
28470 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
28480 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
28490 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
284a0 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
284b0 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
284c0 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
284d0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
284e0 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
284f0 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
28500 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
28510 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
28520 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
28530 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
28540 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
28550 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
28560 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
28570 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
28580 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
28590 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
285a0 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
285b0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
285c0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
285d0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
285e0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
285f0 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
28600 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
28610 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
28620 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
28630 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
28640 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
28650 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
28660 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
28670 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
28680 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
28690 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
286a0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
286b0 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
286c0 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
286d0 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
286e0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
286f0 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
28700 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
28710 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
28720 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
28730 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
28740 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
28750 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
28760 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
28770 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
28780 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
28790 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
287a0 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
287b0 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
287c0 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
287d0 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
287e0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
287f0 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
28800 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
28810 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
28820 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
28830 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
28840 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
28850 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
28860 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
28870 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
28880 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
28890 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
288a0 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
288b0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
288c0 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
288d0 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
288e0 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
288f0 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
28900 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
28910 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
28920 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
28930 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
28940 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
28950 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
28960 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
28970 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
28980 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
28990 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
289a0 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
289b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
289c0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
289d0 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
289e0 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
289f0 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
28a00 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
28a10 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
28a20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
28a30 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
28a40 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
28a50 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
28a60 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
28a70 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
28a80 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
28a90 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
28aa0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28ab0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
28ac0 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
28ad0 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
28ae0 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
28af0 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
28b00 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
28b10 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
28b20 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
28b30 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
28b40 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
28b50 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
28b60 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
28b70 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
28b80 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
28b90 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
28ba0 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
28bb0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
28bc0 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
28bd0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
28be0 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
28bf0 74 69 63 20 69 6e 74 20 64 72 6f 70 43 65 6c 6c  tic int dropCell
28c00 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
28c10 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
28c20 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
28c30 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
28c40 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
28c50 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  ;         /* Off
28c60 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
28c70 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e  ent of cell bein
28c80 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75  g deleted */.  u
28c90 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  8 *data;       /
28ca0 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  * pPage->aData *
28cb0 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
28cc0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d      /* Used to m
28cd0 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64  ove bytes around
28ce0 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a   within data[] *
28cf0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
28d00 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
28d10 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
28d20 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
28d30 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
28d40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
28d50 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
28d60 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
28d70 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
28d80 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
28d90 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
28da0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
28db0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
28dc0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
28dd0 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
28de0 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20  >aData;.  ptr = 
28df0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c  &data[pPage->cel
28e00 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d  lOffset + 2*idx]
28e10 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  ;.  pc = get2byt
28e20 65 28 70 74 72 29 3b 0a 20 20 69 66 28 20 28 70  e(ptr);.  if( (p
28e30 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  c<pPage->hdrOffs
28e40 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61  et+6+(pPage->lea
28e50 66 3f 30 3a 34 29 29 0a 20 20 20 20 20 7c 7c 20  f?0:4)).     || 
28e60 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d 3e 70 42  (pc+sz>pPage->pB
28e70 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 20 29  t->usableSize) )
28e80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
28e90 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
28ea0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65  ;.  }.  rc = fre
28eb0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
28ec0 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 21  , sz);.  if( rc!
28ed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28ee0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
28ef0 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20  .  for(i=idx+1; 
28f00 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
28f10 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20  i++, ptr+=2){.  
28f20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32    ptr[0] = ptr[2
28f30 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20  ];.    ptr[1] = 
28f40 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50  ptr[3];.  }.  pP
28f50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20  age->nCell--;.  
28f60 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
28f70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
28f80 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
28f90 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
28fa0 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e  e += 2;.  return
28fb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
28fc0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
28fd0 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
28fe0 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
28ff0 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
29000 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
29010 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
29020 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
29030 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
29040 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
29050 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
29060 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
29070 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
29080 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
29090 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
290a0 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
290b0 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
290c0 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
290d0 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
290e0 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
290f0 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66  * in pPage->aOvf
29100 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20  l[] and make it 
29110 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c  point to the cel
29120 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65  l content (eithe
29130 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72  r.** in pTemp or
29140 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43   the original pC
29150 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65  ell) and also re
29160 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20  cord its index. 
29170 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61  .** Allocating a
29180 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50   new entry in pP
29190 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70  age->aCell[] imp
291a0 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50  lies that .** pP
291b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69  age->nOverflow i
291c0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a  s incremented..*
291d0 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73  *.** If nSkip is
291e0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
291f0 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20  do not copy the 
29200 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
29210 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c  s of the.** cell
29220 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
29230 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d  l overwrite them
29240 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
29250 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66  tion returns. If
29260 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e  .** nSkip is non
29270 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c  -zero, then pCel
29280 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20  l may not point 
29290 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65  to an invalid me
292a0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a  mory location .*
292b0 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b  * (but pCell+nSk
292c0 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ip is always val
292d0 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  id)..*/.static i
292e0 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20  nt insertCell(. 
292f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
29300 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20     /* Page into 
29310 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70  which we are cop
29320 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ying */.  int i,
29330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29340 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20  ew cell becomes 
29350 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66  the i-th cell of
29360 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
29370 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
29380 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
29390 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20  he new cell */. 
293a0 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20   int sz,        
293b0 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63     /* Bytes of c
293c0 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20  ontent in pCell 
293d0 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20  */.  u8 *pTemp, 
293e0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
293f0 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72  torage space for
29400 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65   pCell, if neede
29410 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69  d */.  Pgno iChi
29420 6c 64 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  ld       /* If n
29430 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65  on-zero, replace
29440 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 77   first 4 bytes w
29450 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a  ith this value *
29460 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20  /.){.  int idx; 
29470 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
29480 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
29490 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
294a0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
294b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
294c0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
294d0 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20    int end;      
294e0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
294f0 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  e past the last 
29500 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
29510 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
29520 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ins;          /*
29530 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d   Index in data[]
29540 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20   where new cell 
29550 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72  pointer is inser
29560 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ted */.  int cel
29570 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64  lOffset;   /* Ad
29580 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63  dress of first c
29590 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
295a0 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
295b0 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
295c0 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
295d0 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
295e0 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
295f0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72       /* Used for
29600 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74   moving informat
29610 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61  ion around in da
29620 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  ta[] */..  int n
29630 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f  Skip = (iChild ?
29640 20 34 20 3a 20 30 29 3b 0a 0a 20 20 61 73 73 65   4 : 0);..  asse
29650 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
29660 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
29670 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
29680 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
29690 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28  >nCell<=MX_CELL(
296a0 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d  pPage->pBt) && M
296b0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
296c0 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73  t)<=5460 );.  as
296d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
296e0 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a  erflow<=ArraySiz
296f0 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20  e(pPage->aOvfl) 
29700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
29710 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
29720 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  ge, pCell) );.  
29730 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
29740 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
29750 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
29760 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  .  if( pPage->nO
29770 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e  verflow || sz+2>
29780 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
29790 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b      if( pTemp ){
297a0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
297b0 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c  emp+nSkip, pCell
297c0 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
297d0 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
297e0 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20   pTemp;.    }.  
297f0 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
29800 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
29810 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20  Cell, iChild);. 
29820 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61     }.    j = pPa
29830 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b  ge->nOverflow++;
29840 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28  .    assert( j<(
29850 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67  int)(sizeof(pPag
29860 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66  e->aOvfl)/sizeof
29870 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d  (pPage->aOvfl[0]
29880 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  )) );.    pPage-
29890 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20  >aOvfl[j].pCell 
298a0 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61  = pCell;.    pPa
298b0 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78  ge->aOvfl[j].idx
298c0 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c   = (u16)i;.  }el
298d0 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  se{.    int rc =
298e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
298f0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
29900 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
29910 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29920 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
29930 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
29940 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
29950 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
29960 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64  DbPage) );.    d
29970 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
29980 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73  ta;.    cellOffs
29990 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
299a0 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20  Offset;.    end 
299b0 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
299c0 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
299d0 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66     ins = cellOff
299e0 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72  set + 2*i;.    r
299f0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  c = allocateSpac
29a00 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64  e(pPage, sz, &id
29a10 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  x);.    if( rc )
29a20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29a30 61 73 73 65 72 74 28 20 69 64 78 3e 3d 65 6e 64  assert( idx>=end
29a40 2b 32 20 29 3b 0a 20 20 20 20 69 66 28 20 69 64  +2 );.    if( id
29a50 78 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42  x+sz > pPage->pB
29a60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
29a70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
29a80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
29a90 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  T;.    }.    pPa
29aa0 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20  ge->nCell++;.   
29ab0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
29ac0 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a   (u16)(2 + sz);.
29ad0 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
29ae0 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65  [idx+nSkip], pCe
29af0 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
29b00 69 70 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68  ip);.    if( iCh
29b10 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
29b20 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d  4byte(&data[idx]
29b30 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
29b40 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2c 20  .    for(j=end, 
29b50 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e  ptr=&data[j]; j>
29b60 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d  ins; j-=2, ptr-=
29b70 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d  2){.      ptr[0]
29b80 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20   = ptr[-2];.    
29b90 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d    ptr[1] = ptr[-
29ba0 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  1];.    }.    pu
29bb0 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
29bc0 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
29bd0 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
29be0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
29bf0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
29c00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29c10 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
29c20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
29c30 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
29c40 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
29c50 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
29c60 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
29c70 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
29c80 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
29c90 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
29ca0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
29cb0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
29cc0 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
29cd0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
29ce0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
29cf0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
29d00 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
29d10 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
29d20 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
29d30 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c  dd a list of cel
29d40 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54  ls to a page.  T
29d50 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62  he page should b
29d60 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  e initially empt
29d70 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20  y..** The cells 
29d80 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
29d90 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  o fit on the pag
29da0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
29db0 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a  d assemblePage(.
29dc0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
29dd0 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ,   /* The page 
29de0 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64  to be assemblied
29df0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
29e00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
29e10 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
29e20 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61  o add to this pa
29e30 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
29e40 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  ell,      /* Poi
29e50 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f  nters to cell bo
29e60 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61  dies */.  u16 *a
29e70 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53  Size        /* S
29e80 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  izes of the cell
29e90 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
29ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
29eb0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
29ec0 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20   u8 *pCellptr;  
29ed0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
29ee0 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
29ef0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
29f00 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
29f10 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
29f20 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
29f30 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
29f40 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
29f50 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
29f60 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70  er to data for p
29f70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Page */.  const 
29f80 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
29f90 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
29fa0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
29fb0 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61  of header on pPa
29fc0 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ge */.  const in
29fd0 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67  t nUsable = pPag
29fe0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
29ff0 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69  ze; /* Usable si
2a000 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20  ze of page */.. 
2a010 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2a020 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
2a030 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a040 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2a050 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2a060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  );.  assert( nCe
2a070 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d  ll>=0 && nCell<=
2a080 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2a090 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70  Bt) && MX_CELL(p
2a0a0 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30  Page->pBt)<=5460
2a0b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2a0c0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2a0d0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2a0e0 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  Page) );..  /* C
2a0f0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
2a100 67 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ge has just been
2a110 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50   zeroed by zeroP
2a120 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72  age() */.  asser
2a130 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
2a140 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2a150 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2a160 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20  dr+5])==nUsable 
2a170 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d  );..  pCellptr =
2a180 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
2a190 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c  llOffset + nCell
2a1a0 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20  *2];.  cellbody 
2a1b0 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72  = nUsable;.  for
2a1c0 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30  (i=nCell-1; i>=0
2a1d0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65 6c  ; i--){.    pCel
2a1e0 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63  lptr -= 2;.    c
2a1f0 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a 65  ellbody -= aSize
2a200 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74  [i];.    put2byt
2a210 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c  e(pCellptr, cell
2a220 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70  body);.    memcp
2a230 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79  y(&data[cellbody
2a240 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53  ], apCell[i], aS
2a250 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70  ize[i]);.  }.  p
2a260 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2a270 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20  r+3], nCell);.  
2a280 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
2a290 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29  dr+5], cellbody)
2a2a0 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
2a2b0 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e   -= (nCell*2 + n
2a2c0 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64  Usable - cellbod
2a2d0 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  y);.  pPage->nCe
2a2e0 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b  ll = (u16)nCell;
2a2f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
2a300 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65  llowing paramete
2a310 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77  rs determine how
2a320 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70   many adjacent p
2a330 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65  ages get involve
2a340 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63  d.** in a balanc
2a350 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
2a360 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  NN is the number
2a370 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
2a380 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20   either side.** 
2a390 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
2a3a0 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
2a3b0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  the balancing op
2a3c0 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20  eration.  NB is 
2a3d0 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d  the.** total num
2a3e0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
2a3f0 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69  t participate, i
2a400 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72  ncluding the tar
2a410 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  get page and.** 
2a420 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  NN neighbors on 
2a430 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a  either side..**.
2a440 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76  ** The minimum v
2a450 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20  alue of NN is 1 
2a460 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e  (of course).  In
2a470 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76  creasing NN abov
2a480 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20  e 1.** (to 2 or 
2a490 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73  3) gives a modes
2a4a0 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e  t improvement in
2a4b0 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45   SELECT and DELE
2a4c0 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  TE performance.*
2a4d0 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f  * in exchange fo
2a4e0 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61  r a larger degra
2a4f0 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54  dation in INSERT
2a500 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66   and UPDATE perf
2a510 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
2a520 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65  value of NN appe
2a530 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20  ars to give the 
2a540 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65  best results ove
2a550 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rall..*/.#define
2a560 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20   NN 1           
2a570 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
2a580 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
2a590 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
2a5a0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28   */.#define NB (
2a5b0 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20  NN*2+1)      /* 
2a5c0 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f  Total pages invo
2a5d0 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  lved in the bala
2a5e0 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66  nce */...#ifndef
2a5f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
2a600 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20  CKBALANCE./*.** 
2a610 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
2a620 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65  balance() handle
2a630 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65  s the common spe
2a640 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a  cial case where.
2a650 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ** a new entry i
2a660 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
2a670 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20   on the extreme 
2a680 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65  right-end of the
2a690 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68  .** tree, in oth
2a6a0 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74  er words, when t
2a6b0 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c  he new entry wil
2a6c0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72  l become the lar
2a6d0 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  gest.** entry in
2a6e0 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
2a6f0 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69   Instead of tryi
2a700 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33  ng balance the 3
2a710 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
2a720 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64   pages, just add
2a730 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74  .** a new page t
2a740 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  o the right-hand
2a750 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68   side and put th
2a760 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20  e one new entry 
2a770 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e  in.** that page.
2a780 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68    This leaves th
2a790 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20  e right side of 
2a7a0 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61  the tree somewha
2a7b0 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e  t.** unbalanced.
2a7c0 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74    But odds are t
2a7d0 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69  hat we will be i
2a7e0 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74  nserting new ent
2a7f0 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65  ries.** at the e
2a800 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72  nd soon afterwar
2a810 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79  ds so the nearly
2a820 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c   empty page will
2a830 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c   quickly.** fill
2a840 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65   up.  On average
2a850 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73  ..**.** pPage is
2a860 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77   the leaf page w
2a870 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68  hich is the righ
2a880 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74  t-most page in t
2a890 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72  he tree..** pPar
2a8a0 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e  ent is its paren
2a8b0 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68  t.  pPage must h
2a8c0 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65  ave a single ove
2a8d0 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77  rflow entry.** w
2a8e0 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65  hich is also the
2a8f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
2a900 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  y on the page..*
2a910 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20  *.** The pSpace 
2a920 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20 74  buffer is used t
2a930 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72  o store a tempor
2a940 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ary copy of the 
2a950 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20  divider.** cell 
2a960 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73  that will be ins
2a970 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65  erted into pPare
2a980 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20  nt. Such a cell 
2a990 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a  consists of a 4.
2a9a0 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d  ** byte page num
2a9b0 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ber followed by 
2a9c0 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2a9d0 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74  h integer. In ot
2a9e0 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74  her.** words, at
2a9f0 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20   most 13 bytes. 
2aa00 48 65 6e 63 65 20 74 68 65 20 70 53 70 61 63 65  Hence the pSpace
2aa10 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
2aa20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62  at.** least 13 b
2aa30 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  ytes in size..*/
2aa40 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2aa50 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67  nce_quick(MemPag
2aa60 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50  e *pParent, MemP
2aa70 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
2aa80 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61  pSpace){.  BtSha
2aa90 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d  red *const pBt =
2aaa0 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20   pPage->pBt;    
2aab0 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62 61  /* B-Tree Databa
2aac0 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  se */.  MemPage 
2aad0 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
2aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aaf0 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
2ab00 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
2ab10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ab20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ab30 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
2ab40 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b  .  Pgno pgnoNew;
2ab50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab60 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2ab70 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a  number of pNew *
2ab80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
2ab90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2aba0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2abb0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2abc0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2abd0 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
2abe0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
2abf0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2ac00 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20  verflow==1 );.. 
2ac10 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
2ac20 6c 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l<=0 ) return SQ
2ac30 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2ac40 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  T;..  /* Allocat
2ac50 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68  e a new page. Th
2ac60 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
2ac70 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73 69  ome the right-si
2ac80 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70  bling of .  ** p
2ac90 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70  Page. Make the p
2aca0 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74 61  arent page writa
2acb0 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65  ble, so that the
2acc0 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
2acd0 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  l.  ** may be in
2ace0 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20  serted. If both 
2acf0 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73  these operations
2ad00 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c   are successful,
2ad10 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
2ad20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2ad30 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
2ad40 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c  ew, &pgnoNew, 0,
2ad50 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d   0);..  if( rc==
2ad60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20  SQLITE_OK ){..  
2ad70 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53    u8 *pOut = &pS
2ad80 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20  pace[4];.    u8 
2ad90 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e  *pCell = pPage->
2ada0 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a  aOvfl[0].pCell;.
2adb0 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d      u16 szCell =
2adc0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2add0 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
2ade0 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20  u8 *pStop;..    
2adf0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2ae00 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2ae10 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29  pNew->pDbPage) )
2ae20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2ae30 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28  age->aData[0]==(
2ae40 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
2ae50 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  EAFDATA|PTF_LEAF
2ae60 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  ) );.    zeroPag
2ae70 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b  e(pNew, PTF_INTK
2ae80 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  EY|PTF_LEAFDATA|
2ae90 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61  PTF_LEAF);.    a
2aea0 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
2aeb0 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a  , 1, &pCell, &sz
2aec0 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  Cell);..    /* I
2aed0 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
2aee0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
2aef0 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
2af00 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a  inter map.    **
2af10 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f   with entries fo
2af20 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20  r the new page, 
2af30 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20  and any pointer 
2af40 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a  from the .    **
2af50 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67   cell on the pag
2af60 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e to an overflow
2af70 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65 72   page. If either
2af80 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a   of these.    **
2af90 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c   operations fail
2afa0 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  s, the return co
2afb0 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20 74  de is set, but t
2afc0 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20  he contents.    
2afd0 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ** of the parent
2afe0 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20   page are still 
2aff0 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74  manipulated by t
2b000 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20  hh code below.. 
2b010 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b     ** That is Ok
2b020 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  , at this point 
2b030 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2b040 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2b050 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65  .    ** be marke
2b060 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74 75  d as dirty. Retu
2b070 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
2b080 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61  ode will cause a
2b090 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  .    ** rollback
2b0a0 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68  , undoing any ch
2b0b0 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68  anges made to th
2b0c0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
2b0d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53     */.    if( IS
2b0e0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2b0f0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2b100 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
2b110 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2b120 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20  Parent->pgno);. 
2b130 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e       if( szCell>
2b140 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 26  pNew->minLocal &
2b150 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2b160 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2b170 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
2b180 28 70 4e 65 77 2c 20 70 43 65 6c 6c 29 3b 0a 20  (pNew, pCell);. 
2b190 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
2b1a0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
2b1b0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20  divider cell to 
2b1c0 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72  insert into pPar
2b1d0 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72  ent. The divider
2b1e0 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e   cell.    ** con
2b1f0 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74  sists of a 4-byt
2b200 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74  e page number (t
2b210 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
2b220 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20  f pPage) and.   
2b230 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c   ** a variable l
2b240 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20  ength key value 
2b250 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 74  (which must be t
2b260 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73  he same value as
2b270 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67   the.    ** larg
2b280 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65  est key on pPage
2b290 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
2b2a0 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72   To find the lar
2b2b0 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f  gest key value o
2b2c0 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20 66  n pPage, first f
2b2d0 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  ind the right-mo
2b2e0 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  st .    ** cell 
2b2f0 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66 69  on pPage. The fi
2b300 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f  rst two fields o
2b310 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20  f this cell are 
2b320 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f  the .    ** reco
2b330 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72  rd-length (a var
2b340 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
2b350 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d  eger at most 32-
2b360 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20  bits in size).  
2b370 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79    ** and the key
2b380 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61 62   value (a variab
2b390 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
2b3a0 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20  r, may have any 
2b3b0 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54  value)..    ** T
2b3c0 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20  he first of the 
2b3d0 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73  while(...) loops
2b3e0 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65   below skips ove
2b3f0 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e  r the record-len
2b400 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  gth.    ** field
2b410 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69  . The second whi
2b420 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70  le(...) loop cop
2b430 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75  ies the key valu
2b440 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  e from the.    *
2b450 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  * cell on pPage 
2b460 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65 20  into the pSpace 
2b470 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  buffer..    */. 
2b480 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2b490 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65  ell(pPage, pPage
2b4a0 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20  ->nCell-1);.    
2b4b0 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
2b4c0 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
2b4d0 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20  (pCell++)&0x80) 
2b4e0 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29  && pCell<pStop )
2b4f0 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70  ;.    pStop = &p
2b500 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Cell[9];.    whi
2b510 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20  le( ((*(pOut++) 
2b520 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78  = *(pCell++))&0x
2b530 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
2b540 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  op );..    /* In
2b550 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69 76  sert the new div
2b560 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70  ider cell into p
2b570 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69  Parent. */.    i
2b580 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
2b590 74 2c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  t,pParent->nCell
2b5a0 2c 70 53 70 61 63 65 2c 28 69 6e 74 29 28 70 4f  ,pSpace,(int)(pO
2b5b0 75 74 2d 70 53 70 61 63 65 29 2c 30 2c 70 50 61  ut-pSpace),0,pPa
2b5c0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20  ge->pgno);..    
2b5d0 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74  /* Set the right
2b5e0 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f  -child pointer o
2b5f0 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69  f pParent to poi
2b600 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  nt to the new pa
2b610 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  ge. */.    put4b
2b620 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
2b630 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2b640 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
2b650 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52  ew);.  .    /* R
2b660 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
2b670 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20  ence to the new 
2b680 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c  page. */.    rel
2b690 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
2b6a0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2b6b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2b6c0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
2b6d0 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30  ALANCE */..#if 0
2b6e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2b6f0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f  tion does not co
2b700 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e  ntribute anythin
2b710 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  g to the operati
2b720 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  on of SQLite..**
2b730 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73   it is sometimes
2b740 20 61 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f   activated tempo
2b750 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62  rarily while deb
2b760 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70  ugging code resp
2b770 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20  onsible .** for 
2b780 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d  setting pointer-
2b790 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  map entries..*/.
2b7a0 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
2b7b0 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50  pCheckPages(MemP
2b7c0 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e  age **apPage, in
2b7d0 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  t nPage){.  int 
2b7e0 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  i, j;.  for(i=0;
2b7f0 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a   i<nPage; i++){.
2b800 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20      Pgno n;.    
2b810 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67  u8 e;.    MemPag
2b820 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67  e *pPage = apPag
2b830 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72  e[i];.    BtShar
2b840 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
2b850 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
2b860 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2b870 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  );..    for(j=0;
2b880 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   j<pPage->nCell;
2b890 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c   j++){.      Cel
2b8a0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
2b8b0 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20    u8 *z;.     . 
2b8c0 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c       z = findCel
2b8d0 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20  l(pPage, j);.   
2b8e0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
2b8f0 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26  lPtr(pPage, z, &
2b900 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  info);.      if(
2b910 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
2b920 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
2b930 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
2b940 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  &z[info.iOverflo
2b950 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  w]);.        ptr
2b960 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c  mapGet(pBt, ovfl
2b970 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
2b980 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
2b990 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
2b9a0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
2b9b0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
2b9c0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2b9d0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  af ){.        Pg
2b9e0 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
2b9f0 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  yte(z);.        
2ba00 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63  ptrmapGet(pBt, c
2ba10 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  hild, &e, &n);. 
2ba20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2ba30 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
2ba40 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45   e==PTRMAP_BTREE
2ba50 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
2ba60 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  }.    if( !pPage
2ba70 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2ba80 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74  Pgno child = get
2ba90 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2baa0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2bab0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20  fset+8]);.      
2bac0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63  ptrmapGet(pBt, c
2bad0 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  hild, &e, &n);. 
2bae0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
2baf0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
2bb00 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
2bb10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2bb20 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
2bb30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2bb40 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
2bb50 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   copy the conten
2bb60 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ts of the b-tree
2bb70 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a   node stored .**
2bb80 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74   on page pFrom t
2bb90 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70  o page pTo. If p
2bba0 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f  age pFrom was no
2bbb0 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74  t a leaf page, t
2bbc0 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  hen.** the point
2bbd0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
2bbe0 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20 70 61  or each child pa
2bbf0 67 65 20 61 72 65 20 75 70 64 61 74 65 64 20 73  ge are updated s
2bc00 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  o that the.** pa
2bc10 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64  rent page stored
2bc20 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20   in the pointer 
2bc30 6d 61 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e  map is page pTo.
2bc40 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69   If pFrom contai
2bc50 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73  ned.** any cells
2bc60 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70   with overflow p
2bc70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68  age pointers, th
2bc80 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  en the correspon
2bc90 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ding pointer.** 
2bca0 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72 65 20  map entries are 
2bcb0 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20  also updated so 
2bcc0 74 68 61 74 20 74 68 65 20 70 61 72 65 6e 74 20  that the parent 
2bcd0 70 61 67 65 20 69 73 20 70 61 67 65 20 70 54 6f  page is page pTo
2bce0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
2bcf0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61   is currently ca
2bd00 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66  rrying any overf
2bd10 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69  low cells (entri
2bd20 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d  es in the.** Mem
2bd30 50 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72 72  Page.aOvfl[] arr
2bd40 61 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f  ay), they are no
2bd50 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e  t copied to pTo.
2bd60 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72   .**.** Before r
2bd70 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70  eturning, page p
2bd80 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69  To is reinitiali
2bd90 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65 65 49  zed using btreeI
2bda0 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a  nitPage()..**.**
2bdb0 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   The performance
2bdc0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2bdd0 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61  n is not critica
2bde0 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73  l. It is only us
2bdf0 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61  ed by .** the ba
2be00 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28  lance_shallower(
2be10 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65  ) and balance_de
2be20 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65  eper() procedure
2be30 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a  s, neither of.**
2be40 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65   which are calle
2be50 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f  d often under no
2be60 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63  rmal circumstanc
2be70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2be80 74 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  t copyNodeConten
2be90 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d  t(MemPage *pFrom
2bea0 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 29 7b  , MemPage *pTo){
2beb0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f  .  BtShared * co
2bec0 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d  nst pBt = pFrom-
2bed0 3e 70 42 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  >pBt;.  u8 * con
2bee0 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d  st aFrom = pFrom
2bef0 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20  ->aData;.  u8 * 
2bf00 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d  const aTo = pTo-
2bf10 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 63 6f  >aData;.  int co
2bf20 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70  nst iFromHdr = p
2bf30 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b  From->hdrOffset;
2bf40 0a 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f  .  int const iTo
2bf50 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e  Hdr = ((pTo->pgn
2bf60 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29  o==1) ? 100 : 0)
2bf70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2bf80 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 44  ITE_OK;.  int iD
2bf90 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ata;..  assert( 
2bfa0 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b  pFrom->isInit );
2bfb0 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d  .  assert( pFrom
2bfc0 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20  ->nFree>=iToHdr 
2bfd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65 74  );.  assert( get
2bfe0 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72  2byte(&aFrom[iFr
2bff0 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e  omHdr+5])<=pBt->
2c000 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20  usableSize );.. 
2c010 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74   /* Copy the b-t
2c020 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74  ree node content
2c030 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d   from page pFrom
2c040 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f   to page pTo. */
2c050 0a 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62  .  iData = get2b
2c060 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  yte(&aFrom[iFrom
2c070 48 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70  Hdr+5]);.  memcp
2c080 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26  y(&aTo[iData], &
2c090 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42  aFrom[iData], pB
2c0a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44  t->usableSize-iD
2c0b0 61 74 61 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  ata);.  memcpy(&
2c0c0 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46  aTo[iToHdr], &aF
2c0d0 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70  rom[iFromHdr], p
2c0e0 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  From->cellOffset
2c0f0 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c   + 2*pFrom->nCel
2c100 6c 29 3b 0a 0a 20 20 2f 2a 20 52 65 69 6e 69 74  l);..  /* Reinit
2c110 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20  ialize page pTo 
2c120 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  so that the cont
2c130 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  ents of the MemP
2c140 61 67 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  age structure.  
2c150 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  ** match the new
2c160 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69   data. The initi
2c170 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f  alization of pTo
2c180 20 22 63 61 6e 6e 6f 74 22 20 66 61 69 6c 2c 20   "cannot" fail, 
2c190 61 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  as the.  ** data
2c1a0 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 70 46 72   copied from pFr
2c1b0 6f 6d 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62  om is known to b
2c1c0 65 20 76 61 6c 69 64 2e 20 20 2a 2f 0a 20 20 70  e valid.  */.  p
2c1d0 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  To->isInit = 0;.
2c1e0 20 20 54 45 53 54 4f 4e 4c 59 28 72 63 20 3d 20    TESTONLY(rc = 
2c1f0 29 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  ) btreeInitPage(
2c200 70 54 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  pTo);.  assert( 
2c210 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2c220 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
2c230 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
2c240 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
2c250 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  e the pointer-ma
2c260 70 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 66  p entries.  ** f
2c270 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72  or any b-tree or
2c280 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
2c290 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e  that pTo now con
2c2a0 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
2c2b0 72 73 20 74 6f 2e 20 2a 2f 0a 20 20 69 66 28 20  rs to. */.  if( 
2c2c0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2c2d0 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
2c2e0 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20  dPtrmaps(pTo);. 
2c2f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2c300 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2c310 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
2c320 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  tes cells on the
2c330 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20 63   iParentIdx'th c
2c340 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a  hild of pParent.
2c350 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22 74  ** (hereafter "t
2c360 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75 70  he page") and up
2c370 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73   to 2 siblings s
2c380 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
2c390 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a   have about the.
2c3a0 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f  ** same amount o
2c3b0 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55 73  f free space. Us
2c3c0 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73  ually a single s
2c3d0 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72  ibling on either
2c3e0 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20   side of the.** 
2c3f0 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69 6e  page are used in
2c400 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20   the balancing, 
2c410 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c  though both sibl
2c420 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20  ings might come 
2c430 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65  from one.** side
2c440 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
2c450 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73  the first or las
2c460 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70  t child of its p
2c470 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61  arent. If the pa
2c480 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72  ge .** has fewer
2c490 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73   than 2 siblings
2c4a0 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63   (something whic
2c4b0 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
2c4c0 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a  n if the page.**
2c4d0 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20   is a root page 
2c4e0 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20  or a child of a 
2c4f0 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20  root page) then 
2c500 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69  all available si
2c510 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63  blings.** partic
2c520 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
2c530 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ancing..**.** Th
2c540 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  e number of sibl
2c550 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65  ings of the page
2c560 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
2c570 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64  sed or decreased
2c580 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74   by .** one or t
2c590 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  wo in an effort 
2c5a0 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65  to keep pages ne
2c5b0 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f  arly full but no
2c5c0 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a  t over full. .**
2c5d0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68  .** Note that wh
2c5e0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2c5f0 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20  is called, some 
2c600 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
2c610 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68  the page.** migh
2c620 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
2c630 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50  e stored in MemP
2c640 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69  age.aData[]. Thi
2c650 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20  s can happen.** 
2c660 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
2c670 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f  verfull. This ro
2c680 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
2c690 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c  at all cells all
2c6a0 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  ocated.** to the
2c6b0 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
2c6c0 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20  blings fit into 
2c6d0 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20  MemPage.aData[] 
2c6e0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2c6f0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
2c700 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69  ourse of balanci
2c710 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  ng the page and 
2c720 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65  its siblings, ce
2c730 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e  lls may be.** in
2c740 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72  serted into or r
2c750 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
2c760 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50 61  parent page (pPa
2c770 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a  rent). Doing so.
2c780 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ** may cause the
2c790 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20   parent page to 
2c7a0 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
2c7b0 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66  or underfull. If
2c7c0 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73   this.** happens
2c7d0 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  , it is the resp
2c7e0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
2c7f0 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f  e caller to invo
2c800 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  ke the correct.*
2c810 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  * balancing rout
2c820 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73 20  ine to fix this 
2c830 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65  problem (see the
2c840 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69   balance() routi
2c850 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ne). .**.** If t
2c860 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
2c870 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
2c880 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65  , it might leave
2c890 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
2c8a0 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20   in a corrupted 
2c8b0 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69  state. So if thi
2c8c0 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c  s routine fails,
2c8d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
2c8e0 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65  ould.** be rolle
2c8f0 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
2c900 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
2c910 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2c920 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69  n, aOvflSpace, i
2c930 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2c940 0a 2a 2a 20 62 75 66 66 65 72 20 70 61 67 65 2d  .** buffer page-
2c950 73 69 7a 65 20 62 79 74 65 73 20 69 6e 20 73 69  size bytes in si
2c960 7a 65 2e 20 49 66 2c 20 69 6e 20 69 6e 73 65 72  ze. If, in inser
2c970 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ting cells into 
2c980 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61  the parent.** pa
2c990 67 65 20 28 70 50 61 72 65 6e 74 29 2c 20 74 68  ge (pParent), th
2c9a0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62 65  e parent page be
2c9b0 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20  comes overfull, 
2c9c0 74 68 69 73 20 62 75 66 66 65 72 20 69 73 0a 2a  this buffer is.*
2c9d0 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
2c9e0 74 68 65 20 70 61 72 65 6e 74 73 20 6f 76 65 72  the parents over
2c9f0 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61  flow cells. Beca
2ca00 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  use this functio
2ca10 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d  n inserts.** a m
2ca20 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64  aximum of four d
2ca30 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
2ca40 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2ca50 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  e, and the maxim
2ca60 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20  um.** size of a 
2ca70 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68  cell stored with
2ca80 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  in an internal n
2ca90 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65  ode is always le
2caa0 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f  ss than 1/4.** o
2cab0 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  f the page-size,
2cac0 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
2cad0 5d 20 62 75 66 66 65 72 20 69 73 20 67 75 61 72  ] buffer is guar
2cae0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72  anteed to be lar
2caf0 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72  ge.** enough for
2cb00 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65   all overflow ce
2cb10 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f  lls..**.** If aO
2cb20 76 66 6c 53 70 61 63 65 20 69 73 20 73 65 74 20  vflSpace is set 
2cb30 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  to a null pointe
2cb40 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
2cb50 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
2cb60 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74  ITE_NOMEM..*/.st
2cb70 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2cb80 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50  _nonroot(.  MemP
2cb90 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  age *pParent,   
2cba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2cbb0 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69  arent page of si
2cbc0 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c  blings being bal
2cbd0 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anced */.  int i
2cbe0 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20  ParentIdx,      
2cbf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2cc00 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 67 65  dex of "the page
2cc10 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  " in pParent */.
2cc20 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65    u8 *aOvflSpace
2cc30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2cc40 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62    /* page-size b
2cc50 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
2cc60 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f  r parent ovfl */
2cc70 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 20 20 20  .  int isRoot   
2cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc90 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
2cca0 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d  arent is a root-
2ccb0 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  page */.){.  BtS
2ccc0 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
2ccd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2cce0 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20   whole database 
2ccf0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d  */.  int nCell =
2cd00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2cd10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2cd20 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
2cd30 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65   */.  int nMaxCe
2cd40 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lls = 0;        
2cd50 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
2cd60 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20  size of apCell, 
2cd70 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a  szCell, aFrom. *
2cd80 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30  /.  int nNew = 0
2cd90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cda0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2cdb0 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  ges in apNew[] *
2cdc0 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20  /.  int nOld;   
2cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cde0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2cdf0 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  ges in apOld[] *
2ce00 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  /.  int i, j, k;
2ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2ce30 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76  s */.  int nxDiv
2ce40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ce50 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69      /* Next divi
2ce60 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72  der slot in pPar
2ce70 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a  ent->aCell[] */.
2ce80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ce90 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
2cea0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
2ceb0 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66 43  e */.  u16 leafC
2cec0 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20  orrection;      
2ced0 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67      /* 4 if pPag
2cee0 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20  e is a leaf.  0 
2cef0 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20  if not */.  int 
2cf00 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20  leafData;       
2cf10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2cf20 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
2cf30 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54  eaf of a LEAFDAT
2cf40 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  A tree */.  int 
2cf50 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20  usableSpace;    
2cf60 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
2cf70 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e  s in pPage beyon
2cf80 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  d the header */.
2cf90 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b    int pageFlags;
2cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cfb0 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65  * Value of pPage
2cfc0 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20  ->aData[0] */.  
2cfd0 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20  int subtotal;   
2cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cff0 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65  Subtotal of byte
2d000 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e  s in cells on on
2d010 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
2d020 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20  iSpace1 = 0;    
2d030 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2d040 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
2d050 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20   aSpace1[] */.  
2d060 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d  int iOvflSpace =
2d070 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
2d080 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
2d090 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b  e of aOvflSpace[
2d0a0 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72  ] */.  int szScr
2d0b0 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
2d0c0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
2d0d0 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65  cratch memory re
2d0e0 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d  quested */.  Mem
2d0f0 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b  Page *apOld[NB];
2d100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61            /* pPa
2d110 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f  ge and up to two
2d120 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d   siblings */.  M
2d130 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e  emPage *apCopy[N
2d140 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  B];         /* P
2d150 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66  rivate copies of
2d160 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a   apOld[] pages *
2d170 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e  /.  MemPage *apN
2d180 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
2d190 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
2d1a0 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20   to NB siblings 
2d1b0 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20  after balancing 
2d1c0 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b  */.  u8 *pRight;
2d1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1e0 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e    /* Location in
2d1f0 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74   parent of right
2d200 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72  -sibling pointer
2d210 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b   */.  u8 *apDiv[
2d220 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20  NB-1];          
2d230 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65     /* Divider ce
2d240 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  lls in pParent *
2d250 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e  /.  int cntNew[N
2d260 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B+2];           
2d270 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65   /* Index in aCe
2d280 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74  ll[] of cell aft
2d290 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  er i-th page */.
2d2a0 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32    int szNew[NB+2
2d2b0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
2d2c0 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20  * Combined size 
2d2d0 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f  of cells place o
2d2e0 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  n i-th page */. 
2d2f0 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30   u8 **apCell = 0
2d300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2d310 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e   All cells begin
2d320 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75   balanced */.  u
2d330 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  16 *szCell;     
2d340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2d350 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
2d360 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
2d370 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61  [] */.  u8 *aSpa
2d380 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  ce1;            
2d390 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
2d3a0 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69  r copies of divi
2d3b0 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  ders cells */.  
2d3c0 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
2d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d3e0 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f 72  Temp var to stor
2d3f0 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  e a page number 
2d400 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70  in */..  pBt = p
2d410 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61  Parent->pBt;.  a
2d420 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2d430 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2d440 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2d450 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2d460 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
2d470 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
2d480 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45 28 28  .#if 0.  TRACE((
2d490 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20  "BALANCE: begin 
2d4a0 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66  page %d child of
2d4b0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
2d4c0 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  gno, pParent->pg
2d4d0 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  no));.#endif..  
2d4e0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
2d4f0 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61 76   pParent may hav
2d500 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76  e at most one ov
2d510 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64  erflow cell. And
2d520 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76   if.  ** this ov
2d530 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70  erflow cell is p
2d540 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74 20  resent, it must 
2d550 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  be the cell with
2d560 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50 61   .  ** index iPa
2d570 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73 63  rentIdx. This sc
2d580 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f  enario comes abo
2d590 75 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ut when this fun
2d5a0 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61  ction.  ** is ca
2d5b0 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c 79  lled (indirectly
2d5c0 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  ) from sqlite3Bt
2d5d0 72 65 65 44 65 6c 65 74 65 28 29 2e 20 2a 2f 0a  reeDelete(). */.
2d5e0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
2d5f0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  t->nOverflow==0 
2d600 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  || pParent->nOve
2d610 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73  rflow==1 );.  as
2d620 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e  sert( pParent->n
2d630 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70  Overflow==0 || p
2d640 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d  Parent->aOvfl[0]
2d650 2e 69 64 78 3d 3d 69 50 61 72 65 6e 74 49 64 78  .idx==iParentIdx
2d660 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66   );..  if( !aOvf
2d670 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65  lSpace ){.    re
2d680 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2d690 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  M;.  }..  /* Fin
2d6a0 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  d the sibling pa
2d6b0 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20  ges to balance. 
2d6c0 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  Also locate the 
2d6d0 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
2d6e0 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69   .  ** that divi
2d6f0 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e  de the siblings.
2d700 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
2d710 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73  ade to find NN s
2d720 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a  iblings on .  **
2d730 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
2d740 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c  pPage. More sibl
2d750 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66  ings are taken f
2d760 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f  rom one side, ho
2d770 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20  wever, .  ** if 
2d780 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20  there are fewer 
2d790 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73  than NN siblings
2d7a0 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69   on the other si
2d7b0 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20  de. If pParent. 
2d7c0 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65   ** has NB or fe
2d7d0 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65  wer children the
2d7e0 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  n all children o
2d7f0 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61  f pParent are ta
2d800 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ken.  .  **.  **
2d810 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
2d820 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64 65  drops the divide
2d830 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65  r cells from the
2d840 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68   parent page. Th
2d850 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65  is.  ** way, the
2d860 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
2d870 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
2d880 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c  not have to deal
2d890 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f   with any.  ** o
2d8a0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e  verflow cells in
2d8b0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2d8c0 2c 20 61 73 20 69 66 20 6f 6e 65 20 65 78 69 73  , as if one exis
2d8d0 74 65 64 20 69 74 20 68 61 73 20 61 6c 72 65 61  ted it has alrea
2d8e0 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 72 65 6d  dy.  ** been rem
2d8f0 6f 76 65 64 2e 20 20 2a 2f 0a 20 20 69 20 3d 20  oved.  */.  i = 
2d900 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2d910 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43  ow + pParent->nC
2d920 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20 29  ell;.  if( i<2 )
2d930 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b  {.    nxDiv = 0;
2d940 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b  .    nOld = i+1;
2d950 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f  .  }else{.    nO
2d960 6c 64 20 3d 20 33 3b 0a 20 20 20 20 69 66 28 20  ld = 3;.    if( 
2d970 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b  iParentIdx==0 ){
2d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d990 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20   .      nxDiv = 
2d9a0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
2d9b0 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29   iParentIdx==i )
2d9c0 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  {.      nxDiv = 
2d9d0 69 2d 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  i-2;.    }else{.
2d9e0 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50        nxDiv = iP
2d9f0 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20  arentIdx-1;.    
2da00 7d 0a 20 20 20 20 69 20 3d 20 32 3b 0a 20 20 7d  }.    i = 2;.  }
2da10 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69 76 2d  .  if( (i+nxDiv-
2da20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2da30 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  ow)==pParent->nC
2da40 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69 67 68  ell ){.    pRigh
2da50 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61 44  t = &pParent->aD
2da60 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2da70 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c  Offset+8];.  }el
2da80 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d  se{.    pRight =
2da90 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e   findCell(pParen
2daa0 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
2dab0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a  nt->nOverflow);.
2dac0 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74    }.  pgno = get
2dad0 34 62 79 74 65 28 70 52 69 67 68 74 29 3b 0a 20  4byte(pRight);. 
2dae0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
2daf0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
2db00 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
2db10 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  &apOld[i]);.    
2db20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2db30 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c  memset(apOld, 0,
2db40 20 69 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67   i*sizeof(MemPag
2db50 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  e*));.      goto
2db60 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2db70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78  ;.    }.    nMax
2db80 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64  Cells += 1+apOld
2db90 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64  [i]->nCell+apOld
2dba0 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  [i]->nOverflow;.
2dbb0 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30      if( (i--)==0
2dbc0 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69   ) break;..    i
2dbd0 66 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  f( pParent->nOve
2dbe0 72 66 6c 6f 77 20 26 26 20 69 2b 6e 78 44 69 76  rflow && i+nxDiv
2dbf0 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c  ==pParent->aOvfl
2dc00 5b 30 5d 2e 69 64 78 20 29 7b 0a 20 20 20 20 20  [0].idx ){.     
2dc10 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72   apDiv[i] = pPar
2dc20 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43  ent->aOvfl[0].pC
2dc30 65 6c 6c 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20  ell;.      pgno 
2dc40 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
2dc50 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  [i]);.      szNe
2dc60 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  w[i] = cellSizeP
2dc70 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
2dc80 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50 61  v[i]);.      pPa
2dc90 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
2dca0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
2dcb0 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
2dcc0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e   findCell(pParen
2dcd0 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
2dce0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a  nt->nOverflow);.
2dcf0 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
2dd00 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
2dd10 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20  .      szNew[i] 
2dd20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2dd30 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29  arent, apDiv[i])
2dd40 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f 70  ;..      /* Drop
2dd50 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74   the cell from t
2dd60 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
2dd70 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70  apDiv[i] still p
2dd80 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a  oints to.      *
2dd90 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69  * the cell withi
2dda0 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65 76  n the parent, ev
2ddb0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61 73  en though it has
2ddc0 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20   been dropped.. 
2ddd0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
2dde0 73 61 66 65 20 62 65 63 61 75 73 65 20 64 72 6f  safe because dro
2ddf0 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c  pping a cell onl
2de00 79 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65  y overwrites the
2de10 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20   first.      ** 
2de20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 74  four bytes of it
2de30 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  , and this funct
2de40 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
2de50 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  d the first.    
2de60 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20    ** four bytes 
2de70 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
2de80 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e  ell. So the poin
2de90 74 65 72 20 69 73 20 73 61 66 65 20 74 6f 20 75  ter is safe to u
2dea0 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65  se.      ** late
2deb0 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a  r on.  .      **
2dec0 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73  .      ** Unless
2ded0 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
2dee0 6c 65 64 20 69 6e 20 73 65 63 75 72 65 2d 64 65  led in secure-de
2def0 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 74 68  lete mode. In th
2df00 69 73 20 63 61 73 65 2c 0a 20 20 20 20 20 20 2a  is case,.      *
2df10 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28 29  * the dropCell()
2df20 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76   routine will ov
2df30 65 72 77 72 69 74 65 20 74 68 65 20 65 6e 74 69  erwrite the enti
2df40 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65 72  re cell with zer
2df50 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e  oes..      ** In
2df60 20 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d 70   this case, temp
2df70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68 65  orarily copy the
2df80 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61   cell into the a
2df90 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20  OvflSpace[].    
2dfa0 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74 20    ** buffer. It 
2dfb0 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 6f  will be copied o
2dfc0 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e  ut again as soon
2dfd0 20 61 73 20 74 68 65 20 61 53 70 61 63 65 5b 5d   as the aSpace[]
2dfe0 20 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a 2a   buffer.      **
2dff0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20   is allocated.  
2e000 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2e010 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
2e020 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76       memcpy(&aOv
2e030 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d  flSpace[apDiv[i]
2e040 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d  -pParent->aData]
2e050 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65  , apDiv[i], szNe
2e060 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 70 44  w[i]);.      apD
2e070 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70  iv[i] = &aOvflSp
2e080 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61  ace[apDiv[i]-pPa
2e090 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 23 65  rent->aData];.#e
2e0a0 6e 64 69 66 0a 20 20 20 20 20 20 64 72 6f 70 43  ndif.      dropC
2e0b0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
2e0c0 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
2e0d0 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69  verflow, szNew[i
2e0e0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ]);.    }.  }.. 
2e0f0 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c   /* Make nMaxCel
2e100 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66  ls a multiple of
2e110 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70   4 in order to p
2e120 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20  reserve 8-byte. 
2e130 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f   ** alignment */
2e140 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28  .  nMaxCells = (
2e150 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e  nMaxCells + 3)&~
2e160 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  3;..  /*.  ** Al
2e170 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
2e180 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
2e190 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42  es.  */.  k = pB
2e1a0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52 4f  t->pageSize + RO
2e1b0 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50  UND8(sizeof(MemP
2e1c0 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61 74  age));.  szScrat
2e1d0 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78  ch =.       nMax
2e1e0 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a  Cells*sizeof(u8*
2e1f0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
2e200 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c          /* apCel
2e210 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78  l */.     + nMax
2e220 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36  Cells*sizeof(u16
2e230 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
2e240 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c          /* szCel
2e250 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d  l */.     + pBt-
2e260 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20 20  >pageSize       
2e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e280 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63          /* aSpac
2e290 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e  e1 */.     + k*n
2e2a0 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
2e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2e2d0 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79 29   copies (apCopy)
2e2e0 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73   */.  apCell = s
2e2f0 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c  qlite3ScratchMal
2e300 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20 29  loc( szScratch )
2e310 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  ; .  if( apCell=
2e320 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
2e330 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2e340 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2e350 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43  eanup;.  }.  szC
2e360 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43  ell = (u16*)&apC
2e370 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
2e380 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38 2a    aSpace1 = (u8*
2e390 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&szCell[nMaxCel
2e3a0 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ls];.  assert( E
2e3b0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
2e3c0 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b 0a  ENT(aSpace1) );.
2e3d0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20  .  /*.  ** Load 
2e3e0 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20  pointers to all 
2e3f0 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67  cells on sibling
2e400 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20 64   pages and the d
2e410 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
2e420 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  * into the local
2e430 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e   apCell[] array.
2e440 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66    Make copies of
2e450 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
2e460 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61  ls.  ** into spa
2e470 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
2e480 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72   aSpace1[] and r
2e490 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64 69  emove the the di
2e4a0 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a  vider Cells.  **
2e4b0 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20   from pParent.. 
2e4c0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
2e4d0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20  siblings are on 
2e4e0 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e  leaf pages, then
2e4f0 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74   the child point
2e500 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ers of the.  ** 
2e510 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72  divider cells ar
2e520 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20  e stripped from 
2e530 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  the cells before
2e540 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64   they are copied
2e550 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63  .  ** into aSpac
2e560 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77  e1[].  In this w
2e570 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
2e580 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69   apCell[] are wi
2e590 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64  thout.  ** child
2e5a0 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73   pointers.  If s
2e5b0 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
2e5c0 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c  leaves, then all
2e5d0 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70   cell in.  ** ap
2e5e0 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63  Cell[] include c
2e5f0 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
2e600 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20  Either way, all 
2e610 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
2e620 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65  ].  ** are alike
2e630 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66  ..  **.  ** leaf
2e640 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69  Correction:  4 i
2e650 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
2e660 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69  f.  0 if pPage i
2e670 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20  s not a leaf..  
2e680 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74  **       leafDat
2e690 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68  a:  1 if pPage h
2e6a0 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e  olds key+data an
2e6b0 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20  d pParent holds 
2e6c0 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a  only keys..  */.
2e6d0 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e    leafCorrection
2e6e0 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61   = apOld[0]->lea
2e6f0 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20  f*4;.  leafData 
2e700 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44  = apOld[0]->hasD
2e710 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ata;.  for(i=0; 
2e720 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
2e730 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20    int limit;.   
2e740 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20   .    /* Before 
2e750 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
2e760 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79  lse, take a copy
2e770 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72 69   of the i'th ori
2e780 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20  ginal sibling.  
2e790 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66    ** The rest of
2e7a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2e7b0 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f  ill use data fro
2e7c0 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74  m the copies rat
2e7d0 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  her.    ** that 
2e7e0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
2e7f0 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69  es since the ori
2e800 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c  ginal pages will
2e810 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a   be in the.    *
2e820 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
2e830 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
2e840 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
2e850 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69  *pOld = apCopy[i
2e860 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61  ] = (MemPage*)&a
2e870 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65  Space1[pBt->page
2e880 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20  Size + k*i];.   
2e890 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70   memcpy(pOld, ap
2e8a0 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d  Old[i], sizeof(M
2e8b0 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f  emPage));.    pO
2e8c0 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69  ld->aData = (voi
2e8d0 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20  d*)&pOld[1];.   
2e8e0 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44   memcpy(pOld->aD
2e8f0 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61  ata, apOld[i]->a
2e900 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53  Data, pBt->pageS
2e910 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74  ize);..    limit
2e920 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70   = pOld->nCell+p
2e930 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
2e940 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
2e950 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  imit; j++){.    
2e960 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
2e970 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
2e980 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
2e990 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
2e9a0 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20  ell(pOld, j);.  
2e9b0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
2e9c0 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
2e9d0 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65  pOld, apCell[nCe
2e9e0 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c  ll]);.      nCel
2e9f0 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  l++;.    }.    i
2ea00 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21  f( i<nOld-1 && !
2ea10 6c 65 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20  leafData){.     
2ea20 20 75 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73   u16 sz = (u16)s
2ea30 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75  zNew[i];.      u
2ea40 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20  8 *pTemp;.      
2ea50 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
2ea60 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
2ea70 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
2ea80 20 73 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70   sz;.      pTemp
2ea90 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70 61   = &aSpace1[iSpa
2eaa0 63 65 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61  ce1];.      iSpa
2eab0 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ce1 += sz;.     
2eac0 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74   assert( sz<=pBt
2ead0 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a  ->pageSize/4 );.
2eae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
2eaf0 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65  pace1<=pBt->page
2eb00 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65  Size );.      me
2eb10 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69  mcpy(pTemp, apDi
2eb20 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20  v[i], sz);.     
2eb30 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
2eb40 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65   pTemp+leafCorre
2eb50 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73  ction;.      ass
2eb60 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
2eb70 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f  ion==0 || leafCo
2eb80 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20  rrection==4 );. 
2eb90 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
2eba0 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c  l] = szCell[nCel
2ebb0 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74  l] - leafCorrect
2ebc0 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ion;.      if( !
2ebd0 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pOld->leaf ){.  
2ebe0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
2ebf0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
2ec00 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2ec10 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73  t( pOld->hdrOffs
2ec20 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  et==0 );.       
2ec30 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f   /* The right po
2ec40 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69  inter of the chi
2ec50 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63  ld page pOld bec
2ec60 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20  omes the left.  
2ec70 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
2ec80 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
2ec90 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  cell */.        
2eca0 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43  memcpy(apCell[nC
2ecb0 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61  ell], &pOld->aDa
2ecc0 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[8], 4);.     
2ecd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ece0 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
2ecf0 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
2ed00 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
2ed10 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20  nCell]<4 ){.    
2ed20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
2ed30 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20  allow any cells 
2ed40 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62  smaller than 4 b
2ed50 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ytes. */.       
2ed60 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
2ed70 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 4;.        }.
2ed80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43        }.      nC
2ed90 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell++;.    }.  }
2eda0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75  ..  /*.  ** Figu
2edb0 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65  re out the numbe
2edc0 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65  r of pages neede
2edd0 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43  d to hold all nC
2ede0 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20  ell cells..  ** 
2edf0 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65  Store this numbe
2ee00 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20  r in "k".  Also 
2ee10 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20  compute szNew[] 
2ee20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74  which is the tot
2ee30 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  al.  ** size of 
2ee40 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  all cells on the
2ee50 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63   i-th page and c
2ee60 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73  ntNew[] which is
2ee70 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
2ee80 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74  in apCell[] of t
2ee90 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76  he cell that div
2eea0 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d  ides page i from
2eeb0 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a   page i+1.  .  *
2eec0 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75  * cntNew[k] shou
2eed0 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a  ld equal nCell..
2eee0 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73    **.  ** Values
2eef0 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69   computed by thi
2ef00 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20  s block:.  **.  
2ef10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20  **           k: 
2ef20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  The total number
2ef30 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65   of sibling page
2ef40 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b  s.  **    szNew[
2ef50 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20  i]: Spaced used 
2ef60 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c  on the i-th sibl
2ef70 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20  ing page..  **  
2ef80 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65   cntNew[i]: Inde
2ef90 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e  x in apCell[] an
2efa0 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74  d szCell[] for t
2efb0 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  he first cell to
2efc0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
2efd0 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20     the right of 
2efe0 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
2eff0 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62   page..  ** usab
2f000 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20  leSpace: Number 
2f010 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
2f020 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65  e available on e
2f030 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a  ach sibling..  *
2f040 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65  * .  */.  usable
2f050 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61  Space = pBt->usa
2f060 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c  bleSize - 12 + l
2f070 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
2f080 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d   for(subtotal=k=
2f090 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
2f0a0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
2f0b0 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  i<nMaxCells );. 
2f0c0 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73     subtotal += s
2f0d0 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20  zCell[i] + 2;.  
2f0e0 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e    if( subtotal >
2f0f0 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a   usableSpace ){.
2f100 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d        szNew[k] =
2f110 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65   subtotal - szCe
2f120 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74  ll[i];.      cnt
2f130 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20  New[k] = i;.    
2f140 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29    if( leafData )
2f150 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73  { i--; }.      s
2f160 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20  ubtotal = 0;.   
2f170 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66     k++;.      if
2f180 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d  ( k>NB+1 ){ rc =
2f190 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
2f1a0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2f1b0 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20  eanup; }.    }. 
2f1c0 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20   }.  szNew[k] = 
2f1d0 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e  subtotal;.  cntN
2f1e0 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20  ew[k] = nCell;. 
2f1f0 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   k++;..  /*.  **
2f200 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d   The packing com
2f210 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65  puted by the pre
2f220 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62  vious block is b
2f230 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65  iased toward the
2f240 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f   siblings.  ** o
2f250 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e  n the left side.
2f260 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69    The left sibli
2f270 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e  ngs are always n
2f280 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c  early full, whil
2f290 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74  e the.  ** right
2f2a0 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69  -most sibling mi
2f2b0 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d  ght be nearly em
2f2c0 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b  pty.  This block
2f2d0 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74   of code attempt
2f2e0 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74  s.  ** to adjust
2f2f0 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20   the packing of 
2f300 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20  siblings to get 
2f310 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65  a better balance
2f320 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
2f330 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d   adjustment is m
2f340 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69  ore than an opti
2f350 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70  mization.  The p
2f360 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67  acking above mig
2f370 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75  ht.  ** be so ou
2f380 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20  t of balance as 
2f390 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20  to be illegal.  
2f3a0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
2f3b0 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
2f3c0 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
2f3d0 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  e completely emp
2f3e0 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74  ty.  This adjust
2f3f0 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  ment is not opti
2f400 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  onal..  */.  for
2f410 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  (i=k-1; i>0; i--
2f420 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67  ){.    int szRig
2f430 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20  ht = szNew[i];  
2f440 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
2f450 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  ng on the right 
2f460 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66  */.    int szLef
2f470 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20  t = szNew[i-1]; 
2f480 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
2f490 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  ng on the left *
2f4a0 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20  /.    int r;    
2f4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2f4c0 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74  ex of right-most
2f4d0 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69   cell in left si
2f4e0 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  bling */.    int
2f4f0 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   d;             
2f500 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
2f510 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c  st cell to the l
2f520 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62  eft of right sib
2f530 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d  ling */..    r =
2f540 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
2f550 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20  ;.    d = r + 1 
2f560 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
2f570 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65  assert( d<nMaxCe
2f580 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
2f590 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( r<nMaxCells )
2f5a0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52  ;.    while( szR
2f5b0 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67  ight==0 || szRig
2f5c0 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d  ht+szCell[d]+2<=
2f5d0 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72  szLeft-(szCell[r
2f5e0 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a  ]+2) ){.      sz
2f5f0 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b  Right += szCell[
2f600 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a  d] + 2;.      sz
2f610 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72  Left -= szCell[r
2f620 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74  ] + 2;.      cnt
2f630 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20  New[i-1]--;.    
2f640 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
2f650 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d  ] - 1;.      d =
2f660 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
2f670 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e  a;.    }.    szN
2f680 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b  ew[i] = szRight;
2f690 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20  .    szNew[i-1] 
2f6a0 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20  = szLeft;.  }.. 
2f6b0 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f   /* Either we fo
2f6c0 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  und one or more 
2f6d0 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d  cells (cntnew[0]
2f6e0 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20 69 73  )>0) or pPage is
2f6f0 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20  .  ** a virtual 
2f700 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69  root page.  A vi
2f710 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
2f720 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c  is when the real
2f730 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20   root.  ** page 
2f740 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65  is page 1 and we
2f750 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68   are the only ch
2f760 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65  ild of that page
2f770 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2f780 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20   cntNew[0]>0 || 
2f790 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d  (pParent->pgno==
2f7a0 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43  1 && pParent->nC
2f7b0 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 54 52  ell==0) );..  TR
2f7c0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f  ACE(("BALANCE: o
2f7d0 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c  ld: %d %d %d  ",
2f7e0 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70  .    apOld[0]->p
2f7f0 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d  gno, .    nOld>=
2f800 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67  2 ? apOld[1]->pg
2f810 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64  no : 0,.    nOld
2f820 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e  >=3 ? apOld[2]->
2f830 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a  pgno : 0.  ));..
2f840 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
2f850 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20  te k new pages. 
2f860 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73   Reuse old pages
2f870 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
2f880 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c  .  */.  if( apOl
2f890 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b  d[0]->pgno<=1 ){
2f8a0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2f8b0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 67 6f  _CORRUPT;.    go
2f8c0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2f8d0 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c  up;.  }.  pageFl
2f8e0 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ags = apOld[0]->
2f8f0 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28  aData[0];.  for(
2f900 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
2f910 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
2f920 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c  w;.    if( i<nOl
2f930 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  d ){.      pNew 
2f940 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f  = apNew[i] = apO
2f950 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f  ld[i];.      apO
2f960 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ld[i] = 0;.     
2f970 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f980 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44  erWrite(pNew->pD
2f990 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e  bPage);.      nN
2f9a0 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ew++;.      if( 
2f9b0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
2f9c0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
2f9d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
2f9e0 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
2f9f0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2fa00 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
2fa10 65 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c  ew, &pgno, pgno,
2fa20 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
2fa30 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
2fa40 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
2fa50 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b  apNew[i] = pNew;
2fa60 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a  .      nNew++;..
2fa70 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
2fa80 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2fa90 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ry for the new s
2faa0 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
2fab0 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f        if( ISAUTO
2fac0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
2fad0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2fae0 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  (pBt, pNew->pgno
2faf0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2fb00 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a  pParent->pgno);.
2fb10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2fb20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fb30 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
2fb40 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2fb50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2fb60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
2fb70 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65  ree any old page
2fb80 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20  s that were not 
2fb90 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61  reused as new pa
2fba0 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ges..  */.  whil
2fbb0 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  e( i<nOld ){.   
2fbc0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 61   rc = freePage(a
2fbd0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66  pOld[i]);.    if
2fbe0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
2fbf0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2fc00 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
2fc10 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c  ld[i]);.    apOl
2fc20 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b  d[i] = 0;.    i+
2fc30 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  +;.  }..  /*.  *
2fc40 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61  * Put the new pa
2fc50 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
2fc60 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65   order.  This he
2fc70 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70  lps to.  ** keep
2fc80 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
2fc90 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64  disk file in ord
2fca0 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61  er so that a sca
2fcb0 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  n.  ** of the ta
2fcc0 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20  ble is a linear 
2fcd0 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  scan through the
2fce0 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a   file.  That.  *
2fcf0 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20  * in turn helps 
2fd00 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
2fd10 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20  stem to deliver 
2fd20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  pages.  ** from 
2fd30 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61  the disk more ra
2fd40 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pidly..  **.  **
2fd50 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72   An O(n^2) inser
2fd60 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69  tion sort algori
2fd70 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74  thm is used, but
2fd80 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73   since.  ** n is
2fd90 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e   never more than
2fda0 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e   NB (a small con
2fdb0 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f  stant), that sho
2fdc0 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  uld.  ** not be 
2fdd0 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a  a problem..  **.
2fde0 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c    ** When NB==3,
2fdf0 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69   this one optimi
2fe00 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65  zation makes the
2fe10 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61   database.  ** a
2fe20 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20  bout 25% faster 
2fe30 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74  for large insert
2fe40 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f  ions and deletio
2fe50 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
2fe60 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b  =0; i<k-1; i++){
2fe70 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20  .    int minV = 
2fe80 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a  apNew[i]->pgno;.
2fe90 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69      int minI = i
2fea0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
2feb0 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<k; j++){.    
2fec0 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e    if( apNew[j]->
2fed0 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d  pgno<(unsigned)m
2fee0 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  inV ){.        m
2fef0 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  inI = j;.       
2ff00 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d   minV = apNew[j]
2ff10 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  ->pgno;.      }.
2ff20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69      }.    if( mi
2ff30 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e  nI>i ){.      in
2ff40 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61  t t;.      MemPa
2ff50 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20  ge *pT;.      t 
2ff60 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  = apNew[i]->pgno
2ff70 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e  ;.      pT = apN
2ff80 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e  ew[i];.      apN
2ff90 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69  ew[i] = apNew[mi
2ffa0 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nI];.      apNew
2ffb0 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20  [minI] = pT;.   
2ffc0 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28   }.  }.  TRACE((
2ffd0 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28  "new: %d(%d) %d(
2ffe0 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
2fff0 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20  ) %d(%d)\n",.   
30000 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c   apNew[0]->pgno,
30010 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e   szNew[0],.    n
30020 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31  New>=2 ? apNew[1
30030 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
30040 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20  w>=2 ? szNew[1] 
30050 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33  : 0,.    nNew>=3
30060 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e   ? apNew[2]->pgn
30070 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f  o : 0, nNew>=3 ?
30080 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20   szNew[2] : 0,. 
30090 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e     nNew>=4 ? apN
300a0 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[3]->pgno : 0,
300b0 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77   nNew>=4 ? szNew
300c0 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [3] : 0,.    nNe
300d0 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d  w>=5 ? apNew[4]-
300e0 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
300f0 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20  =5 ? szNew[4] : 
30100 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  0));..  assert( 
30110 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
30120 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
30130 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70  >pDbPage) );.  p
30140 75 74 34 62 79 74 65 28 70 52 69 67 68 74 2c 20  ut4byte(pRight, 
30150 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70  apNew[nNew-1]->p
30160 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  gno);..  /*.  **
30170 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75   Evenly distribu
30180 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61  te the data in a
30190 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74  pCell[] across t
301a0 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  he new pages..  
301b0 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65  ** Insert divide
301c0 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61  r cells into pPa
301d0 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72  rent as necessar
301e0 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b  y..  */.  j = 0;
301f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
30200 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a  ew; i++){.    /*
30210 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65   Assemble the ne
30220 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
30230 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
30240 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b  pNew = apNew[i];
30250 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e  .    assert( j<n
30260 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
30270 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
30280 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61  ageFlags);.    a
30290 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
302a0 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26  , cntNew[i]-j, &
302b0 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65  apCell[j], &szCe
302c0 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65  ll[j]);.    asse
302d0 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e  rt( pNew->nCell>
302e0 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26  0 || (nNew==1 &&
302f0 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29   cntNew[0]==0) )
30300 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
30310 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ew->nOverflow==0
30320 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74   );..    j = cnt
30330 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20  New[i];..    /* 
30340 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
30350 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
30360 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20  ove was not the 
30370 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
30380 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ng,.    ** inser
30390 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  t a divider cell
303a0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
303b0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
303c0 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77    assert( i<nNew
303d0 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29  -1 || j==nCell )
303e0 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c  ;.    if( j<nCel
303f0 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  l ){.      u8 *p
30400 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a  Cell;.      u8 *
30410 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74  pTemp;.      int
30420 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65   sz;..      asse
30430 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
30440 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
30450 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   apCell[j];.    
30460 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d    sz = szCell[j]
30470 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
30480 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d  n;.      pTemp =
30490 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76   &aOvflSpace[iOv
304a0 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20  flSpace];.      
304b0 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20  if( !pNew->leaf 
304c0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
304d0 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38  y(&pNew->aData[8
304e0 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20  ], pCell, 4);.  
304f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65      }else if( le
30500 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
30510 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65    /* If the tree
30520 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20   is a leaf-data 
30530 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69  tree, and the si
30540 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65  blings are leave
30550 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  s, .        ** t
30560 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
30570 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20  divider cell in 
30580 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61  apCell[]. Instea
30590 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a  d, the divider .
305a0 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20          ** cell 
305b0 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
305c0 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  integer key for 
305d0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
305e0 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20  ell of .        
305f0 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70  ** the sibling-p
30600 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
30610 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ove only..      
30620 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c    */.        Cel
30630 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
30640 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20      j--;.       
30650 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
30660 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b  tr(pNew, apCell[
30670 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  j], &info);.    
30680 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
30690 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20  p;.        sz = 
306a0 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70  4 + putVarint(&p
306b0 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b  Cell[4], info.nK
306c0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ey);.        pTe
306d0 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
306e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65  lse{.        pCe
306f0 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll -= 4;.       
30700 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65   /* Obscure case
30710 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   for non-leaf-da
30720 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65  ta trees: If the
30730 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77   cell at pCell w
30740 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  as.        ** pr
30750 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20  eviously stored 
30760 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20  on a leaf node, 
30770 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64  and its reported
30780 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20   size was 4.    
30790 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68      ** bytes, th
307a0 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c  en it may actual
307b0 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  ly be smaller th
307c0 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  an this .       
307d0 20 2a 2a 20 28 73 65 65 20 62 74 72 65 65 50 61   ** (see btreePa
307e0 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20  rseCellPtr(), 4 
307f0 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e  bytes is the min
30800 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20  imum size of.   
30810 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c       ** any cell
30820 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70  ). But it is imp
30830 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74  ortant to pass t
30840 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20  he correct size 
30850 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  to .        ** i
30860 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20  nsertCell(), so 
30870 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c  reparse the cell
30880 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a   now..        **
30890 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
308a0 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e   that this can n
308b0 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61  ever happen in a
308c0 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69  n SQLite data fi
308d0 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20  le, as all.     
308e0 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20     ** cells are 
308f0 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
30900 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e  . It only happen
30910 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65  s in b-trees use
30920 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  d.        ** to 
30930 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45  evaluate "IN (SE
30940 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73  LECT ...)" and s
30950 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a  imilar clauses..
30960 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30970 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d     if( szCell[j]
30980 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==4 ){.         
30990 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72   assert(leafCorr
309a0 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20  ection==4);.    
309b0 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
309c0 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
309d0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pCell);.        
309e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
309f0 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a  iOvflSpace += sz
30a00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30a10 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  sz<=pBt->pageSiz
30a20 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73  e/4 );.      ass
30a30 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65 3c  ert( iOvflSpace<
30a40 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
30a50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73  ;.      rc = ins
30a60 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
30a70 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73   nxDiv, pCell, s
30a80 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e  z, pTemp, pNew->
30a90 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
30aa0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30ab0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
30ac0 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73  eanup;.      ass
30ad0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
30ae0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
30af0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
30b00 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  ;..      j++;.  
30b10 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
30b20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
30b30 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
30b40 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
30b50 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
30b60 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
30b70 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
30b80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  )==0 ){.    u8 *
30b90 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79  zChild = &apCopy
30ba0 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nOld-1]->aData[
30bb0 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  8];.    memcpy(&
30bc0 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61  apNew[nNew-1]->a
30bd0 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c  Data[8], zChild,
30be0 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   4);.  }..  if( 
30bf0 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e  isRoot && pParen
30c00 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70  t->nCell==0 && p
30c10 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
30c20 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72  t<=apNew[0]->nFr
30c30 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ee ){.    /* The
30c40 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
30c50 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e  e b-tree now con
30c60 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20  tains no cells. 
30c70 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67  The only sibling
30c80 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20  .    ** page is 
30c90 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
30ca0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43  of the parent. C
30cb0 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
30cc0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   of the.    ** c
30cd0 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74  hild page into t
30ce0 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65  he parent, decre
30cf0 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c  asing the overal
30d00 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a  l height of the.
30d10 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74      ** b-tree st
30d20 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20  ructure by one. 
30d30 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62 65  This is describe
30d40 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63  d as the "balanc
30d50 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20  e-shallower".   
30d60 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68   ** sub-algorith
30d70 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65  m in some docume
30d80 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a  ntation..    **.
30d90 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
30da0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
30db0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
30dc0 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43  all to copyNodeC
30dd0 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a  ontent() .    **
30de0 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65   sets all pointe
30df0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f  r-map entries co
30e00 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64  rresponding to d
30e10 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70 61  atabase image pa
30e20 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ges .    ** for 
30e30 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65  which the pointe
30e40 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68  r is stored with
30e50 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62  in the content b
30e60 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20  eing copied..   
30e70 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
30e80 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c  econd assert bel
30e90 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61 74  ow verifies that
30ea0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
30eb0 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a  is defragmented.
30ec0 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20      ** (it must 
30ed0 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75  be, as it was ju
30ee0 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64  st reconstructed
30ef0 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50   using assembleP
30f00 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20  age()). This.   
30f10 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   ** is important
30f20 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   if the parent p
30f30 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
30f40 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  e page 1 of the 
30f50 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
30f60 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61  image.  */.    a
30f70 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29  ssert( nNew==1 )
30f80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  ;.    assert( ap
30f90 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d  New[0]->nFree ==
30fa0 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32 62   .        (get2b
30fb0 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61  yte(&apNew[0]->a
30fc0 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30  Data[5])-apNew[0
30fd0 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70  ]->cellOffset-ap
30fe0 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29  New[0]->nCell*2)
30ff0 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28   .    );.    if(
31000 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
31010 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  = copyNodeConten
31020 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72  t(apNew[0], pPar
31030 65 6e 74 29 29 20 29 7b 0a 20 20 20 20 20 20 72  ent)) ){.      r
31040 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4e  c = freePage(apN
31050 65 77 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ew[0]);.    }.  
31060 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55 54 4f  }else if( ISAUTO
31070 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f 2a  VACUUM ){.    /*
31080 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   Fix the pointer
31090 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
310a0 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20 74   all the cells t
310b0 68 61 74 20 77 65 72 65 20 73 68 69 66 74 65 64  hat were shifted
310c0 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a 2a   around. .    **
310d0 20 54 68 65 72 65 20 61 72 65 20 73 65 76 65 72   There are sever
310e0 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79 70  al different typ
310f0 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61  es of pointer-ma
31100 70 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6e  p entries that n
31110 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eed to.    ** be
31120 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
31130 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f 6d  his routine. Som
31140 65 20 6f 66 20 74 68 65 73 65 20 68 61 76 65 20  e of these have 
31150 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61 64 79  been set already
31160 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61 6e  , but.    ** man
31170 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68 65 20  y have not. The 
31180 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 73  following is a s
31190 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a 20  ummary:.    **. 
311a0 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20 65     **   1) The e
311b0 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
311c0 64 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c 69  d with new sibli
311d0 6e 67 20 70 61 67 65 73 20 74 68 61 74 20 77 65  ng pages that we
311e0 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20 20  re not.    **   
311f0 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68 65 6e     siblings when
31200 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
31210 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 73 65  as called. These
31220 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
31230 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 73    **      been s
31240 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65 65  et. We don't nee
31250 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74  d to worry about
31260 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74 68   old siblings th
31270 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a 20 20  at were.    **  
31280 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68 65      moved to the
31290 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68 65   free-list - the
312a0 20 66 72 65 65 50 61 67 65 28 29 20 63 6f 64 65   freePage() code
312b0 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65 0a   has taken care.
312c0 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66 20 74      **      of t
312d0 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  hose..    **.   
312e0 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70 6f 69   **   2) The poi
312f0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
31300 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
31310 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
31320 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  low.    **      
31330 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65 72  page in any over
31340 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65 64  flow chains used
31350 20 62 79 20 6e 65 77 20 64 69 76 69 64 65 72 20   by new divider 
31360 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20 20  cells. These .  
31370 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20 61    **      have a
31380 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65 6e  lso already been
31390 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20 62   taken care of b
313a0 79 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c  y the insertCell
313b0 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a  () code..    **.
313c0 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20 74      **   3) If t
313d0 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  he sibling pages
313e0 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
313f0 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
31400 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20  pages of.    ** 
31410 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72 65       cells store
31420 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e 67  d on the sibling
31430 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64 20   pages may need 
31440 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
31450 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 34     **.    **   4
31460 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  ) If the sibling
31470 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 69   pages are not i
31480 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e  nternal intkey n
31490 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a 20  odes, then any. 
314a0 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65 72 66     **      overf
314b0 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64 20 62  low pages used b
314c0 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20 6d 61  y these cells ma
314d0 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64  y need to be upd
314e0 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  ated.    **     
314f0 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65   (internal intke
31500 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63 6f  y nodes never co
31510 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74  ntain pointers t
31520 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
31530 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
31540 20 20 20 35 29 20 49 66 20 74 68 65 20 73 69 62     5) If the sib
31550 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e  ling pages are n
31560 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
31570 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
31580 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e 74 72      **      entr
31590 69 65 73 20 66 6f 72 20 74 68 65 20 72 69 67 68  ies for the righ
315a0 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66  t-child pages of
315b0 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20 6d 61   each sibling ma
315c0 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20 20  y need.    **   
315d0 20 20 20 74 6f 20 62 65 20 75 70 64 61 74 65 64     to be updated
315e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
315f0 43 61 73 65 73 20 31 20 61 6e 64 20 32 20 61 72  Cases 1 and 2 ar
31600 65 20 64 65 61 6c 74 20 77 69 74 68 20 61 62 6f  e dealt with abo
31610 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65  ve by other code
31620 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  . The next.    *
31630 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  * block deals wi
31640 74 68 20 63 61 73 65 73 20 33 20 61 6e 64 20 34  th cases 3 and 4
31650 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61 66 74   and the one aft
31660 65 72 20 74 68 61 74 2c 20 63 61 73 65 20 35 2e  er that, case 5.
31670 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73 65   Since.    ** se
31680 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20  tting a pointer 
31690 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61 20 72  map entry is a r
316a0 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65 6e 73  elatively expens
316b0 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74  ive operation, t
316c0 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  his.    ** code 
316d0 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74 65  only sets pointe
316e0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
316f0 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66  r child or overf
31700 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 68  low pages that h
31710 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74 75 61  ave.    ** actua
31720 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77 65 65  lly moved betwee
31730 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20 20  n pages.  */.   
31740 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
31750 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20 4d   apNew[0];.    M
31760 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61  emPage *pOld = a
31770 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69 6e  pCopy[0];.    in
31780 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f  t nOverflow = pO
31790 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
317a0 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64 20     int iNextOld 
317b0 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20  = pOld->nCell + 
317c0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
317d0 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28  nt iOverflow = (
317e0 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c 64  nOverflow ? pOld
317f0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 3a  ->aOvfl[0].idx :
31800 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b   -1);.    j = 0;
31810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31830 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69  Current 'old' si
31840 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20  bling page */.  
31850 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20    k = 0;        
31860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31870 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
31880 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61  'new' sibling pa
31890 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  ge */.    for(i=
318a0 30 3b 20 69 3c 6e 43 65 6c 6c 20 26 26 20 72 63  0; i<nCell && rc
318b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
318c0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 44  ){.      int isD
318d0 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  ivider = 0;.    
318e0 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78    while( i==iNex
318f0 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20  tOld ){.        
31900 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65  /* Cell i is the
31910 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   cell immediatel
31920 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
31930 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64  last cell on old
31940 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c  .        ** sibl
31950 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66 20 74  ing page j. If t
31960 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
31970 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f  not leaf pages o
31980 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f an.        ** 
31990 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74  intkey b-tree, t
319a0 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73 20 61  hen cell i was a
319b0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a   divider cell. *
319c0 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d  /.        pOld =
319d0 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20   apCopy[++j];.  
319e0 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d        iNextOld =
319f0 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b   i + !leafData +
31a00 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70   pOld->nCell + p
31a10 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
31a20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64          if( pOld
31a30 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
31a40 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c           nOverfl
31a50 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72  ow = pOld->nOver
31a60 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  flow;.          
31a70 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20  iOverflow = i + 
31a80 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64  !leafData + pOld
31a90 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a  ->aOvfl[0].idx;.
31aa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31ab0 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 21 6c    isDivider = !l
31ac0 65 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20 20  eafData;  .     
31ad0 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
31ae0 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20  (nOverflow>0 || 
31af0 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20  iOverflow<i );. 
31b00 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65       assert(nOve
31b10 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d  rflow<2 || pOld-
31b20 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70  >aOvfl[0].idx==p
31b30 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64  Old->aOvfl[1].id
31b40 78 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  x-1);.      asse
31b50 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c  rt(nOverflow<3 |
31b60 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d  | pOld->aOvfl[1]
31b70 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66  .idx==pOld->aOvf
31b80 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20  l[2].idx-1);.   
31b90 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66     if( i==iOverf
31ba0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69  low ){.        i
31bb0 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20  sDivider = 1;.  
31bc0 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76        if( (--nOv
31bd0 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20  erflow)>0 ){.   
31be0 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77         iOverflow
31bf0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
31c00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
31c10 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b   i==cntNew[k] ){
31c20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c  .        /* Cell
31c30 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69   i is the cell i
31c40 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
31c50 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65  wing the last ce
31c60 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20  ll on new.      
31c70 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67    ** sibling pag
31c80 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c  e k. If the sibl
31c90 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
31ca0 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20  f pages of an.  
31cb0 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20        ** intkey 
31cc0 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c  b-tree, then cel
31cd0 6c 20 69 20 69 73 20 61 20 64 69 76 69 64 65 72  l i is a divider
31ce0 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   cell.  */.     
31cf0 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
31d00 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  ++k];.        if
31d10 28 20 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f  ( !leafData ) co
31d20 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
31d30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
31d40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
31d50 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
31d60 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Old );.      ass
31d70 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a  ert( k<nNew );..
31d80 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
31d90 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61  cell was origina
31da0 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c  lly divider cell
31db0 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77   (and is not now
31dc0 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e  ) or.      ** an
31dd0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
31de0 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77  or if the cell w
31df0 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  as located on a 
31e00 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e  different siblin
31e10 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20  g.      ** page 
31e20 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e  before the balan
31e30 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70  cing, then the p
31e40 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
31e50 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  es associated.  
31e60 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20      ** with any 
31e70 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f  child or overflo
31e80 77 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  w pages need to 
31e90 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a  be updated.  */.
31ea0 20 20 20 20 20 20 69 66 28 20 69 73 44 69 76 69        if( isDivi
31eb0 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e  der || pOld->pgn
31ec0 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b  o!=pNew->pgno ){
31ed0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65  .        if( !le
31ee0 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a  afCorrection ){.
31ef0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
31f00 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65  trmapPut(pBt, ge
31f10 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69 5d  t4byte(apCell[i]
31f20 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  ), PTRMAP_BTREE,
31f30 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20   pNew->pgno);.  
31f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31f50 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e  if( szCell[i]>pN
31f60 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 26 26 20  ew->minLocal && 
31f70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31f80 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31f90 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
31fa0 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d  (pNew, apCell[i]
31fb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
31fc0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
31fd0 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74  if( !leafCorrect
31fe0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ion ){.      for
31ff0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
32000 5f 4f 4b 20 26 26 20 69 3c 6e 4e 65 77 3b 20 69  _OK && i<nNew; i
32010 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ++){.        rc 
32020 3d 20 70 74 72 6d 61 70 50 75 74 28 0a 09 20 20  = ptrmapPut(..  
32030 20 20 70 42 74 2c 20 67 65 74 34 62 79 74 65 28    pBt, get4byte(
32040 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61  &apNew[i]->aData
32050 5b 38 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52  [8]), PTRMAP_BTR
32060 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67  EE, apNew[i]->pg
32070 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
32080 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a   }..#if 0.    /*
32090 20 54 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b   The ptrmapCheck
320a0 50 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73  Pages() contains
320b0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
320c0 65 6e 74 73 20 74 68 61 74 20 76 65 72 69 66 79  ents that verify
320d0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c   that.    ** all
320e0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
320f0 65 73 20 61 72 65 20 73 65 74 20 63 6f 72 72 65  es are set corre
32100 63 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65  ctly. This is he
32110 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20  lpful while .   
32120 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54   ** debugging. T
32130 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64  his is usually d
32140 69 73 61 62 6c 65 64 20 62 65 63 61 75 73 65 20  isabled because 
32150 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
32160 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61  se may.    ** ca
32170 75 73 65 20 61 6e 20 61 73 73 65 72 74 28 29 20  use an assert() 
32180 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69  statement to fai
32190 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61  l.  */.    ptrma
321a0 70 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65  pCheckPages(apNe
321b0 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74  w, nNew);.    pt
321c0 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 26  rmapCheckPages(&
321d0 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e  pParent, 1);.#en
321e0 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  dif.  }..  asser
321f0 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e  t( pParent->isIn
32200 69 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22  it );.  TRACE(("
32210 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65  BALANCE: finishe
32220 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64  d: old=%d new=%d
32230 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20   cells=%d\n",.  
32240 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e          nOld, nN
32250 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20  ew, nCell));..  
32260 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20  /*.  ** Cleanup 
32270 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
32280 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63  ..  */.balance_c
32290 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
322a0 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43  3ScratchFree(apC
322b0 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ell);.  for(i=0;
322c0 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
322d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
322e0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pOld[i]);.  }.  
322f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
32300 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
32310 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29  sePage(apNew[i])
32320 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
32330 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
32340 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
32350 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72  alled when the r
32360 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
32370 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
32380 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68  s.** overfull (h
32390 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  as one or more o
323a0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a  verflow pages)..
323b0 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c  **.** A new chil
323c0 64 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61  d page is alloca
323d0 74 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ted and the cont
323e0 65 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72 72  ents of the curr
323f0 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  ent root.** page
32400 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72  , including over
32410 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65 20  flow cells, are 
32420 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
32430 63 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a  child. The root.
32440 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  ** page is then 
32450 6f 76 65 72 77 72 69 74 74 65 6e 20 74 6f 20 6d  overwritten to m
32460 61 6b 65 20 69 74 20 61 6e 20 65 6d 70 74 79 20  ake it an empty 
32470 70 61 67 65 20 77 69 74 68 20 74 68 65 20 72 69  page with the ri
32480 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f  ght-child .** po
32490 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 74  inter pointing t
324a0 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 0a  o the new page..
324b0 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
324c0 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e  urning, all poin
324d0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
324e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
324f0 20 70 61 67 65 73 20 0a 2a 2a 20 74 68 61 74 20   pages .** that 
32500 74 68 65 20 6e 65 77 20 63 68 69 6c 64 2d 70 61  the new child-pa
32510 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  ge now contains 
32520 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 65 20  pointers to are 
32530 75 70 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20  updated. The.** 
32540 65 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64  entry correspond
32550 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 72  ing to the new r
32560 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  ight-child point
32570 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a  er of the root.*
32580 2a 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20 75  * page is also u
32590 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  pdated..**.** If
325a0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70   successful, *pp
325b0 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20  Child is set to 
325c0 63 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65  contain a refere
325d0 6e 63 65 20 74 6f 20 74 68 65 20 63 68 69 6c 64  nce to the child
325e0 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20 53 51   .** page and SQ
325f0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
32600 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
32610 65 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  e the caller is 
32620 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63  required.** to c
32630 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
32640 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65 78  ) on *ppChild ex
32650 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61  actly once. If a
32660 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  n error occurs,.
32670 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
32680 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
32690 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74   *ppChild is set
326a0 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63   to 0..*/.static
326b0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65   int balance_dee
326c0 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f  per(MemPage *pRo
326d0 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  ot, MemPage **pp
326e0 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63  Child){.  int rc
326f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32700 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
32710 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75  rn value from su
32720 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
32730 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
32740 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
32750 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
32760 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a  new child page *
32770 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  /.  Pgno pgnoChi
32780 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
32790 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
327a0 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69  r of the new chi
327b0 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53  ld page */.  BtS
327c0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52 6f  hared *pBt = pRo
327d0 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54  ot->pBt;    /* T
327e0 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61  he BTree */..  a
327f0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f  ssert( pRoot->nO
32800 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61  verflow>0 );.  a
32810 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
32820 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
32830 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d  utex) );..  /* M
32840 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65 20 72  ake pRoot, the r
32850 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
32860 62 2d 74 72 65 65 2c 20 77 72 69 74 61 62 6c 65  b-tree, writable
32870 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  . Allocate a new
32880 20 0a 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74   .  ** page that
32890 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
328a0 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64   new right-child
328b0 20 6f 66 20 70 50 61 67 65 2e 20 43 6f 70 79 20   of pPage. Copy 
328c0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a  the contents.  *
328d0 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 73 74  * of the node st
328e0 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e  ored on pRoot in
328f0 74 6f 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  to the new child
32900 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
32910 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
32920 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
32930 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  rite(pRoot->pDbP
32940 61 67 65 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  age)).   || SQLI
32950 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 61 6c 6c  TE_OK!=(rc = all
32960 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
32970 42 74 2c 26 70 43 68 69 6c 64 2c 26 70 67 6e 6f  Bt,&pChild,&pgno
32980 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67 6e  Child,pRoot->pgn
32990 6f 2c 30 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  o,0)).   || SQLI
329a0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 63 6f 70  TE_OK!=(rc = cop
329b0 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52 6f  yNodeContent(pRo
329c0 6f 74 2c 20 70 43 68 69 6c 64 29 29 0a 20 20 20  ot, pChild)).   
329d0 7c 7c 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d  || (ISAUTOVACUUM
329e0 20 26 26 20 0a 20 20 20 20 20 20 20 53 51 4c 49   && .       SQLI
329f0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 70 74 72  TE_OK!=(rc = ptr
32a00 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
32a10 43 68 69 6c 64 2c 20 50 54 52 4d 41 50 5f 42 54  Child, PTRMAP_BT
32a20 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  REE, pRoot->pgno
32a30 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 70  ))).  ){.    *pp
32a40 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72  Child = 0;.    r
32a50 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
32a60 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  d);.    return r
32a70 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
32a80 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
32a90 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d  riteable(pChild-
32aa0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
32ab0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
32ac0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
32ad0 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29  Root->pDbPage) )
32ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69  ;.  assert( pChi
32af0 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74  ld->nCell==pRoot
32b00 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52  ->nCell );..  TR
32b10 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
32b20 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f  opy root %d into
32b30 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70   %d\n", pRoot->p
32b40 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  gno, pChild->pgn
32b50 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20  o));..  /* Copy 
32b60 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
32b70 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f  ls from pRoot to
32b80 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d   pChild */.  mem
32b90 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66  cpy(pChild->aOvf
32ba0 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c  l, pRoot->aOvfl,
32bb0 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f   pRoot->nOverflo
32bc0 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e  w*sizeof(pRoot->
32bd0 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  aOvfl[0]));.  pC
32be0 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
32bf0 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c  = pRoot->nOverfl
32c00 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74  ow;..  /* Zero t
32c10 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
32c20 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73 74 61  Root. Then insta
32c30 6c 6c 20 70 43 68 69 6c 64 20 61 73 20 74 68 65  ll pChild as the
32c40 20 72 69 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f   right-child. */
32c50 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f  .  zeroPage(pRoo
32c60 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  t, pChild->aData
32c70 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29  [0] & ~PTF_LEAF)
32c80 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 52  ;.  put4byte(&pR
32c90 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
32ca0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
32cb0 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a  pgnoChild);..  *
32cc0 70 70 43 68 69 6c 64 20 3d 20 70 43 68 69 6c 64  ppChild = pChild
32cd0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
32ce0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
32cf0 68 65 20 70 61 67 65 20 74 68 61 74 20 70 43 75  he page that pCu
32d00 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
32d10 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62  ts to has just b
32d20 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a  een modified in.
32d30 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69  ** some way. Thi
32d40 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72  s function figur
32d50 65 73 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d  es out if this m
32d60 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e  odification mean
32d70 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65  s the.** tree ne
32d80 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63  eds to be balanc
32d90 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61  ed, and if so ca
32da0 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72 69  lls the appropri
32db0 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a  ate balancing .*
32dc0 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e  * routine. Balan
32dd0 63 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  cing routines ar
32de0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e  e:.**.**   balan
32df0 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20  ce_quick().**   
32e00 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
32e10 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f  .**   balance_no
32e20 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61 74 69  nroot().*/.stati
32e30 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74  c int balance(Bt
32e40 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
32e50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
32e60 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  _OK;.  const int
32e70 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42   nMin = pCur->pB
32e80 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2a 20  t->usableSize * 
32e90 32 20 2f 20 33 3b 0a 20 20 75 38 20 61 42 61 6c  2 / 3;.  u8 aBal
32ea0 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 31  anceQuickSpace[1
32eb0 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20  3];.  u8 *pFree 
32ec0 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59  = 0;..  TESTONLY
32ed0 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  ( int balance_qu
32ee0 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29  ick_called = 0 )
32ef0 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e  ;.  TESTONLY( in
32f00 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  t balance_deeper
32f10 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a  _called = 0 );..
32f20 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69    do {.    int i
32f30 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
32f40 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  ge;.    MemPage 
32f50 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
32f60 70 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20  pPage[iPage];.. 
32f70 20 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20     if( iPage==0 
32f80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
32f90 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  ge->nOverflow ){
32fa0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
32fb0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
32fc0 20 62 2d 74 72 65 65 20 69 73 20 6f 76 65 72 66   b-tree is overf
32fd0 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ull. In this cas
32fe0 65 20 63 61 6c 6c 20 74 68 65 0a 20 20 20 20 20  e call the.     
32ff0 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65     ** balance_de
33000 65 70 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  eper() function 
33010 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
33020 63 68 69 6c 64 20 66 6f 72 20 74 68 65 20 72 6f  child for the ro
33030 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20  ot-page.        
33040 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74 68 65 20  ** and copy the 
33050 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
33060 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
33070 65 20 74 6f 20 69 74 2e 20 54 68 65 0a 20 20 20  e to it. The.   
33080 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74 65       ** next ite
33090 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
330a0 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e  -loop will balan
330b0 63 65 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  ce the child pag
330c0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20 0a 20  e..        */ . 
330d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
330e0 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63  balance_deeper_c
330f0 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20  alled++)==0 );. 
33100 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
33110 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65  nce_deeper(pPage
33120 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
33130 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
33140 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33150 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  {.          pCur
33160 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20 20 20  ->iPage = 1;.   
33170 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
33180 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  dx[0] = 0;.     
33190 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
331a0 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [1] = 0;.       
331b0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
331c0 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65  >apPage[1]->nOve
331d0 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20 20 20  rflow );.       
331e0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
331f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
33200 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
33210 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
33220 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67  rflow==0 && pPag
33230 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29  e->nFree<=nMin )
33240 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
33250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33260 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73 74 20  MemPage * const 
33270 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e  pParent = pCur->
33280 61 70 50 61 67 65 5b 69 50 61 67 65 2d 31 5d 3b  apPage[iPage-1];
33290 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  .      int const
332a0 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69   iIdx = pCur->ai
332b0 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a 20  Idx[iPage-1];.. 
332c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
332d0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72  3PagerWrite(pPar
332e0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
332f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
33300 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64 65  ITE_OK ){.#ifnde
33310 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
33320 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20 20 20  ICKBALANCE.     
33330 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
33340 73 44 61 74 61 0a 20 20 20 20 20 20 20 20 20 26  sData.         &
33350 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  & pPage->nOverfl
33360 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 26  ow==1.         &
33370 26 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  & pPage->aOvfl[0
33380 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43  ].idx==pPage->nC
33390 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20  ell.         && 
333a0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31  pParent->pgno!=1
333b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
333c0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64  rent->nCell==iId
333d0 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  x.        ){.   
333e0 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 62         /* Call b
333f0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 74  alance_quick() t
33400 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 73  o create a new s
33410 69 62 6c 69 6e 67 20 6f 66 20 70 50 61 67 65 20  ibling of pPage 
33420 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  on which.       
33430 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74     ** to store t
33440 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
33450 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  . balance_quick(
33460 29 20 69 6e 73 65 72 74 73 20 61 20 6e 65 77 20  ) inserts a new 
33470 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a  cell.          *
33480 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2c 20  * into pParent, 
33490 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65 20  which may cause 
334a0 70 50 61 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  pParent overflow
334b0 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20 20 20  . If this.      
334c0 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20      ** happens, 
334d0 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72 61 74  the next interat
334e0 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
334f0 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  op will balance 
33500 70 50 61 72 65 6e 74 20 0a 20 20 20 20 20 20 20  pParent .       
33510 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68 65 72     ** use either
33520 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
33530 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f 64 65  () or balance_de
33540 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20 74 68  eper(). Until th
33550 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
33560 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f 76 65  happens, the ove
33570 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 73 74  rflow cell is st
33580 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42 61 6c  ored in the aBal
33590 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d  anceQuickSpace[]
335a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
335b0 66 66 65 72 2e 20 0a 20 20 20 20 20 20 20 20 20  ffer. .         
335c0 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
335d0 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
335e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
335f0 73 65 72 74 28 29 20 69 73 20 74 6f 20 63 68 65  sert() is to che
33600 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61 0a 20  ck that only a. 
33610 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
33620 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  le call to balan
33630 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 61  ce_quick() is ma
33640 64 65 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c  de for each call
33650 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20 20   to this.       
33660 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
33670 49 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f 74  If this were not
33680 20 76 65 72 69 66 69 65 64 2c 20 61 20 73 75 62   verified, a sub
33690 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76 69 6e  tle bug involvin
336a0 67 20 72 65 75 73 65 0a 20 20 20 20 20 20 20 20  g reuse.        
336b0 20 20 2a 2a 20 6f 66 20 74 68 65 20 61 42 61 6c    ** of the aBal
336c0 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d  anceQuickSpace[]
336d0 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 2e   might sneak in.
336e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
336f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
33700 28 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63  (balance_quick_c
33710 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20  alled++)==0 );. 
33720 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61           rc = ba
33730 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 72  lance_quick(pPar
33740 65 6e 74 2c 20 70 50 61 67 65 2c 20 61 42 61 6c  ent, pPage, aBal
33750 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 29 3b  anceQuickSpace);
33760 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
33770 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
33780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
33790 74 68 69 73 20 63 61 73 65 2c 20 63 61 6c 6c 20  this case, call 
337a0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
337b0 29 20 74 6f 20 72 65 64 69 73 74 72 69 62 75 74  ) to redistribut
337c0 65 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20  e cells.        
337d0 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 70 50 61    ** between pPa
337e0 67 65 20 61 6e 64 20 75 70 20 74 6f 20 32 20 6f  ge and up to 2 o
337f0 66 20 69 74 73 20 73 69 62 6c 69 6e 67 20 70 61  f its sibling pa
33800 67 65 73 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76  ges. This involv
33810 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
33820 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
33830 6e 74 65 6e 74 73 20 6f 66 20 70 50 61 72 65 6e  ntents of pParen
33840 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75  t, which may cau
33850 73 65 20 70 50 61 72 65 6e 74 20 74 6f 0a 20 20  se pParent to.  
33860 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d          ** becom
33870 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e  e overfull or un
33880 64 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e 65 78  derfull. The nex
33890 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
338a0 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20  he do-loop.     
338b0 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 61 6c       ** will bal
338c0 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
338d0 70 61 67 65 20 74 6f 20 63 6f 72 72 65 63 74 20  page to correct 
338e0 74 68 69 73 2e 0a 20 20 20 20 20 20 20 20 20 20  this..          
338f0 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ** .          **
33900 20 49 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   If the parent p
33910 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72  age becomes over
33920 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72 66 6c  full, the overfl
33930 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c 6c 73  ow cell or cells
33940 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72  .          ** ar
33950 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
33960 70 53 70 61 63 65 20 62 75 66 66 65 72 20 61 6c  pSpace buffer al
33970 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69 61 74  located immediat
33980 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20 20 20  ely below. .    
33990 20 20 20 20 20 20 2a 2a 20 41 20 73 75 62 73 65        ** A subse
339a0 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 20  quent iteration 
339b0 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77  of the do-loop w
339c0 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 20 74 68  ill deal with th
339d0 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 20 20  is by.          
339e0 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c 61 6e  ** calling balan
339f0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28 62 61  ce_nonroot() (ba
33a00 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 6d  lance_deeper() m
33a10 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72  ay be called fir
33a20 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  st,.          **
33a30 20 62 75 74 20 69 74 20 64 6f 65 73 6e 27 74 20   but it doesn't 
33a40 64 65 61 6c 20 77 69 74 68 20 6f 76 65 72 66 6c  deal with overfl
33a50 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73 74 20  ow cells - just 
33a60 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f 20 61 0a  moves them to a.
33a70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 66            ** dif
33a80 66 65 72 65 6e 74 20 70 61 67 65 29 2e 20 4f 6e  ferent page). On
33a90 63 65 20 74 68 69 73 20 73 75 62 73 65 71 75 65  ce this subseque
33aa0 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  nt call to balan
33ab0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20 20  ce_nonroot() .  
33ac0 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 63          ** has c
33ad0 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20 69 73 20  ompleted, it is 
33ae0 73 61 66 65 20 74 6f 20 72 65 6c 65 61 73 65 20  safe to release 
33af0 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
33b00 72 20 75 73 65 64 20 62 79 0a 20 20 20 20 20 20  r used by.      
33b10 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 76 69      ** the previ
33b20 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20 74 68 65  ous call, as the
33b30 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 64   overflow cell d
33b40 61 74 61 20 77 69 6c 6c 20 68 61 76 65 20 62 65  ata will have be
33b50 65 6e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  en .          **
33b60 20 63 6f 70 69 65 64 20 65 69 74 68 65 72 20 69   copied either i
33b70 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
33b80 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
33b90 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a  or into the new.
33ba0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 53 70            ** pSp
33bb0 61 63 65 20 62 75 66 66 65 72 20 70 61 73 73 65  ace buffer passe
33bc0 64 20 74 6f 20 74 68 65 20 6c 61 74 74 65 72 20  d to the latter 
33bd0 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f  call to balance_
33be0 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20 20 20  nonroot()..     
33bf0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
33c00 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 73    u8 *pSpace = s
33c10 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
33c20 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65  (pCur->pBt->page
33c30 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
33c40 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f   rc = balance_no
33c50 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c 20 69  nroot(pParent, i
33c60 49 64 78 2c 20 70 53 70 61 63 65 2c 20 69 50 61  Idx, pSpace, iPa
33c70 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20 20 20  ge==1);.        
33c80 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
33c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
33ca0 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20 4e 55   pFree is not NU
33cb0 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  LL, it points to
33cc0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
33cd0 65 72 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  er used .       
33ce0 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70 72 65       ** by a pre
33cf0 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62 61  vious call to ba
33d00 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e  lance_nonroot().
33d10 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 61 72   Its contents ar
33d20 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
33d30 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69 74 68   now stored eith
33d40 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74 61 62  er on real datab
33d50 61 73 65 20 70 61 67 65 73 20 6f 72 20 77 69 74  ase pages or wit
33d60 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20  hin the .       
33d70 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53 70 61       ** new pSpa
33d80 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20 69 74  ce buffer, so it
33d90 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20 66   may be safely f
33da0 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20  reed here. */.  
33db0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
33dc0 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29  3PageFree(pFree)
33dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
33de0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
33df0 70 53 70 61 63 65 20 62 75 66 66 65 72 20 77 69  pSpace buffer wi
33e00 6c 6c 20 62 65 20 66 72 65 65 64 20 61 66 74 65  ll be freed afte
33e10 72 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  r the next call 
33e20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
33e30 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
33e40 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66 6f 72  ), or just befor
33e50 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
33e60 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68 65 76  returns, whichev
33e70 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
33e80 63 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a 2f 0a  comes first. */.
33e90 20 20 20 20 20 20 20 20 20 20 70 46 72 65 65 20            pFree 
33ea0 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20  = pSpace;.      
33eb0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
33ec0 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66     pPage->nOverf
33ed0 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  low = 0;..      
33ee0 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 74 65 72  /* The next iter
33ef0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
33f00 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20 74 68  loop balances th
33f10 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 2a  e parent page. *
33f20 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
33f30 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
33f40 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
33f50 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
33f60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33f70 3b 0a 0a 20 20 69 66 28 20 70 46 72 65 65 20 29  ;..  if( pFree )
33f80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
33f90 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20  eFree(pFree);.  
33fa0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
33fb0 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  .../*.** Insert 
33fc0 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
33fd0 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68  o the BTree.  Th
33fe0 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62  e key is given b
33ff0 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a  y (pKey,nKey).**
34000 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73   and the data is
34010 20 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61   given by (pData
34020 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75  ,nData).  The cu
34030 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c  rsor is used onl
34040 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77  y to.** define w
34050 68 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65  hat table the re
34060 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69  cord should be i
34070 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54  nserted into.  T
34080 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
34090 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
340a0 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69   a random locati
340b0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e  on..**.** For an
340c0 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f   INTKEY table, o
340d0 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c  nly the nKey val
340e0 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73  ue of the key is
340f0 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a   used.  pKey is.
34100 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72  ** ignored.  For
34110 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c   a ZERODATA tabl
34120 65 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64  e, the pData and
34130 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20   nData are both 
34140 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
34150 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74  f the seekResult
34160 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
34170 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73  n-zero, then a s
34180 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74  uccessful call t
34190 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70 61 63  o.** MovetoUnpac
341a0 6b 65 64 28 29 20 74 6f 20 73 65 65 6b 20 63 75  ked() to seek cu
341b0 72 73 6f 72 20 70 43 75 72 20 74 6f 20 28 70 4b  rsor pCur to (pK
341c0 65 79 2c 20 6e 4b 65 79 29 20 68 61 73 20 61 6c  ey, nKey) has al
341d0 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65  ready.** been pe
341e0 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65 73  rformed. seekRes
341f0 75 6c 74 20 69 73 20 74 68 65 20 73 65 61 72 63  ult is the searc
34200 68 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65  h result returne
34210 64 20 28 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a  d (a negative.**
34220 20 6e 75 6d 62 65 72 20 69 66 20 70 43 75 72 20   number if pCur 
34230 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 6e 74  points at an ent
34240 72 79 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  ry that is small
34250 65 72 20 74 68 61 6e 20 28 70 4b 65 79 2c 20 6e  er than (pKey, n
34260 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f  Key), or.** a po
34270 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
34280 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
34290 6e 20 65 74 72 79 20 74 68 61 74 20 69 73 20 6c  n etry that is l
342a0 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20 28  arger than .** (
342b0 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a  pKey, nKey)). .*
342c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b  *.** If the seek
342d0 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72  Result parameter
342e0 20 69 73 20 30 2c 20 74 68 65 6e 20 63 75 72 73   is 0, then curs
342f0 6f 72 20 70 43 75 72 20 6d 61 79 20 70 6f 69 6e  or pCur may poin
34300 74 20 74 6f 20 61 6e 79 20 0a 2a 2a 20 65 6e 74  t to any .** ent
34310 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74 72  ry or to no entr
34320 79 20 61 74 20 61 6c 6c 2e 20 49 6e 20 74 68 69  y at all. In thi
34330 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63  s case this func
34340 74 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 65 6b  tion has to seek
34350 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 62  .** the cursor b
34360 65 66 6f 72 65 20 74 68 65 20 6e 65 77 20 6b 65  efore the new ke
34370 79 20 63 61 6e 20 62 65 20 69 6e 73 65 72 74 65  y can be inserte
34380 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
34390 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20  3BtreeInsert(.  
343a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
343b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
343c0 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
343d0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20  to the table of 
343e0 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20  this cursor */. 
343f0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
34400 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
34410 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68  /* The key of th
34420 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
34430 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
34440 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20  ata, int nData, 
34450 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20   /* The data of 
34460 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
34470 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
34480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34490 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
344a0 65 78 74 72 61 20 30 20 62 79 74 65 73 20 74 6f  extra 0 bytes to
344b0 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20   append to data 
344c0 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42  */.  int appendB
344d0 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ias,            
344e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
344f0 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e  his is likely an
34500 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74   append */.  int
34510 20 73 65 65 6b 52 65 73 75 6c 74 20 20 20 20 20   seekResult     
34520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
34530 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 4d  esult of prior M
34540 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
34550 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  call */.){.  int
34560 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20 3d   rc;.  int loc =
34570 20 73 65 65 6b 52 65 73 75 6c 74 3b 0a 20 20 69   seekResult;.  i
34580 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20  nt szNew;.  int 
34590 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
345a0 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a  pPage;.  Btree *
345b0 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
345c0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
345d0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e  t = p->pBt;.  un
345e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64  signed char *old
345f0 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Cell;.  unsigned
34600 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d   char *newCell =
34610 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
34620 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
34630 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
34640 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
34650 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
34660 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
34670 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
34680 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
34690 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 61 73  ->wrFlag );.  as
346a0 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
346b0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
346c0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
346d0 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21   pCur->pKeyInfo!
346e0 3d 30 2c 20 32 29 20 29 3b 0a 0a 20 20 2f 2a 20  =0, 2) );..  /* 
346f0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
34700 73 65 72 74 20 69 6e 74 6f 20 61 20 74 61 62 6c  sert into a tabl
34710 65 20 62 2d 74 72 65 65 2c 20 69 6e 76 61 6c 69  e b-tree, invali
34720 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f  date any incrblo
34730 62 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20  b .  ** cursors 
34740 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20  open on the row 
34750 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 28  being replaced (
34760 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 69 73  assuming this is
34770 20 61 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20   a replace.  ** 
34780 6f 70 65 72 61 74 69 6f 6e 20 2d 20 69 66 20 69  operation - if i
34790 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 66 6f  t is not, the fo
347a0 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 2d  llowing is a no-
347b0 6f 70 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  op).  */.  if( p
347c0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
347d0 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   ){.    invalida
347e0 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
347f0 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  s(p, pCur->pgnoR
34800 6f 6f 74 2c 20 6e 4b 65 79 2c 20 30 29 3b 0a 20  oot, nKey, 0);. 
34810 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   }..  if( pCur->
34820 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
34830 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
34840 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCur->skip;. 
34850 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
34860 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
34870 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
34880 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61   open on this ta
34890 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
348a0 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
348b0 65 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 4d  e call to btreeM
348c0 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69 73  oveto() below is
348d0 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20 20   a no-op. For.  
348e0 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  ** example, when
348f0 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61 20   inserting data 
34900 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74  into a table wit
34910 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64  h auto-generated
34920 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b 65   integer.  ** ke
34930 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61 79  ys, the VDBE lay
34940 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74  er invokes sqlit
34950 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 74 6f  e3BtreeLast() to
34960 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   figure out the 
34970 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b 65  .  ** integer ke
34980 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68 65  y to use. It the
34990 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  n calls this fun
349a0 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c 6c  ction to actuall
349b0 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20 20  y insert the .  
349c0 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  ** data into the
349d0 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e 20   intkey B-Tree. 
349e0 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 74 72  In this case btr
349f0 65 65 4d 6f 76 65 74 6f 28 29 20 72 65 63 6f 67  eeMoveto() recog
34a00 6e 69 7a 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  nizes.  ** that 
34a10 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
34a20 72 65 61 64 79 20 77 68 65 72 65 20 69 74 20 6e  ready where it n
34a30 65 65 64 73 20 74 6f 20 62 65 20 61 6e 64 20 72  eeds to be and r
34a40 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 0a 20  eturns without. 
34a50 20 2a 2a 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f   ** doing any wo
34a60 72 6b 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 77  rk. To avoid thw
34a70 61 72 74 69 6e 67 20 74 68 65 73 65 20 6f 70 74  arting these opt
34a80 69 6d 69 7a 61 74 69 6f 6e 73 2c 20 69 74 20 69  imizations, it i
34a90 73 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20 2a 2a  s important.  **
34aa0 20 6e 6f 74 20 74 6f 20 63 6c 65 61 72 20 74 68   not to clear th
34ab0 65 20 63 75 72 73 6f 72 20 68 65 72 65 2e 0a 20  e cursor here.. 
34ac0 20 2a 2f 0a 20 20 69 66 28 0a 20 20 20 20 53 51   */.  if(.    SQ
34ad0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
34ae0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
34af0 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
34b00 74 2c 20 70 43 75 72 29 29 20 7c 7c 20 28 21 6c  t, pCur)) || (!l
34b10 6f 63 20 26 26 0a 20 20 20 20 53 51 4c 49 54 45  oc &&.    SQLITE
34b20 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65  _OK!=(rc = btree
34b30 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65  Moveto(pCur, pKe
34b40 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42  y, nKey, appendB
34b50 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 29  ias, &loc)).  ))
34b60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
34b70 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
34b80 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
34b90 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 43  SOR_VALID || (pC
34ba0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
34bb0 4f 52 5f 49 4e 56 41 4c 49 44 20 26 26 20 6c 6f  OR_INVALID && lo
34bc0 63 29 20 29 3b 0a 0a 20 20 70 50 61 67 65 20 3d  c) );..  pPage =
34bd0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
34be0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
34bf0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
34c00 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29  Key || nKey>=0 )
34c10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34c20 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67  e->leaf || !pPag
34c30 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 54  e->intKey );.  T
34c40 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74  RACE(("INSERT: t
34c50 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c  able=%d nkey=%ll
34c60 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d  d ndata=%d page=
34c70 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
34c80 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
34c90 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c  ot, nKey, nData,
34ca0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20   pPage->pgno,.  
34cb0 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f          loc==0 ?
34cc0 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22   "overwrite" : "
34cd0 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20  new entry"));.  
34ce0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
34cf0 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63  sInit );.  alloc
34d00 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
34d10 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70  );.  newCell = p
34d20 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  Bt->pTmpSpace;. 
34d30 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20   if( newCell==0 
34d40 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
34d50 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69  NOMEM;.  rc = fi
34d60 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20  llInCell(pPage, 
34d70 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e  newCell, pKey, n
34d80 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  Key, pData, nDat
34d90 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77  a, nZero, &szNew
34da0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
34db0 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
34dc0 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d   assert( szNew==
34dd0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
34de0 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20  e, newCell) );. 
34df0 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d   assert( szNew<=
34e00 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
34e10 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70 43 75  ) );.  idx = pCu
34e20 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
34e30 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f 63  Page];.  if( loc
34e40 3d 3d 30 20 29 7b 0a 20 20 20 20 75 31 36 20 73  ==0 ){.    u16 s
34e50 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74  zOld;.    assert
34e60 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ( idx<pPage->nCe
34e70 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ll );.    rc = s
34e80 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34e90 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
34ea0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
34eb0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69        goto end_i
34ec0 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  nsert;.    }.   
34ed0 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43   oldCell = findC
34ee0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b  ell(pPage, idx);
34ef0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
34f00 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d  >leaf ){.      m
34f10 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f  emcpy(newCell, o
34f20 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20  ldCell, 4);.    
34f30 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65  }.    szOld = ce
34f40 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
34f50 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72   oldCell);.    r
34f60 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
34f70 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
34f80 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
34f90 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
34fa0 20 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70   rc = dropCell(p
34fb0 50 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64  Page, idx, szOld
34fc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
34fd0 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
34fe0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65     goto end_inse
34ff0 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rt;.    }.  }els
35000 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70  e if( loc<0 && p
35010 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Page->nCell>0 ){
35020 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
35030 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  ge->leaf );.    
35040 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
35050 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
35060 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
35070 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
35080 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  af );.  }.  rc =
35090 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
350a0 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c  e, idx, newCell,
350b0 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20   szNew, 0, 0);. 
350c0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
350d0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 2d  ITE_OK || pPage-
350e0 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50 61 67  >nCell>0 || pPag
350f0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
35100 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 72  ;..  /* If no er
35110 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
35120 61 6e 64 20 70 50 61 67 65 20 68 61 73 20 61 6e  and pPage has an
35130 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
35140 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29 20 0a  call balance() .
35150 20 20 2a 2a 20 74 6f 20 72 65 64 69 73 74 72 69    ** to redistri
35160 62 75 74 65 20 74 68 65 20 63 65 6c 6c 73 20 77  bute the cells w
35170 69 74 68 69 6e 20 74 68 65 20 74 72 65 65 2e 20  ithin the tree. 
35180 53 69 6e 63 65 20 62 61 6c 61 6e 63 65 28 29 20  Since balance() 
35190 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68  may move.  ** th
351a0 65 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f 20 74  e cursor, zero t
351b0 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  he BtCursor.info
351c0 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74 43 75 72  .nSize and BtCur
351d0 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a 20 20  sor.validNKey.  
351e0 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20  ** variables..  
351f0 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f 75 73  **.  ** Previous
35200 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
35210 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76 65 54  ite called moveT
35220 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76 65 20  oRoot() to move 
35230 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  the cursor.  ** 
35240 62 61 63 6b 20 74 6f 20 74 68 65 20 72 6f 6f 74  back to the root
35250 20 70 61 67 65 20 61 73 20 62 61 6c 61 6e 63 65   page as balance
35260 28 29 20 75 73 65 64 20 74 6f 20 69 6e 76 61 6c  () used to inval
35270 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  idate the conten
35280 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43 75 72  ts.  ** of BtCur
35290 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  sor.apPage[] and
352a0 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 5b   BtCursor.aiIdx[
352b0 5d 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 6f  ]. Instead of do
352c0 69 6e 67 20 74 68 61 74 2c 0a 20 20 2a 2a 20 73  ing that,.  ** s
352d0 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  et the cursor st
352e0 61 74 65 20 74 6f 20 22 69 6e 76 61 6c 69 64 22  ate to "invalid"
352f0 2e 20 54 68 69 73 20 6d 61 6b 65 73 20 63 6f 6d  . This makes com
35300 6d 6f 6e 20 69 6e 73 65 72 74 20 6f 70 65 72 61  mon insert opera
35310 74 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c 69 67 68  tions.  ** sligh
35320 74 6c 79 20 66 61 73 74 65 72 2e 0a 20 20 2a 2a  tly faster..  **
35330 0a 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61  .  ** There is a
35340 20 73 75 62 74 6c 65 20 62 75 74 20 69 6d 70 6f   subtle but impo
35350 72 74 61 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69  rtant optimizati
35360 6f 6e 20 68 65 72 65 20 74 6f 6f 2e 20 57 68 65  on here too. Whe
35370 6e 20 69 6e 73 65 72 74 69 6e 67 0a 20 20 2a 2a  n inserting.  **
35380 20 6d 75 6c 74 69 70 6c 65 20 72 65 63 6f 72 64   multiple record
35390 73 20 69 6e 74 6f 20 61 6e 20 69 6e 74 6b 65 79  s into an intkey
353a0 20 62 2d 74 72 65 65 20 75 73 69 6e 67 20 61 20   b-tree using a 
353b0 73 69 6e 67 6c 65 20 63 75 72 73 6f 72 20 28 61  single cursor (a
353c0 73 20 63 61 6e 0a 20 20 2a 2a 20 68 61 70 70 65  s can.  ** happe
353d0 6e 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  n while processi
353e0 6e 67 20 61 6e 20 22 49 4e 53 45 52 54 20 49 4e  ng an "INSERT IN
353f0 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 22 20 73  TO ... SELECT" s
35400 74 61 74 65 6d 65 6e 74 29 2c 20 69 74 0a 20 20  tatement), it.  
35410 2a 2a 20 69 73 20 61 64 76 61 6e 74 61 67 65 6f  ** is advantageo
35420 75 73 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20  us to leave the 
35430 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
35440 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
35450 79 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 62 2d  y in.  ** the b-
35460 74 72 65 65 20 69 66 20 70 6f 73 73 69 62 6c 65  tree if possible
35470 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  . If the cursor 
35480 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
35490 20 74 6f 20 74 68 65 20 6c 61 73 74 0a 20 20 2a   to the last.  *
354a0 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
354b0 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 6e 65  able, and the ne
354c0 78 74 20 72 6f 77 20 69 6e 73 65 72 74 65 64 20  xt row inserted 
354d0 68 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6b  has an integer k
354e0 65 79 0a 20 20 2a 2a 20 6c 61 72 67 65 72 20 74  ey.  ** larger t
354f0 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
35500 65 78 69 73 74 69 6e 67 20 6b 65 79 2c 20 69 74  existing key, it
35510 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
35520 69 6e 73 65 72 74 20 74 68 65 0a 20 20 2a 2a 20  insert the.  ** 
35530 72 6f 77 20 77 69 74 68 6f 75 74 20 73 65 65 6b  row without seek
35540 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ing the cursor. 
35550 54 68 69 73 20 63 61 6e 20 62 65 20 61 20 62 69  This can be a bi
35560 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f  g performance bo
35570 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72  ost..  */.  pCur
35580 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
35590 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
355a0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Key = 0;.  if( r
355b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
355c0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
355d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c   ){.    rc = bal
355e0 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20 20 20  ance(pCur);..   
355f0 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73 75   /* Must make su
35600 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  re nOverflow is 
35610 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65 76  reset to zero ev
35620 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e 63  en if the balanc
35630 65 28 29 0a 20 20 20 20 2a 2a 20 66 61 69 6c 73  e().    ** fails
35640 2e 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  . Internal data 
35650 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70  structure corrup
35660 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
35670 20 6f 74 68 65 72 77 69 73 65 2e 20 0a 20 20 20   otherwise. .   
35680 20 2a 2a 20 41 6c 73 6f 2c 20 73 65 74 20 74 68   ** Also, set th
35690 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 74  e cursor state t
356a0 6f 20 69 6e 76 61 6c 69 64 2e 20 54 68 69 73 20  o invalid. This 
356b0 73 74 6f 70 73 20 73 61 76 65 43 75 72 73 6f 72  stops saveCursor
356c0 50 6f 73 69 74 69 6f 6e 28 29 0a 20 20 20 20 2a  Position().    *
356d0 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  * from trying to
356e0 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   save the curren
356f0 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  t position of th
35700 65 20 63 75 72 73 6f 72 2e 20 20 2a 2f 0a 20 20  e cursor.  */.  
35710 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
35720 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76  Cur->iPage]->nOv
35730 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
35740 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
35750 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
35760 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
35770 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
35780 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  iPage]->nOverflo
35790 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69 6e 73  w==0 );..end_ins
357a0 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ert:.  return rc
357b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
357c0 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  e the entry that
357d0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
357e0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
357f0 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
35800 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
35810 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61 74   arbitrary locat
35820 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
35830 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 42  te3BtreeDelete(B
35840 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
35850 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
35860 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
35870 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
35880 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
35890 20 20 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20    .  int rc;    
358a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
358c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
358d0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
358e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358f0 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 64 65     /* Page to de
35900 6c 65 74 65 20 63 65 6c 6c 20 66 72 6f 6d 20 2a  lete cell from *
35910 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
35920 72 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  r *pCell;       
35930 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
35940 74 65 72 20 74 6f 20 63 65 6c 6c 20 74 6f 20 64  ter to cell to d
35950 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  elete */.  int i
35960 43 65 6c 6c 49 64 78 3b 20 20 20 20 20 20 20 20  CellIdx;        
35970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35980 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c  /* Index of cell
35990 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
359a0 69 6e 74 20 69 43 65 6c 6c 44 65 70 74 68 3b 20  int iCellDepth; 
359b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
359c0 20 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f 66       /* Depth of
359d0 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e 67   node containing
359e0 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20 20 61 73   pCell */ ..  as
359f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
35a00 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
35a10 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
35a20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
35a30 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
35a40 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
35a50 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72  dOnly );.  asser
35a60 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  t( pCur->wrFlag 
35a70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  );.  assert( has
35a80 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
35a90 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67  Lock(p, pCur->pg
35aa0 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b  noRoot, pCur->pK
35ab0 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b  eyInfo!=0, 2) );
35ac0 0a 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52  .  assert( !hasR
35ad0 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
35ae0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29 20  pCur->pgnoRoot) 
35af0 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
35b00 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
35b10 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d 3e  ->iPage]>=pCur->
35b20 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
35b30 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20 0a 20 20 20  ge]->nCell) .   
35b40 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65  || NEVER(pCur->e
35b50 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
35b60 4c 49 44 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  LID).  ){.    re
35b70 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
35b80 52 3b 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  R;  /* Something
35b90 20 68 61 73 20 67 6f 6e 65 20 61 77 72 79 2e 20   has gone awry. 
35ba0 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  */.  }..  /* If 
35bb0 74 68 69 73 20 69 73 20 61 20 64 65 6c 65 74 65  this is a delete
35bc0 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 72 65   operation to re
35bd0 6d 6f 76 65 20 61 20 72 6f 77 20 66 72 6f 6d 20  move a row from 
35be0 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 0a  a table b-tree,.
35bf0 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 20    ** invalidate 
35c00 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
35c10 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  sors open on the
35c20 20 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65 74   row being delet
35c30 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43  ed.  */.  if( pC
35c40 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  ur->pKeyInfo==0 
35c50 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
35c60 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
35c70 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  (p, pCur->pgnoRo
35c80 6f 74 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ot, pCur->info.n
35c90 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  Key, 0);.  }..  
35ca0 69 43 65 6c 6c 44 65 70 74 68 20 3d 20 70 43 75  iCellDepth = pCu
35cb0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 69 43 65 6c  r->iPage;.  iCel
35cc0 6c 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49  lIdx = pCur->aiI
35cd0 64 78 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a  dx[iCellDepth];.
35ce0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
35cf0 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70 74  apPage[iCellDept
35d00 68 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69  h];.  pCell = fi
35d10 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
35d20 65 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f 2a 20 49  ellIdx);..  /* I
35d30 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61  f the page conta
35d40 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20  ining the entry 
35d50 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74  to delete is not
35d60 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 6d 6f   a leaf page, mo
35d70 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  ve.  ** the curs
35d80 6f 72 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73  or to the larges
35d90 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
35da0 72 65 65 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ree that is smal
35db0 6c 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 74 68  ler than.  ** th
35dc0 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 64 65  e entry being de
35dd0 6c 65 74 65 64 2e 20 54 68 69 73 20 63 65 6c 6c  leted. This cell
35de0 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 20 74 68   will replace th
35df0 65 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  e cell being del
35e00 65 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74  eted.  ** from t
35e10 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
35e20 2e 20 54 68 65 20 27 70 72 65 76 69 6f 75 73 27  . The 'previous'
35e30 20 65 6e 74 72 79 20 69 73 20 75 73 65 64 20 66   entry is used f
35e40 6f 72 20 74 68 69 73 20 69 6e 73 74 65 61 64 0a  or this instead.
35e50 20 20 2a 2a 20 6f 66 20 74 68 65 20 27 6e 65 78    ** of the 'nex
35e60 74 27 20 65 6e 74 72 79 2c 20 61 73 20 74 68 65  t' entry, as the
35e70 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
35e80 69 73 20 61 6c 77 61 79 73 20 61 20 70 61 72 74  is always a part
35e90 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62   of the.  ** sub
35ea0 2d 74 72 65 65 20 68 65 61 64 65 64 20 62 79 20  -tree headed by 
35eb0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 6f  the child page o
35ec0 66 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67  f the cell being
35ed0 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20 6d   deleted. This m
35ee0 61 6b 65 73 0a 20 20 2a 2a 20 62 61 6c 61 6e 63  akes.  ** balanc
35ef0 69 6e 67 20 74 68 65 20 74 72 65 65 20 66 6f 6c  ing the tree fol
35f00 6c 6f 77 69 6e 67 20 74 68 65 20 64 65 6c 65 74  lowing the delet
35f10 65 20 6f 70 65 72 61 74 69 6f 6e 20 65 61 73 69  e operation easi
35f20 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  er.  */.  if( !p
35f30 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
35f40 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20    int notUsed;. 
35f50 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
35f60 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  !=(rc = sqlite3B
35f70 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
35f80 72 2c 20 26 6e 6f 74 55 73 65 64 29 29 20 29 7b  r, &notUsed)) ){
35f90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
35fa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
35fb0 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
35fc0 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65  ions of any othe
35fd0 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  r cursors open o
35fe0 6e 20 74 68 69 73 20 74 61 62 6c 65 20 62 65 66  n this table bef
35ff0 6f 72 65 0a 20 20 2a 2a 20 6d 61 6b 69 6e 67 20  ore.  ** making 
36000 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  any modification
36010 73 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 67 65  s. Make the page
36020 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
36030 65 6e 74 72 79 20 74 6f 20 62 65 20 0a 20 20 2a  entry to be .  *
36040 2a 20 64 65 6c 65 74 65 64 20 77 72 69 74 61 62  * deleted writab
36050 6c 65 2e 20 54 68 65 6e 20 66 72 65 65 20 61 6e  le. Then free an
36060 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
36070 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
36080 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 74 72 79   the .  ** entry
36090 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 72 65 6d   and finally rem
360a0 6f 76 65 20 74 68 65 20 63 65 6c 6c 20 69 74 73  ove the cell its
360b0 65 6c 66 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  elf from within 
360c0 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  the page.  */.  
360d0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
360e0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
360f0 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
36100 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 0a  gnoRoot, pCur)).
36110 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
36120 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
36130 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
36140 70 44 62 50 61 67 65 29 29 0a 20 20 20 7c 7c 20  pDbPage)).   || 
36150 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
36160 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
36170 2c 20 70 43 65 6c 6c 29 29 0a 20 20 20 7c 7c 20  , pCell)).   || 
36180 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
36190 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
361a0 20 69 43 65 6c 6c 49 64 78 2c 20 63 65 6c 6c 53   iCellIdx, cellS
361b0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
361c0 65 6c 6c 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  ell))).  ){.    
361d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
361e0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
361f0 20 64 65 6c 65 74 65 64 20 77 61 73 20 6e 6f 74   deleted was not
36200 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 6c 65   located on a le
36210 61 66 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  af page, then th
36220 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 69 73  e cursor.  ** is
36230 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
36240 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 72 67 65  ing to the large
36250 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
36260 73 75 62 2d 74 72 65 65 20 68 65 61 64 65 64 0a  sub-tree headed.
36270 20 20 2a 2a 20 62 79 20 74 68 65 20 63 68 69 6c    ** by the chil
36280 64 2d 70 61 67 65 20 6f 66 20 74 68 65 20 63 65  d-page of the ce
36290 6c 6c 20 74 68 61 74 20 77 61 73 20 6a 75 73 74  ll that was just
362a0 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 6e   deleted from an
362b0 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e   internal.  ** n
362c0 6f 64 65 2e 20 54 68 65 20 63 65 6c 6c 20 66 72  ode. The cell fr
362d0 6f 6d 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  om the leaf node
362e0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f 76   needs to be mov
362f0 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
36300 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65 20 74 6f 20  al.  ** node to 
36310 72 65 70 6c 61 63 65 20 74 68 65 20 64 65 6c 65  replace the dele
36320 74 65 64 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20  ted cell.  */.  
36330 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
36340 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
36350 2a 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e 61  *pLeaf = pCur->a
36360 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
36370 65 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c  e];.    int nCel
36380 6c 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 20 3d 20  l;.    Pgno n = 
36390 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 43 65  pCur->apPage[iCe
363a0 6c 6c 44 65 70 74 68 2b 31 5d 2d 3e 70 67 6e 6f  llDepth+1]->pgno
363b0 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
363c0 68 61 72 20 2a 70 54 6d 70 3b 0a 0a 20 20 20 20  har *pTmp;..    
363d0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
363e0 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e  (pLeaf, pLeaf->n
363f0 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 6e 43 65  Cell-1);.    nCe
36400 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
36410 28 70 4c 65 61 66 2c 20 70 43 65 6c 6c 29 3b 0a  (pLeaf, pCell);.
36420 20 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43      assert( MX_C
36430 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 6e  ELL_SIZE(pBt)>=n
36440 43 65 6c 6c 20 29 3b 0a 0a 20 20 20 20 61 6c 6c  Cell );..    all
36450 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
36460 42 74 29 3b 0a 20 20 20 20 70 54 6d 70 20 3d 20  Bt);.    pTmp = 
36470 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  pBt->pTmpSpace;.
36480 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
36490 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
364a0 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 65 61  3PagerWrite(pLea
364b0 66 2d 3e 70 44 62 50 61 67 65 29 29 20 0a 20 20  f->pDbPage)) .  
364c0 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
364d0 3d 28 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c  =(rc = insertCel
364e0 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64  l(pPage, iCellId
364f0 78 2c 20 70 43 65 6c 6c 2d 34 2c 20 6e 43 65 6c  x, pCell-4, nCel
36500 6c 2b 34 2c 20 70 54 6d 70 2c 20 6e 29 29 0a 20  l+4, pTmp, n)). 
36510 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b      || SQLITE_OK
36520 21 3d 28 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c  !=(rc = dropCell
36530 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e  (pLeaf, pLeaf->n
36540 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c 6c 29 29 0a  Cell-1, nCell)).
36550 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
36560 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
36570 7d 0a 0a 20 20 2f 2a 20 42 61 6c 61 6e 63 65 20  }..  /* Balance 
36580 74 68 65 20 74 72 65 65 2e 20 49 66 20 74 68 65  the tree. If the
36590 20 65 6e 74 72 79 20 64 65 6c 65 74 65 64 20 77   entry deleted w
365a0 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  as located on a 
365b0 6c 65 61 66 20 70 61 67 65 2c 0a 20 20 2a 2a 20  leaf page,.  ** 
365c0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
365d0 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  still points to 
365e0 74 68 61 74 20 70 61 67 65 2e 20 49 6e 20 74 68  that page. In th
365f0 69 73 20 63 61 73 65 20 74 68 65 20 66 69 72 73  is case the firs
36600 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  t.  ** call to b
36610 61 6c 61 6e 63 65 28 29 20 72 65 70 61 69 72 73  alance() repairs
36620 20 74 68 65 20 74 72 65 65 2c 20 61 6e 64 20 74   the tree, and t
36630 68 65 20 69 66 28 2e 2e 2e 29 20 63 6f 6e 64 69  he if(...) condi
36640 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 6e 65 76  tion is.  ** nev
36650 65 72 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20 20  er true..  **.  
36660 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
36670 20 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74   the entry delet
36680 65 64 20 77 61 73 20 6f 6e 20 61 6e 20 69 6e 74  ed was on an int
36690 65 72 6e 61 6c 20 6e 6f 64 65 20 70 61 67 65 2c  ernal node page,
366a0 20 74 68 65 6e 0a 20 20 2a 2a 20 70 43 75 72 20   then.  ** pCur 
366b0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  is pointing to t
366c0 68 65 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  he leaf page fro
366d0 6d 20 77 68 69 63 68 20 61 20 63 65 6c 6c 20 77  m which a cell w
366e0 61 73 20 72 65 6d 6f 76 65 64 20 74 6f 0a 20 20  as removed to.  
366f0 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 65 20 63  ** replace the c
36700 65 6c 6c 20 64 65 6c 65 74 65 64 20 66 72 6f 6d  ell deleted from
36710 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
36720 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67  de. This is slig
36730 68 74 6c 79 0a 20 20 2a 2a 20 74 72 69 63 6b 79  htly.  ** tricky
36740 20 61 73 20 74 68 65 20 6c 65 61 66 20 6e 6f 64   as the leaf nod
36750 65 20 6d 61 79 20 62 65 20 75 6e 64 65 72 66 75  e may be underfu
36760 6c 6c 2c 20 61 6e 64 20 74 68 65 20 69 6e 74 65  ll, and the inte
36770 72 6e 61 6c 20 6e 6f 64 65 20 6d 61 79 0a 20 20  rnal node may.  
36780 2a 2a 20 62 65 20 65 69 74 68 65 72 20 75 6e 64  ** be either und
36790 65 72 20 6f 72 20 6f 76 65 72 66 75 6c 6c 2e 20  er or overfull. 
367a0 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 75 6e  In this case run
367b0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 61   the balancing a
367c0 6c 67 6f 72 69 74 68 6d 0a 20 20 2a 2a 20 6f 6e  lgorithm.  ** on
367d0 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 66   the leaf node f
367e0 69 72 73 74 2e 20 49 66 20 74 68 65 20 62 61 6c  irst. If the bal
367f0 61 6e 63 65 20 70 72 6f 63 65 65 64 73 20 66 61  ance proceeds fa
36800 72 20 65 6e 6f 75 67 68 20 75 70 20 74 68 65 0a  r enough up the.
36810 20 20 2a 2a 20 74 72 65 65 20 74 68 61 74 20 77    ** tree that w
36820 65 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68  e can be sure th
36830 61 74 20 61 6e 79 20 70 72 6f 62 6c 65 6d 20 69  at any problem i
36840 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  n the internal n
36850 6f 64 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65  ode has.  ** bee
36860 6e 20 63 6f 72 72 65 63 74 65 64 2c 20 73 6f 20  n corrected, so 
36870 62 65 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65  be it. Otherwise
36880 2c 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  , after balancin
36890 67 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 2c  g the leaf node,
368a0 0a 20 20 2a 2a 20 77 61 6c 6b 20 74 68 65 20 63  .  ** walk the c
368b0 75 72 73 6f 72 20 75 70 20 74 68 65 20 74 72 65  ursor up the tre
368c0 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  e to the interna
368d0 6c 20 6e 6f 64 65 20 61 6e 64 20 62 61 6c 61 6e  l node and balan
368e0 63 65 20 69 74 20 61 73 20 0a 20 20 2a 2a 20 77  ce it as .  ** w
368f0 65 6c 6c 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ell.  */.  rc = 
36900 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 20  balance(pCur);. 
36910 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36920 4f 4b 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  OK && pCur->iPag
36930 65 3e 69 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a  e>iCellDepth ){.
36940 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
36950 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74  >iPage>iCellDept
36960 68 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  h ){.      relea
36970 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
36980 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
36990 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  -]);.    }.    r
369a0 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
369b0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
369c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
369d0 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43     moveToRoot(pC
369e0 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ur);.  }.  retur
369f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
36a00 72 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65  reate a new BTre
36a10 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20  e table.  Write 
36a20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68  into *piTable th
36a30 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72  e page.** number
36a40 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61   for the root pa
36a50 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  ge of the new ta
36a60 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ble..**.** The t
36a70 79 70 65 20 6f 66 20 74 79 70 65 20 69 73 20 64  ype of type is d
36a80 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
36a90 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
36aa0 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  .  Only the.** f
36ab0 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20  ollowing values 
36ac0 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63 75 72  of flags are cur
36ad0 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20  rently in use.  
36ae0 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72  Other values for
36af0 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20  .** flags might 
36b00 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20  not work:.**.** 
36b10 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59      BTREE_INTKEY
36b20 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20  |BTREE_LEAFDATA 
36b30 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
36b40 20 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77   tables with row
36b50 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42  id keys.**     B
36b60 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20  TREE_ZERODATA   
36b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55                 U
36b80 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69  sed for SQL indi
36b90 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ces.*/.static in
36ba0 74 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62  t btreeCreateTab
36bb0 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
36bc0 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66   *piTable, int f
36bd0 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65  lags){.  BtShare
36be0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
36bf0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
36c00 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f  t;.  Pgno pgnoRo
36c10 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ot;.  int rc;.. 
36c20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36c30 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
36c40 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
36c50 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
36c60 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
36c70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42  );.  assert( !pB
36c80 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a  t->readOnly );..
36c90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
36ca0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
36cb0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
36cc0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
36cd0 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
36ce0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
36cf0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
36d00 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28  .  }.#else.  if(
36d10 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
36d20 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
36d30 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d  oMove;      /* M
36d40 6f 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20  ove a page here 
36d50 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72  to make room for
36d60 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a   the root-page *
36d70 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
36d80 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65  PageMove; /* The
36d90 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
36da0 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65  . */..    /* Cre
36db0 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  ating a new tabl
36dc0 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72  e may probably r
36dd0 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
36de0 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
36df0 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b  se.    ** to mak
36e00 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e  e room for the n
36e10 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70  ew tables root p
36e20 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69  age. In case thi
36e30 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20  s page turns.   
36e40 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e   ** out to be an
36e50 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
36e60 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66  delete all overf
36e70 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63  low page-map cac
36e80 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20  hes.    ** held 
36e90 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  by open cursors.
36ea0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61  .    */.    inva
36eb0 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
36ec0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20  wCache(pBt);..  
36ed0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61    /* Read the va
36ee0 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66  lue of meta[3] f
36ef0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
36f00 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
36f10 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  ere the.    ** r
36f20 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
36f30 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  new table should
36f40 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20   go. meta[3] is 
36f50 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
36f60 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65  -page.    ** cre
36f70 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20  ated so far, so 
36f80 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  the new root-pag
36f90 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29  e is (meta[3]+1)
36fa0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
36fb0 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
36fc0 28 70 2c 20 42 54 52 45 45 5f 4c 41 52 47 45 53  (p, BTREE_LARGES
36fd0 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20 26 70 67  T_ROOT_PAGE, &pg
36fe0 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 70 67 6e  noRoot);.    pgn
36ff0 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  oRoot++;..    /*
37000 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   The new root-pa
37010 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c  ge may not be al
37020 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69  located on a poi
37030 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f  nter-map page, o
37040 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e  r the.    ** PEN
37050 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a  DING_BYTE page..
37060 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
37070 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d  ( pgnoRoot==PTRM
37080 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70  AP_PAGENO(pBt, p
37090 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20  gnoRoot) ||.    
370a0 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45      pgnoRoot==PE
370b0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
370c0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67  pBt) ){.      pg
370d0 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a  noRoot++;.    }.
370e0 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
370f0 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20  Root>=3 );..    
37100 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61  /* Allocate a pa
37110 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68 61  ge. The page tha
37120 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69  t currently resi
37130 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  des at pgnoRoot 
37140 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d  will.    ** be m
37150 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f  oved to the allo
37160 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65  cated page (unle
37170 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  ss the allocated
37180 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20   page happens.  
37190 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61    ** to reside a
371a0 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20  t pgnoRoot)..   
371b0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   */.    rc = all
371c0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
371d0 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20  Bt, &pPageMove, 
371e0 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52  &pgnoMove, pgnoR
371f0 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  oot, 1);.    if(
37200 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37210 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
37220 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
37230 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f  ( pgnoMove!=pgno
37240 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Root ){.      /*
37250 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65   pgnoRoot is the
37260 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20   page that will 
37270 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
37280 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20 20  root-page of.   
37290 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 61     ** the new ta
372a0 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61 6e  ble (assuming an
372b0 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f   error did not o
372c0 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77 65  ccur). But we we
372d0 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  re.      ** allo
372e0 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20  cated pgnoMove. 
372f0 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e 65  If required (i.e
37300 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  . if it was not 
37310 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
37320 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67 20  ** by extending 
37330 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20 63  the file), the c
37340 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20 70  urrent page at p
37350 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65  osition pgnoMove
37360 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72  .      ** is alr
37370 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a  eady journaled..
37380 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75        */.      u
37390 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50  8 eType;.      P
373a0 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
373b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
373c0 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20  (pPageMove);..  
373d0 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20      /* Move the 
373e0 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 61  page currently a
373f0 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67  t pgnoRoot to pg
37400 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20  noMove. */.     
37410 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
37420 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ge(pBt, pgnoRoot
37430 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20  , &pRoot, 0);.  
37440 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37450 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37460 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
37470 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70    }.      rc = p
37480 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67  trmapGet(pBt, pg
37490 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20  noRoot, &eType, 
374a0 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
374b0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
374c0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20  MAP_ROOTPAGE || 
374d0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
374e0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
374f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
37500 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
37510 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
37520 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
37530 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
37540 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
37550 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
37560 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
37570 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  rt( eType!=PTRMA
37580 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
37590 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
375a0 65 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e!=PTRMAP_FREEPA
375b0 47 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  GE );.      rc =
375c0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
375d0 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c  t, pRoot, eType,
375e0 20 69 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d   iPtrPage, pgnoM
375f0 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ove, 0);.      r
37600 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
37610 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74  );..      /* Obt
37620 61 69 6e 20 74 68 65 20 70 61 67 65 20 61 74 20  ain the page at 
37630 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20  pgnoRoot */.    
37640 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37650 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
37660 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
37670 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  }.      rc = btr
37680 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
37690 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c  gnoRoot, &pRoot,
376a0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
376b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
376c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
376d0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
376e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
376f0 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70  erWrite(pRoot->p
37700 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
37710 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37720 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
37730 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
37740 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
37750 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
37760 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f  else{.      pRoo
37770 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20  t = pPageMove;. 
37780 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70     } ..    /* Up
37790 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
377a0 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61  -map and meta-da
377b0 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ta with the new 
377c0 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
377d0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74  . */.    rc = pt
377e0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
377f0 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f  oRoot, PTRMAP_RO
37800 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20  OTPAGE, 0);.    
37810 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
37820 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
37830 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
37840 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
37850 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
37860 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c  UpdateMeta(p, 4,
37870 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20   pgnoRoot);.    
37880 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
37890 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
378a0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
378b0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65   rc;.    }..  }e
378c0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c  lse{.    rc = al
378d0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
378e0 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67  pBt, &pRoot, &pg
378f0 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  noRoot, 1, 0);. 
37900 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
37910 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
37920 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  f.  assert( sqli
37930 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
37940 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ble(pRoot->pDbPa
37950 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67  ge) );.  zeroPag
37960 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c  e(pRoot, flags |
37970 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71   PTF_LEAF);.  sq
37980 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
37990 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
379a0 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69  .  *piTable = (i
379b0 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72  nt)pgnoRoot;.  r
379c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
379d0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
379e0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42  reeCreateTable(B
379f0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69  tree *p, int *pi
37a00 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  Table, int flags
37a10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
37a20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
37a30 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  (p);.  rc = btre
37a40 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20  eCreateTable(p, 
37a50 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b  piTable, flags);
37a60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
37a70 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
37a80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
37a90 72 61 73 65 20 74 68 65 20 67 69 76 65 6e 20 64  rase the given d
37aa0 61 74 61 62 61 73 65 20 70 61 67 65 20 61 6e 64  atabase page and
37ab0 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65   all its childre
37ac0 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  n.  Return.** th
37ad0 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72  e page to the fr
37ae0 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  eelist..*/.stati
37af0 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62  c int clearDatab
37b00 61 73 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  asePage(.  BtSha
37b10 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
37b20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
37b30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
37b40 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67  he table */.  Pg
37b50 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
37b60 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
37b70 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20  er to clear */. 
37b80 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61   int freePageFla
37b90 67 2c 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f  g,     /* Deallo
37ba0 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72 75  cate page if tru
37bb0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68  e */.  int *pnCh
37bc0 61 6e 67 65 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  ange.){.  MemPag
37bd0 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
37be0 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
37bf0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
37c00 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
37c10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
37c20 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
37c30 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  x) );.  if( pgno
37c40 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  >pagerPagecount(
37c50 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  pBt) ){.    retu
37c60 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
37c70 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72  T_BKPT;.  }..  r
37c80 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
37c90 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70  ge(pBt, pgno, &p
37ca0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
37cb0 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
37cc0 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
37cd0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
37ce0 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
37cf0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
37d00 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
37d10 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
37d20 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
37d30 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
37d40 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
37d50 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70 6e 43  e(pCell), 1, pnC
37d60 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 69 66  hange);.      if
37d70 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
37d80 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
37d90 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
37da0 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67  = clearCell(pPag
37db0 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69  e, pCell);.    i
37dc0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
37dd0 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
37de0 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  ut;.  }.  if( !p
37df0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
37e00 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61    rc = clearData
37e10 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65  basePage(pBt, ge
37e20 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
37e30 44 61 74 61 5b 38 5d 29 2c 20 31 2c 20 70 6e 43  Data[8]), 1, pnC
37e40 68 61 6e 67 65 29 3b 0a 20 20 20 20 69 66 28 20  hange);.    if( 
37e50 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
37e60 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
37e70 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 6e 43  .  }else if( pnC
37e80 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 61 73 73  hange ){.    ass
37e90 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
37ea0 65 79 20 29 3b 0a 20 20 20 20 2a 70 6e 43 68 61  ey );.    *pnCha
37eb0 6e 67 65 20 2b 3d 20 70 50 61 67 65 2d 3e 6e 43  nge += pPage->nC
37ec0 65 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  ell;.  }.  if( f
37ed0 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20  reePageFlag ){. 
37ee0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
37ef0 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  (pPage);.  }else
37f00 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
37f10 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
37f20 67 65 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d 30  ge->pDbPage))==0
37f30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   ){.    zeroPage
37f40 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61  (pPage, pPage->a
37f50 44 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45  Data[0] | PTF_LE
37f60 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64  AF);.  }..cleard
37f70 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a  atabasepage_out:
37f80 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
37f90 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
37fa0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
37fb0 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  ete all informat
37fc0 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ion from a singl
37fd0 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  e table in the d
37fe0 61 74 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65  atabase.  iTable
37ff0 20 69 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20   is.** the page 
38000 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f  number of the ro
38010 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ot of the table.
38020 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75    After this rou
38030 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a  tine returns,.**
38040 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
38050 73 20 65 6d 70 74 79 2c 20 62 75 74 20 73 74 69  s empty, but sti
38060 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ll exists..**.**
38070 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
38080 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c  ll fail with SQL
38090 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68  ITE_LOCKED if th
380a0 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e  ere are any open
380b0 0a 2a 2a 20 72 65 61 64 20 63 75 72 73 6f 72 73  .** read cursors
380c0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   on the table.  
380d0 4f 70 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f  Open write curso
380e0 72 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  rs are moved to 
380f0 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74  the.** root of t
38100 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
38110 49 66 20 70 6e 43 68 61 6e 67 65 20 69 73 20 6e  If pnChange is n
38120 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 61  ot NULL, then ta
38130 62 6c 65 20 69 54 61 62 6c 65 20 6d 75 73 74 20  ble iTable must 
38140 62 65 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62  be an intkey tab
38150 6c 65 2e 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67  le. The.** integ
38160 65 72 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64  er value pointed
38170 20 74 6f 20 62 79 20 70 6e 43 68 61 6e 67 65 20   to by pnChange 
38180 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62  is incremented b
38190 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
381a0 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ** entries in th
381b0 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  e table..*/.int 
381c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
381d0 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  rTable(Btree *p,
381e0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
381f0 20 2a 70 6e 43 68 61 6e 67 65 29 7b 0a 20 20 69   *pnChange){.  i
38200 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
38210 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
38220 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
38230 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
38240 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
38250 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a 20  RANS_WRITE );.. 
38260 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61   /* Invalidate a
38270 6c 6c 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ll incrblob curs
38280 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 61 62 6c  ors open on tabl
38290 65 20 69 54 61 62 6c 65 20 28 61 73 73 75 6d 69  e iTable (assumi
382a0 6e 67 20 69 54 61 62 6c 65 0a 20 20 2a 2a 20 69  ng iTable.  ** i
382b0 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 20  s the root of a 
382c0 74 61 62 6c 65 20 62 2d 74 72 65 65 20 2d 20 69  table b-tree - i
382d0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
382e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20   following call 
382f0 69 73 0a 20 20 2a 2a 20 61 20 6e 6f 2d 6f 70 29  is.  ** a no-op)
38300 2e 20 20 2a 2f 0a 20 20 69 6e 76 61 6c 69 64 61  .  */.  invalida
38310 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
38320 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20  s(p, iTable, 0, 
38330 31 29 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  1);..  if( SQLIT
38340 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 61 76 65  E_OK==(rc = save
38350 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
38360 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 29  (Pgno)iTable, 0)
38370 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  ) ){.    rc = cl
38380 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
38390 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c  pBt, (Pgno)iTabl
383a0 65 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65 29 3b  e, 0, pnChange);
383b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
383c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
383d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
383e0 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66  ** Erase all inf
383f0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61  ormation in a ta
38400 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65 20  ble and add the 
38410 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
38420 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65  e to.** the free
38430 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74  list.  Except, t
38440 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70  he root of the p
38450 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28  rinciple table (
38460 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61  the one on.** pa
38470 67 65 20 31 29 20 69 73 20 6e 65 76 65 72 20 61  ge 1) is never a
38480 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
38490 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  list..**.** This
384a0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61   routine will fa
384b0 69 6c 20 77 69 74 68 20 53 51 4c