/ Hex Artifact Content
Login

Artifact 0cc9c503015fa4970b41833c1a253410ad055ce5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 36 35 36 20 32 30 30 39 2f 30  c,v 1.656 2009/0
0190: 37 2f 30 37 20 31 35 3a 34 37 3a 31 32 20 64 61  7/07 15:47:12 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 69 6e 74 20 73 71 6c 69  n()..*/.int sqli
5450: 74 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 43  te3BtreeRestoreC
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 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
5680: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
5690: 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20  sition(p) : \.  
56a0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
56b0: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
56c0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
56d0: 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d  t a cursor has m
56e0: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f  oved from the po
56f0: 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73  sition it.** was
5700: 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74 2e   last placed at.
5710: 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f    Cursors can mo
5720: 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20  ve when the row 
5730: 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e  they are pointin
5740: 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65 74  g.** at is delet
5750: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
5760: 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r them..**.** Th
5770: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
5780: 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ns an error code
5790: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
57a0: 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a 2a  es wrong.  The.*
57b0: 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73 4d  * integer *pHasM
57c0: 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 6f  oved is set to o
57d0: 6e 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  ne if the cursor
57e0: 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20 30   has moved and 0
57f0: 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20   if not..*/.int 
5800: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
5810: 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72  orHasMoved(BtCur
5820: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
5830: 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69 6e  pHasMoved){.  in
5840: 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  t rc;..  rc = re
5850: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
5860: 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
5870: 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61 73   rc ){.    *pHas
5880: 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 72  Moved = 1;.    r
5890: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
58a0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
58b0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  !=CURSOR_VALID |
58c0: 7c 20 70 43 75 72 2d 3e 73 6b 69 70 21 3d 30 20  | pCur->skip!=0 
58d0: 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  ){.    *pHasMove
58e0: 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
58f0: 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d      *pHasMoved =
5900: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5910: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
5920: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5930: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
5940: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65  .** Given a page
5950: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
5960: 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61  ular database pa
5970: 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70  ge, return the p
5980: 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  age.** number fo
5990: 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  r the pointer-ma
59a0: 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  p page that cont
59b0: 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66  ains the entry f
59c0: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20  or the.** input 
59d0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  page number..*/.
59e0: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
59f0: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
5a00: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
5a10: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
5a20: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67  PerMapPage;.  Pg
5a30: 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  no iPtrMap, ret;
5a40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5a50: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
5a60: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e  t->mutex) );.  n
5a70: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
5a80: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
5a90: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
5aa0: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
5ab0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
5ac0: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
5ad0: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
5ae0: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
5af0: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
5b00: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
5b10: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
5b20: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
5b30: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
5b40: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
5b50: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
5b60: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
5b70: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
5b80: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
5b90: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
5ba0: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
5bb0: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
5bc0: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
5bd0: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
5be0: 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f  ..** An error co
5bf0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
5c00: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
5c10: 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73   wrong, otherwis
5c20: 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
5c30: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
5c40: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
5c50: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
5c60: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
5c70: 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  ent){.  DbPage *
5c80: 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65  pDbPage;  /* The
5c90: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
5ca0: 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  e */.  u8 *pPtrm
5cb0: 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ap;      /* The 
5cc0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61  pointer map data
5cd0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d   */.  Pgno iPtrm
5ce0: 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ap;     /* The p
5cf0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
5d00: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
5d10: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  offset;       /*
5d20: 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74   Offset in point
5d30: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
5d40: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
5d50: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5d60: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
5d70: 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d  x) );.  /* The m
5d80: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61  aster-journal pa
5d90: 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e  ge number must n
5da0: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20  ever be used as 
5db0: 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  a pointer map pa
5dc0: 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
5dd0: 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45  0==PTRMAP_ISPAGE
5de0: 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59  (pBt, PENDING_BY
5df0: 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b  TE_PAGE(pBt)) );
5e00: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
5e10: 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
5e20: 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20   if( key==0 ){. 
5e30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5e40: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
5e50: 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50   }.  iPtrmap = P
5e60: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
5e70: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
5e80: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
5e90: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
5ea0: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
5eb0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5ec0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
5ed0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  n rc;.  }.  offs
5ee0: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
5ef0: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
5f00: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
5f10: 74 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  t<0 ){.    rc = 
5f20: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
5f30: 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74  KPT;.    goto pt
5f40: 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  rmap_exit;.  }. 
5f50: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
5f60: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
5f70: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
5f80: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
5f90: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
5fa0: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
5fb0: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
5fc0: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
5fd0: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
5fe0: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
5ff0: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
6000: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20  arent));.    rc 
6010: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
6020: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
6030: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6040: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
6050: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
6060: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
6070: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
6080: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
6090: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72  ;.    }.  }..ptr
60a0: 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  map_exit:.  sqli
60b0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
60c0: 62 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  bPage);.  return
60d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
60e0: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
60f0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
6100: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6110: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
6120: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
6130: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
6140: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
6150: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
6160: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
6170: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
6180: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
6190: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
61a0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
61b0: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
61c0: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
61d0: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
61e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
61f0: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
6200: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
6210: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
6220: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
6230: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
6240: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6250: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
6260: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
6270: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
6280: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
6290: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
62a0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
62b0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
62c0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
62d0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
62e0: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
62f0: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
6300: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
6310: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6320: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
6330: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
6340: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
6350: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
6360: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
6370: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
6380: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
6390: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
63a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
63b0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
63c0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
63d0: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
63e0: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
63f0: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
6400: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73 65  ap, key);.  asse
6410: 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b  rt( pEType!=0 );
6420: 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74  .  *pEType = pPt
6430: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  rmap[offset];.  
6440: 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67  if( pPgno ) *pPg
6450: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
6460: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
6470: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  );..  sqlite3Pag
6480: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
6490: 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c  ;.  if( *pEType<
64a0: 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29  1 || *pEType>5 )
64b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
64c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72  ORRUPT_BKPT;.  r
64d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
64e0: 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  .}..#else /* if 
64f0: 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f  defined SQLITE_O
6500: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
6510: 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  /.  #define ptrm
6520: 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 29 20 53  apPut(w,x,y,z) S
6530: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
6540: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
6550: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
6560: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
6570: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 29  PutOvflPtr(x, y)
6580: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
6590: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
65a0: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
65b0: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
65c0: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
65d0: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
65e0: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
65f0: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
6600: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
6610: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
6620: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
6630: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
6640: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e  routine works on
6650: 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61  ly for pages tha
6660: 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  t do not contain
6670: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
6680: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  .*/.#define find
6690: 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28  Cell(P,I) \.  ((
66a0: 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29  P)->aData + ((P)
66b0: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
66c0: 32 62 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74  2byte(&(P)->aDat
66d0: 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65  a[(P)->cellOffse
66e0: 74 2b 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a  t+2*(I)])))../*.
66f0: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
6700: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
6710: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
6720: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
6730: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
6740: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
6750: 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73 65 72 74  lls.  See insert
6760: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66  .*/.static u8 *f
6770: 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
6780: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
6790: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e  int iCell){.  in
67a0: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t i;.  assert( s
67b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
67c0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
67d0: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  tex) );.  for(i=
67e0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
67f0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
6800: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73      int k;.    s
6810: 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20  truct _OvflCell 
6820: 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66  *pOvfl;.    pOvf
6830: 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66  l = &pPage->aOvf
6840: 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f  l[i];.    k = pO
6850: 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66  vfl->idx;.    if
6860: 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20  ( k<=iCell ){.  
6870: 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c      if( k==iCell
6880: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
6890: 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b  rn pOvfl->pCell;
68a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
68b0: 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Cell--;.    }.  
68c0: 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43  }.  return findC
68d0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
68e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  );.}../*.** Pars
68f0: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
6900: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
6910: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
6920: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72  structure.  Ther
6930: 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72  e.** are two ver
6940: 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75  sions of this fu
6950: 6e 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65 33  nction.  sqlite3
6960: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  BtreeParseCell()
6970: 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c   takes a .** cel
6980: 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73  l index as the s
6990: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61  econd argument a
69a0: 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nd sqlite3BtreeP
69b0: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a  arseCellPtr() .*
69c0: 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65  * takes a pointe
69d0: 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  r to the body of
69e0: 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73   the cell as its
69f0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6a00: 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74  ..**.** Within t
6a10: 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61  his file, the pa
6a20: 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20  rseCell() macro 
6a30: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e  can be called in
6a40: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c 69  stead of.** sqli
6a50: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
6a60: 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f  lPtr(). Using so
6a70: 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68  me compilers, th
6a80: 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65  is will be faste
6a90: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
6aa0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
6ab0: 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Ptr(.  MemPage *
6ac0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
6ad0: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
6ae0: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
6af0: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
6b00: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
6b10: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
6b20: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
6b30: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
6b40: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
6b50: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
6b60: 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20  {.  u16 n;      
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6b80: 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63  umber bytes in c
6b90: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64  ell content head
6ba0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  er */.  u32 nPay
6bb0: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
6bc0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
6bd0: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
6be0: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
6bf0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6c00: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
6c10: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e  mutex) );..  pIn
6c20: 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c  fo->pCell = pCel
6c30: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  l;.  assert( pPa
6c40: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
6c50: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
6c60: 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68  .  n = pPage->ch
6c70: 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73  ildPtrSize;.  as
6c80: 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61  sert( n==4-4*pPa
6c90: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66  ge->leaf );.  if
6ca0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
6cb0: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
6cc0: 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
6cd0: 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e     n += getVarin
6ce0: 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e  t32(&pCell[n], n
6cf0: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65  Payload);.    }e
6d00: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c  lse{.      nPayl
6d10: 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  oad = 0;.    }. 
6d20: 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e     n += getVarin
6d30: 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36  t(&pCell[n], (u6
6d40: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
6d50: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61  ;.    pInfo->nDa
6d60: 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ta = nPayload;. 
6d70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66   }else{.    pInf
6d80: 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20  o->nData = 0;.  
6d90: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
6da0: 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50  32(&pCell[n], nP
6db0: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e  ayload);.    pIn
6dc0: 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c  fo->nKey = nPayl
6dd0: 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  oad;.  }.  pInfo
6de0: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
6df0: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
6e00: 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69  nHeader = n;.  i
6e10: 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f  f( likely(nPaylo
6e20: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
6e30: 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  cal) ){.    /* T
6e40: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
6e50: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
6e60: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
6e70: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
6e80: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
6e90: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
6ea0: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
6eb0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e      */.    int n
6ec0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Size;          /
6ed0: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
6ee0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
6ef0: 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69  bytes */.    nSi
6f00: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
6f10: 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  n;.    pInfo->nL
6f20: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79  ocal = (u16)nPay
6f30: 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  load;.    pInfo-
6f40: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >iOverflow = 0;.
6f50: 20 20 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26      if( (nSize &
6f60: 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   ~3)==0 ){.     
6f70: 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20   nSize = 4;     
6f80: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
6f90: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
6fa0: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d      }.    pInfo-
6fb0: 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 6e 53  >nSize = (u16)nS
6fc0: 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ize;.  }else{.  
6fd0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
6fe0: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
6ff0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
7000: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
7010: 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f  e have.    ** to
7020: 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68   decide how much
7030: 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
7040: 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74  y and how much t
7050: 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20  o spill onto.   
7060: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
7070: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
7080: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
7090: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
70a0: 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61  nused.    ** spa
70b0: 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce on overflow p
70c0: 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69  ages while keepi
70d0: 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ng the amount of
70e0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20   local storage. 
70f0: 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e     ** in between
7100: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
7110: 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  xLocal..    **. 
7120: 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20     ** Warning:  
7130: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
7140: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
7150: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
7160: 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77   in any.    ** w
7170: 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  ay will result i
7180: 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
7190: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20  e file format.. 
71a0: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69     */.    int mi
71b0: 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69  nLocal;  /* Mini
71c0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
71d0: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
71e0: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61  ly */.    int ma
71f0: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
7200: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
7210: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
7220: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75  ly */.    int su
7230: 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72  rplus;   /* Over
7240: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61  flow payload ava
7250: 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c  ilable for local
7260: 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20   storage */..   
7270: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
7280: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
7290: 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67   maxLocal = pPag
72a0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  e->maxLocal;.   
72b0: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
72c0: 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20  cal + (nPayload 
72d0: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61  - minLocal)%(pPa
72e0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
72f0: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69 66  ize - 4);.    if
7300: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
7310: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70  Local ){.      p
7320: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
7330: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20  u16)surplus;.   
7340: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
7350: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7360: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  16)minLocal;.   
7370: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
7380: 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28  verflow = (u16)(
7390: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
73a0: 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  n);.    pInfo->n
73b0: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
73c0: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
73d0: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
73e0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
73f0: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71  l, pInfo) \.  sq
7400: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
7410: 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20  ellPtr((pPage), 
7420: 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29  findCell((pPage)
7430: 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e  , (iCell)), (pIn
7440: 66 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69 74 65  fo)).void sqlite
7450: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
7460: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
7470: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
7480: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
7490: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
74a0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
74b0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
74c0: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
74d0: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
74e0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
74f0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7500: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
7510: 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c  /.){.  parseCell
7520: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70  (pPage, iCell, p
7530: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
7540: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
7550: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
7560: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
7570: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
7580: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
7590: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
75a0: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
75b0: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
75c0: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
75d0: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
75e0: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
75f0: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
7600: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
7610: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
7620: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
7630: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
7640: 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65  lSizePtr(MemPage
7650: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
7660: 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  ll){.  u8 *pIter
7670: 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d   = &pCell[pPage-
7680: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
7690: 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69    u32 nSize;..#i
76a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
76b0: 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  G.  /* The value
76c0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
76d0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
76e0: 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  d always be the 
76f0: 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  same as.  ** the
7700: 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65   (CellInfo.nSize
7710: 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79  ) value found by
7720: 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61   doing a full pa
7730: 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  rse of the.  ** 
7740: 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f  cell. If SQLITE_
7750: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
7760: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74  , an assert() at
7770: 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20   the bottom of. 
7780: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
7790: 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  n verifies that 
77a0: 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69  this invariant i
77b0: 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20  s not violated. 
77c0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65  */.  CellInfo de
77d0: 62 75 67 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  buginfo;.  sqlit
77e0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
77f0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
7800: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
7810: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
7820: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
7830: 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20    u8 *pEnd;.    
7840: 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
7850: 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  ta ){.      pIte
7860: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
7870: 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a  (pIter, nSize);.
7880: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7890: 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20   nSize = 0;.    
78a0: 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  }..    /* pIter 
78b0: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
78c0: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
78d0: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
78e0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
78f0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
7900: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7910: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
7920: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
7930: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
7940: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
7950: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
7960: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
7970: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
7980: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
7990: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
79a0: 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
79b0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
79c0: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
79d0: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ize);.  }..  if(
79e0: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
79f0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  xLocal ){.    in
7a00: 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61  t minLocal = pPa
7a10: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
7a20: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
7a30: 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69  al + (nSize - mi
7a40: 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65  nLocal) % (pPage
7a50: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
7a60: 65 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20  e - 4);.    if( 
7a70: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
7a80: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
7a90: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
7aa0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
7ab0: 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69   += 4;.  }.  nSi
7ac0: 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65  ze += (u32)(pIte
7ad0: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f  r - pCell);..  /
7ae0: 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69  * The minimum si
7af0: 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69  ze of any cell i
7b00: 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  s 4 bytes. */.  
7b10: 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20  if( nSize<4 ){. 
7b20: 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20     nSize = 4;.  
7b30: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69  }..  assert( nSi
7b40: 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53  ze==debuginfo.nS
7b50: 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ize );.  return 
7b60: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 23 69  (u16)nSize;.}.#i
7b70: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
7b80: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
7b90: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7ba0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72   int iCell){.  r
7bb0: 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74  eturn cellSizePt
7bc0: 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c  r(pPage, findCel
7bd0: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29  l(pPage, iCell))
7be0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
7bf0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7c00: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
7c10: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65   If the cell pCe
7c20: 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65  ll, part of page
7c30: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
7c40: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
7c50: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
7c60: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
7c70: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
7c80: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
7c90: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
7ca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
7cb0: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
7cc0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
7cd0: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65  u8 *pCell){.  Ce
7ce0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61  llInfo info;.  a
7cf0: 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20  ssert( pCell!=0 
7d00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
7d10: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
7d20: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
7d30: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69  o);.  assert( (i
7d40: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
7d50: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
7d60: 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
7d70: 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69  yload );.  if( i
7d80: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
7d90: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d  .    Pgno ovfl =
7da0: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
7db0: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
7dc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74  );.    return pt
7dd0: 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
7de0: 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50  Bt, ovfl, PTRMAP
7df0: 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
7e00: 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  e->pgno);.  }.  
7e10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7e20: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
7e30: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
7e40: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
7e50: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
7e60: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
7e70: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
7e80: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
7e90: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
7ea0: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
7eb0: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
7ec0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
7ed0: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
7ee0: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
7ef0: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
7f00: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
7f10: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
7f20: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
7f30: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
7f40: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
7f50: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
7f60: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
7f70: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
7f80: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
7f90: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
7fa0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20   */.  int addr; 
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
7fd0: 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20 63  rst byte after c
7fe0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
7ff0: 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  y */.  int hdr; 
8000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8010: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8020: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
8030: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8050: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
8060: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
8070: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
8080: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
8090: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
80a0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
80b0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
80c0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
80d0: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
80e0: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
80f0: 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20  t cbrk;         
8100: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
8110: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
8120: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
8130: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
8140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8150: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
8160: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
8170: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
8180: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
8190: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
81a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
81b0: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
81c0: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
81d0: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  l content */..  
81e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
81f0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
8200: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
8210: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8220: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
8230: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
8240: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c  Bt->usableSize <
8250: 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
8260: 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65  E_SIZE );.  asse
8270: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
8280: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
8290: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
82a0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
82b0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
82c0: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  temp = sqlite3Pa
82d0: 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61  gerTempSpace(pPa
82e0: 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
82f0: 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
8300: 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
8310: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
8320: 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  t;.  cellOffset 
8330: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
8340: 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  set;.  nCell = p
8350: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
8360: 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65  ssert( nCell==ge
8370: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
8380: 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65  +3]) );.  usable
8390: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
83a0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
83b0: 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65   cbrk = get2byte
83c0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
83d0: 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 63    memcpy(&temp[c
83e0: 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b  brk], &data[cbrk
83f0: 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  ], usableSize - 
8400: 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20  cbrk);.  cbrk = 
8410: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f  usableSize;.  fo
8420: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
8430: 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41  i++){.    u8 *pA
8440: 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ddr;     /* The 
8450: 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65  i-th cell pointe
8460: 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d  r */.    pAddr =
8470: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
8480: 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63  t + i*2];.    pc
8490: 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64   = get2byte(pAdd
84a0: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 63 3e 3d  r);.    if( pc>=
84b0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
84c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
84d0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
84e0: 20 20 20 20 7d 0a 20 20 20 20 73 69 7a 65 20 3d      }.    size =
84f0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
8500: 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a  ge, &temp[pc]);.
8510: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
8520: 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 63  ;.    if( cbrk<c
8530: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c  ellOffset+2*nCel
8540: 6c 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  l || pc+size>usa
8550: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
8560: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8570: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8580: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
8590: 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65  brk+size<=usable
85a0: 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 30 20  Size && cbrk>=0 
85b0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
85c0: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70  ata[cbrk], &temp
85d0: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20  [pc], size);.   
85e0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
85f0: 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73   cbrk);.  }.  as
8600: 73 65 72 74 28 20 63 62 72 6b 3e 3d 63 65 6c 6c  sert( cbrk>=cell
8610: 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29  Offset+2*nCell )
8620: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
8630: 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29  ta[hdr+5], cbrk)
8640: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20  ;.  data[hdr+1] 
8650: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
8660: 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  2] = 0;.  data[h
8670: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64  dr+7] = 0;.  add
8680: 72 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32  r = cellOffset+2
8690: 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74  *nCell;.  memset
86a0: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c  (&data[addr], 0,
86b0: 20 63 62 72 6b 2d 61 64 64 72 29 3b 0a 20 20 61   cbrk-addr);.  a
86c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
86d0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
86e0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
86f0: 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 61 64 64  ;.  if( cbrk-add
8700: 72 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  r!=pPage->nFree 
8710: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8720: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8730: 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
8740: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8750: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
8760: 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  te bytes of spac
8770: 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  e from within th
8780: 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61  e B-Tree page pa
8790: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
87a0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 52  irst argument. R
87b0: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
87c0: 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
87d0: 61 5b 5d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  a[] of the .** f
87e0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
87f0: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 0a 2a  ocated space. .*
8800: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
8810: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
8820: 74 68 65 20 73 70 61 63 65 20 62 65 74 77 65 65  the space betwee
8830: 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
8840: 20 63 65 6c 6c 2d 6f 66 66 73 65 74 20 0a 2a 2a   cell-offset .**
8850: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 73   array and the s
8860: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
8870: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73  -content area is
8880: 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20   at least nByte 
8890: 62 79 74 65 73 0a 2a 2a 20 69 6e 20 73 69 7a 65  bytes.** in size
88a0: 2e 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  . So this routin
88b0: 65 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  e can never fail
88c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
88d0: 20 61 72 65 20 61 6c 72 65 61 64 79 20 36 30 20   are already 60 
88e0: 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 20 6f 66  or more bytes of
88f0: 20 66 72 61 67 6d 65 6e 74 73 20 77 69 74 68 69   fragments withi
8900: 6e 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 74  n the page,.** t
8910: 68 65 20 70 61 67 65 20 69 73 20 64 65 66 72 61  he page is defra
8920: 67 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 20 72  gmented before r
8930: 65 74 75 72 6e 69 6e 67 2e 20 49 66 20 74 68 69  eturning. If thi
8940: 73 20 77 65 72 65 20 6e 6f 74 20 64 6f 6e 65 20  s were not done 
8950: 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 68  there.** is a ch
8960: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6e 75  ance that the nu
8970: 6d 62 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74  mber of fragment
8980: 65 64 20 62 79 74 65 73 20 63 6f 75 6c 64 20 65  ed bytes could e
8990: 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 6f 76  ventually .** ov
89a0: 65 72 66 6c 6f 77 20 74 68 65 20 73 69 6e 67 6c  erflow the singl
89b0: 65 2d 62 79 74 65 20 66 69 65 6c 64 20 6f 66 20  e-byte field of 
89c0: 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
89d0: 69 6e 20 77 68 69 63 68 20 74 68 69 73 20 76 61  in which this va
89e0: 6c 75 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  lue.** is stored
89f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8a00: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
8a10: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
8a20: 74 20 6e 42 79 74 65 29 7b 0a 20 20 63 6f 6e 73  t nByte){.  cons
8a30: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
8a40: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
8a50: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
8a60: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
8a70: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
8a80: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
8a90: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
8aa0: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
8ab0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
8ac0: 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20    int nFrag;    
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ae0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8af0: 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62   of fragmented b
8b00: 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ytes on pPage */
8b10: 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 0a 20  .  int top;.  . 
8b20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8b30: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
8b40: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
8b50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8b60: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
8b70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8b80: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8b90: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8ba0: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d   assert( nByte>=
8bb0: 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  0 );  /* Minimum
8bc0: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
8bd0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
8be0: 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65  ge->nFree>=nByte
8bf0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8c00: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
8c10: 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  0 );..  /* Asser
8c20: 74 20 74 68 61 74 20 74 68 65 20 73 70 61 63 65  t that the space
8c30: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c   between the cel
8c40: 6c 2d 6f 66 66 73 65 74 20 61 72 72 61 79 20 61  l-offset array a
8c50: 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c  nd the .  ** cel
8c60: 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69  l-content area i
8c70: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e  s greater than n
8c80: 42 79 74 65 20 62 79 74 65 73 2e 0a 20 20 2a 2f  Byte bytes..  */
8c90: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
8ca0: 20 3c 3d 20 28 0a 20 20 20 20 20 20 67 65 74 32   <= (.      get2
8cb0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
8cc0: 5d 29 2d 28 68 64 72 2b 38 2b 28 70 50 61 67 65  ])-(hdr+8+(pPage
8cd0: 2d 3e 6c 65 61 66 3f 30 3a 34 29 2b 32 2a 67 65  ->leaf?0:4)+2*ge
8ce0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
8cf0: 2b 33 5d 29 29 0a 20 20 29 29 3b 0a 0a 20 20 6e  +3])).  ));..  n
8d00: 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b  Frag = data[hdr+
8d10: 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3e  7];.  if( nFrag>
8d20: 3d 36 30 20 29 7b 0a 20 20 20 20 64 65 66 72 61  =60 ){.    defra
8d30: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
8d40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
8d50: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65  * Search the fre
8d60: 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f  elist looking fo
8d70: 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69  r a free slot bi
8d80: 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69  g enough to sati
8d90: 73 66 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  sfy .    ** the 
8da0: 72 65 71 75 65 73 74 2e 20 54 68 65 20 61 6c 6c  request. The all
8db0: 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 20  ocation is made 
8dc0: 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 66  from the first f
8dd0: 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20  ree slot in .   
8de0: 20 2a 2a 20 74 68 65 20 6c 69 73 74 20 74 68 61   ** the list tha
8df0: 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  t is large enoug
8e00: 68 20 74 6f 20 61 63 63 6f 6d 61 64 61 74 65 20  h to accomadate 
8e10: 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
8e20: 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20  nt pc, addr;.   
8e30: 20 66 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b   for(addr=hdr+1;
8e40: 20 28 70 63 20 3d 20 67 65 74 32 62 79 74 65 28   (pc = get2byte(
8e50: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b  &data[addr]))>0;
8e60: 20 61 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20   addr=pc){.     
8e70: 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32   int size = get2
8e80: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
8e90: 29 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  );     /* Size o
8ea0: 66 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20  f free slot */. 
8eb0: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e       if( size>=n
8ec0: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
8ed0: 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e  int x = size - n
8ee0: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Byte;.        if
8ef0: 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ( x<4 ){.       
8f00: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
8f10: 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66   slot from the f
8f20: 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65  ree-list. Update
8f30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
8f40: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67           ** frag
8f50: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74  mented bytes wit
8f60: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f  hin the page. */
8f70: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
8f80: 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26  y(&data[addr], &
8f90: 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20  data[pc], 2);.  
8fa0: 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72          data[hdr
8fb0: 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67  +7] = (u8)(nFrag
8fc0: 20 2b 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d   + x);.        }
8fd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8fe0: 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61  /* The slot rema
8ff0: 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ins on the free-
9000: 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73  list. Reduce its
9010: 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74   size to account
9020: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  .          ** fo
9030: 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73  r the portion us
9040: 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c  ed by the new al
9050: 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  location. */.   
9060: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
9070: 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b  &data[pc+2], x);
9080: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9090: 20 20 20 72 65 74 75 72 6e 20 70 63 20 2b 20 78     return pc + x
90a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
90b0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
90c0: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
90d0: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
90e0: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
90f0: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
9100: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
9110: 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20  nt area..  */.  
9120: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
9130: 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2d 20 6e  data[hdr+5]) - n
9140: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
9150: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
9160: 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f  op);.  return to
9170: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
9180: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
9190: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
91a0: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
91b0: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
91c0: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
91d0: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
91e0: 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d  ge->aDisk[start]
91f0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
9200: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
9210: 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a   "size" bytes..*
9220: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
9230: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
9240: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
9250: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
9260: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
9270: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
9280: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
9290: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
92a0: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
92b0: 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69  ge, int start, i
92c0: 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20  nt size){.  int 
92d0: 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64  addr, pbegin, hd
92e0: 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
92f0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
9300: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
9310: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
9320: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
9330: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
9340: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
9350: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
9360: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
9370: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70  ->hdrOffset+6+(p
9380: 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20  Page->leaf?0:4) 
9390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74  );.  assert( (st
93a0: 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61  art + size)<=pPa
93b0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
93c0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
93d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
93e0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
93f0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9400: 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20  rt( size>=0 );  
9410: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
9420: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23   size is 4 */..#
9430: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  ifdef SQLITE_SEC
9440: 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20  URE_DELETE.  /* 
9450: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
9460: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
9470: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
9480: 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  e SECURE_DELETE 
9490: 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20  .  ** option is 
94a0: 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
94b0: 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d  le-time */.  mem
94c0: 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d  set(&data[start]
94d0: 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64  , 0, size);.#end
94e0: 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
94f0: 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f   space back into
9500: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
9510: 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a   of freeblocks *
9520: 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  /.  hdr = pPage-
9530: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64  >hdrOffset;.  ad
9540: 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  dr = hdr + 1;.  
9550: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
9560: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9570: 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26  addr]))<start &&
9580: 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20   pbegin>0 ){.   
9590: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c   assert( pbegin<
95a0: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
95b0: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
95c0: 20 69 66 28 20 70 62 65 67 69 6e 3c 3d 61 64 64   if( pbegin<=add
95d0: 72 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  r ) {.      retu
95e0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
95f0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
9600: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
9610: 0a 20 20 7d 0a 20 20 69 66 20 28 20 70 62 65 67  .  }.  if ( pbeg
9620: 69 6e 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  in>pPage->pBt->u
9630: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20 7b 0a  sableSize-4 ) {.
9640: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9650: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
9660: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62    }.  assert( pb
9670: 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65  egin>addr || pbe
9680: 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32  gin==0 );.  put2
9690: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
96a0: 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32  , start);.  put2
96b0: 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74  byte(&data[start
96c0: 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75  ], pbegin);.  pu
96d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
96e0: 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  rt+2], size);.  
96f0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
9700: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75  Page->nFree + (u
9710: 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43  16)size;..  /* C
9720: 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74  oalesce adjacent
9730: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a   free blocks */.
9740: 20 20 61 64 64 72 20 3d 20 70 50 61 67 65 2d 3e    addr = pPage->
9750: 68 64 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20  hdrOffset + 1;. 
9760: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
9770: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9780: 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20  [addr]))>0 ){.  
9790: 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69    int pnext, psi
97a0: 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72  ze, x;.    asser
97b0: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
97c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
97d0: 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74  egin<=pPage->pBt
97e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
97f0: 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65  ;.    pnext = ge
9800: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
9810: 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65  gin]);.    psize
9820: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9830: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
9840: 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70    if( pbegin + p
9850: 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78  size + 3 >= pnex
9860: 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a  t && pnext>0 ){.
9870: 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d        int frag =
9880: 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e   pnext - (pbegin
9890: 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  +psize);.      i
98a0: 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28  f( (frag<0) || (
98b0: 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 70  frag>(int)data[p
98c0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
98d0: 37 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  7]) ){.        r
98e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
98f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
9900: 20 7d 0a 20 20 20 20 20 20 64 61 74 61 5b 70 50   }.      data[pP
9910: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37  age->hdrOffset+7
9920: 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20  ] -= (u8)frag;. 
9930: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
9940: 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b  e(&data[pnext]);
9950: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
9960: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78  &data[pbegin], x
9970: 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65  );.      x = pne
9980: 78 74 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  xt + get2byte(&d
9990: 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20  ata[pnext+2]) - 
99a0: 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75  pbegin;.      pu
99b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
99c0: 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20  gin+2], x);.    
99d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
99e0: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20  r = pbegin;.    
99f0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
9a00: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
9a10: 61 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68  area begins with
9a20: 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65   a freeblock, re
9a30: 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66  move it. */.  if
9a40: 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64  ( data[hdr+1]==d
9a50: 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61  ata[hdr+5] && da
9a60: 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b  ta[hdr+2]==data[
9a70: 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e  hdr+6] ){.    in
9a80: 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69  t top;.    pbegi
9a90: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
9aa0: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
9ab0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72  memcpy(&data[hdr
9ac0: 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69  +1], &data[pbegi
9ad0: 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20  n], 2);.    top 
9ae0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9af0: 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62  [hdr+5]) + get2b
9b00: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
9b10: 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79  +2]);.    put2by
9b20: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
9b30: 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73   top);.  }.  ass
9b40: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
9b50: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
9b60: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
9b70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9b80: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
9b90: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
9ba0: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
9bb0: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
9bc0: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
9bd0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
9be0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
9bf0: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
9c00: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
9c10: 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
9c20: 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
9c30: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
9c40: 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
9c50: 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
9c60: 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
9c70: 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
9c80: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
9c90: 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
9ca0: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
9cb0: 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
9cc0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
9cd0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
9ce0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
9cf0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
9d00: 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
9d10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
9d20: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
9d30: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
9d40: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
9d50: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
9d60: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
9d70: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
9d80: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
9d90: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
9da0: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
9db0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
9dc0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9dd0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
9de0: 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
9df0: 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
9e00: 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
9e10: 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
9e20: 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
9e30: 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
9e40: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9e50: 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
9e60: 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20  ->leaf;.  pBt = 
9e70: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66  pPage->pBt;.  if
9e80: 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46  ( flagByte==(PTF
9e90: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
9ea0: 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70  INTKEY) ){.    p
9eb0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
9ec0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73  ;.    pPage->has
9ed0: 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65  Data = pPage->le
9ee0: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
9ef0: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
9f00: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
9f10: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
9f20: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
9f30: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
9f40: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
9f50: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  {.    pPage->int
9f60: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Key = 0;.    pPa
9f70: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b  ge->hasData = 0;
9f80: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
9f90: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
9fa0: 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  ocal;.    pPage-
9fb0: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
9fc0: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c  >minLocal;.  }el
9fd0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
9fe0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9ff0: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
a000: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
a010: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
a020: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
a030: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
a040: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
a050: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
a060: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
a070: 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
a080: 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
a090: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
a0a0: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
a0b0: 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
a0c0: 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
a0d0: 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
a0e0: 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
a0f0: 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
a100: 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
a110: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
a120: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
a130: 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
a140: 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
a150: 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
a160: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ruption..*/.int 
a170: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
a180: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
a190: 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  age){..  assert(
a1a0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
a1b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a1c0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
a1d0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
a1e0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
a1f0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
a200: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
a210: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
a220: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
a230: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
a240: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
a250: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
a260: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
a270: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
a280: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
a290: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
a2a0: 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  ;..  if( !pPage-
a2b0: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75  >isInit ){.    u
a2c0: 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  16 pc;          
a2d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
a2e0: 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
a2f0: 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
a300: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b  ] */.    u8 hdr;
a310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
a320: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69  ffset to beginni
a330: 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ng of page heade
a340: 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74  r */.    u8 *dat
a350: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
a360: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
a370: 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68  Data */.    BtSh
a380: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
a390: 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
a3a0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
a3b0: 0a 20 20 20 20 75 31 36 20 75 73 61 62 6c 65 53  .    u16 usableS
a3c0: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
a3d0: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
a3e0: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
a3f0: 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66  /.    u16 cellOf
a400: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
a410: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
a420: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
a430: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
a440: 20 20 20 75 31 36 20 6e 46 72 65 65 3b 20 20 20     u16 nFree;   
a450: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a460: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
a470: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
a480: 20 20 20 75 31 36 20 74 6f 70 3b 20 20 20 20 20     u16 top;     
a490: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
a4a0: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
a4b0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
a4c0: 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65  .    pBt = pPage
a4d0: 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20  ->pBt;..    hdr 
a4e0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
a4f0: 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  et;.    data = p
a500: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
a510: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
a520: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
a530: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
a540: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
a550: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
a560: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
a570: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
a580: 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 20 20 70  <=32768 );.    p
a590: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
a5a0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
a5b0: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   1;.    pPage->n
a5c0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
a5d0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
a5e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
a5f0: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
a600: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
a610: 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  et = hdr + 12 - 
a620: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
a630: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
a640: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
a650: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
a660: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
a670: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
a680: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
a690: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
a6a0: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
a6b0: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
a6c0: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
a6d0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
a6e0: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
a6f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a700: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
a710: 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72  .    /* A malfor
a720: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
a730: 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73  e might cause us
a740: 65 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  e to read past t
a750: 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66  he end.    ** of
a760: 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69   page when parsi
a770: 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20  ng a cell.  .   
a780: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
a790: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
a7a0: 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
a7b0: 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
a7c0: 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20  cell extends.   
a7d0: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
a7e0: 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
a7f0: 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
a800: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
a810: 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75   be .    ** retu
a820: 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e  rned if it does.
a830: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  .    */.#if defi
a840: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
a850: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
a860: 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20  CHECK).    {.   
a870: 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73     int iCellFirs
a880: 74 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  t;   /* First al
a890: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64  lowable cell ind
a8a0: 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
a8b0: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 2f 2a  iCellLast;    /*
a8c0: 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63   Last possible c
a8d0: 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ell index */.   
a8e0: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
a8f0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
a900: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
a910: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  ter array */.   
a920: 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20     int sz;      
a930: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
a940: 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20  a cell */..     
a950: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
a960: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
a970: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 20  ge->nCell;.     
a980: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
a990: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
a9a0: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
a9b0: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d  eaf ) iCellLast-
a9c0: 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  -;.      for(i=0
a9d0: 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
a9e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a9f0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
aa00: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
aa10: 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  *2]);.        if
aa20: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
aa30: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
aa40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
aa50: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
aa60: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
aa70: 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20   }.        sz = 
aa80: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
aa90: 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  e, &data[pc]);. 
aaa0: 20 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a         if( pc+sz
aab0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
aac0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
aad0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
aae0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
aaf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 20 0a 23       }.    }  .#
ab00: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f  endif..    /* Co
ab10: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
ab20: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
ab30: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63  e page */.    pc
ab40: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
ab50: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e  a[hdr+1]);.    n
ab60: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
ab70: 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68  7] + top;.    wh
ab80: 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
ab90: 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a     u16 next, siz
aba0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e  e;.      if( pc>
abb0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a  usableSize-4 ){.
abc0: 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
abd0: 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65  block is off the
abe0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
abf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
ac00: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
ac10: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74      }.      next
ac20: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
ac30: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69  a[pc]);.      si
ac40: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
ac50: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
ac60: 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20    if( next>0 && 
ac70: 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20  next<=pc+size+3 
ac80: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72  ){.        /* Fr
ac90: 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62  ee blocks must b
aca0: 65 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  e in accending o
acb0: 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rder */.        
acc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
acd0: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
ace0: 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65     }.      nFree
acf0: 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b   = nFree + size;
ad00: 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74  .      pc = next
ad10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
ad20: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e  At this point, n
ad30: 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Free contains th
ad40: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66  e sum of the off
ad50: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
ad60: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63  .    ** of the c
ad70: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
ad80: 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72   plus the number
ad90: 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77   of free bytes w
ada0: 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ithin.    ** the
adb0: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
adc0: 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67  ea. If this is g
add0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
ade0: 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20  usable-size.    
adf0: 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ** of the page, 
ae00: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75  then the page mu
ae10: 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  st be corrupted.
ae20: 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f   This check also
ae30: 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74  .    ** serves t
ae40: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
ae50: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
ae60: 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
ae70: 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a  l-content.    **
ae80: 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67   area, according
ae90: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
aea0: 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e  der, lies within
aeb0: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a   the page..    *
aec0: 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e  /.    if( nFree>
aed0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
aee0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
aef0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
af00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
af10: 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20  ->nFree = nFree 
af20: 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  - (cellOffset + 
af30: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  2*pPage->nCell);
af40: 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 43 68 65  ..#if 0.  /* Che
af50: 63 6b 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20  ck that all the 
af60: 6f 66 66 73 65 74 73 20 69 6e 20 74 68 65 20 63  offsets in the c
af70: 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79  ell offset array
af80: 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
af90: 65 2e 20 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f  e. .  ** .  ** O
afa0: 6d 69 74 74 69 6e 67 20 74 68 69 73 20 63 6f 6e  mitting this con
afb0: 73 69 73 74 65 6e 63 79 20 63 68 65 63 6b 20 61  sistency check a
afc0: 6e 64 20 75 73 69 6e 67 20 74 68 65 20 70 50 61  nd using the pPa
afd0: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73  ge->maskPage mas
afe0: 6b 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e  k.  ** to preven
aff0: 74 20 6f 76 65 72 72 75 6e 6e 69 6e 67 20 74 68  t overrunning th
b000: 65 20 70 61 67 65 20 62 75 66 66 65 72 20 69 6e  e page buffer in
b010: 20 66 69 6e 64 43 65 6c 6c 28 29 20 72 65 73 75   findCell() resu
b020: 6c 74 73 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e  lts in a.  ** 2.
b030: 35 25 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 67  5% performance g
b040: 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20  ain..  */.  {.  
b050: 20 20 75 38 20 2a 70 4f 66 66 3b 20 20 20 20 20    u8 *pOff;     
b060: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75     /* Iterator u
b070: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c  sed to check all
b080: 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 61 72   cell offsets ar
b090: 65 20 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20  e in range */.  
b0a0: 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20    u8 *pEnd;     
b0b0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
b0c0: 20 65 6e 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66   end of cell off
b0d0: 73 65 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  set array */.   
b0e0: 20 75 38 20 6d 61 73 6b 3b 20 20 20 20 20 20 20   u8 mask;       
b0f0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74    /* Mask of bit
b100: 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 7a  s that must be z
b110: 65 72 6f 20 69 6e 20 4d 53 42 20 6f 66 20 63 65  ero in MSB of ce
b120: 6c 6c 20 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20  ll offsets */.  
b130: 20 20 6d 61 73 6b 20 3d 20 7e 28 28 28 75 38 29    mask = ~(((u8)
b140: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
b150: 38 29 29 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64  8))-1);.    pEnd
b160: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
b170: 73 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65  set + pPage->nCe
b180: 6c 6c 2a 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70  ll*2];.    for(p
b190: 4f 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66  Off=&data[cellOf
b1a0: 66 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e  fset]; pOff!=pEn
b1b0: 64 20 26 26 20 21 28 28 2a 70 4f 66 66 29 26 6d  d && !((*pOff)&m
b1c0: 61 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a  ask); pOff+=2);.
b1d0: 20 20 20 20 69 66 28 20 70 4f 66 66 21 3d 70 45      if( pOff!=pE
b1e0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  nd ){.      retu
b1f0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b200: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
b210: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 70 50  }.#endif..    pP
b220: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
b230: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
b240: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b250: 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
b260: 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
b270: 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
b280: 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
b290: 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
b2a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b2b0: 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
b2c0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
b2d0: 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
b2e0: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
b2f0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
b300: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
b310: 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64  ge->pBt;.  u8 hd
b320: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
b330: 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73  fset;.  u16 firs
b340: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
b350: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
b360: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
b370: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
b380: 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
b390: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
b3a0: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
b3b0: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
b3c0: 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
b3d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b3e0: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
b3f0: 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a  age) == data );.
b400: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b410: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
b420: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
b430: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
b440: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b450: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
b460: 0a 20 20 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74  .  /*memset(&dat
b470: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
b480: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
b490: 29 3b 2a 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d  );*/.  data[hdr]
b4a0: 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a   = (char)flags;.
b4b0: 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20    first = hdr + 
b4c0: 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54  8 + 4*((flags&PT
b4d0: 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29  F_LEAF)==0 ?1:0)
b4e0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
b4f0: 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
b500: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
b510: 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
b520: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
b530: 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
b540: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
b550: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
b560: 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65   first;.  decode
b570: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61  Flags(pPage, fla
b580: 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gs);.  pPage->hd
b590: 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20  rOffset = hdr;. 
b5a0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
b5b0: 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
b5c0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
b5d0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   0;.  assert( pB
b5e0: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
b5f0: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
b600: 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50  e<=32768 );.  pP
b610: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
b620: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
b630: 31 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  1;.  pPage->nCel
b640: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
b650: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
b660: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
b670: 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
b680: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
b690: 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
b6a0: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
b6b0: 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
b6c0: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
b6d0: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
b6e0: 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
b6f0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
b700: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
b710: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
b720: 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
b730: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
b740: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
b750: 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
b760: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
b770: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
b780: 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61  >pDbPage = pDbPa
b790: 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74  ge;.  pPage->pBt
b7a0: 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d   = pBt;.  pPage-
b7b0: 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
b7c0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b7d0: 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d   = pPage->pgno==
b7e0: 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72  1 ? 100 : 0;.  r
b7f0: 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a  eturn pPage; .}.
b800: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
b810: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
b820: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
b830: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
b840: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
b850: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
b860: 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eeded..**.** If 
b870: 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c  the noContent fl
b880: 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
b890: 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
b8a0: 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a  ot care about.**
b8b0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
b8c0: 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
b8d0: 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
b8e0: 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
b8f0: 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
b900: 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
b910: 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
b920: 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
b930: 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
b940: 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
b950: 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
b960: 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
b970: 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
b980: 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
b990: 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
b9a0: 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
b9b0: 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
b9c0: 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
b9d0: 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
b9e0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
b9f0: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 0a 20  3BtreeGetPage(. 
ba00: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
ba10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
ba20: 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
ba30: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
ba40: 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
ba50: 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
ba60: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
ba70: 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
ba80: 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
ba90: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
baa0: 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
bab0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c       /* Do not l
bac0: 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  oad page content
bad0: 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
bae0: 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
baf0: 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
bb00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
bb10: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
bb20: 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
bb30: 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
bb40: 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ire(pBt->pPager,
bb50: 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
bb60: 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e  )&pDbPage, noCon
bb70: 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20  tent);.  if( rc 
bb80: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
bb90: 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
bba0: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
bbb0: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
bbc0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
bbd0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
bbe0: 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
bbf0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
bc00: 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
bc10: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
bc20: 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
bc30: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
bc40: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
bc50: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
bc60: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
bc70: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
bc80: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
bc90: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
bca0: 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
bcb0: 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
bcc0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
bcd0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
bce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bcf0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bd00: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
bd10: 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
bd20: 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
bd30: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
bd40: 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
bd50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
bd60: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
bd70: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
bd80: 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
bd90: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
bda0: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
bdb0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
bdc0: 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
bdd0: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
bde0: 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
bdf0: 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
be00: 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
be10: 61 74 69 63 20 50 67 6e 6f 20 70 61 67 65 72 50  atic Pgno pagerP
be20: 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
be30: 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e  d *pBt){.  int n
be40: 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  Page = -1;.  int
be50: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
be60: 42 74 2d 3e 70 50 61 67 65 31 20 29 3b 0a 20 20  Bt->pPage1 );.  
be70: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
be80: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
be90: 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
bea0: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
beb0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67  QLITE_OK || nPag
bec0: 65 3d 3d 2d 31 20 29 3b 0a 20 20 72 65 74 75 72  e==-1 );.  retur
bed0: 6e 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d  n (Pgno)nPage;.}
bee0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
bef0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
bf00: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
bf10: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
bf20: 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20  ne.** is just a 
bf30: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
bf40: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
bf50: 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ate calls to.** 
bf60: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
bf70: 61 67 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  age() and sqlite
bf80: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29  3BtreeInitPage()
bf90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bfa0: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
bfb0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
bfc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
bfd0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
bfe0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
bff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c000: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
c010: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
c020: 67 65 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20  ge **ppPage     
c030: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
c040: 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
c050: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
c060: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
c070: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c080: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
c090: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
c0a0: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
c0b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c0c0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c0d0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20    }..  /* It is 
c0e0: 6f 66 74 65 6e 20 74 68 65 20 63 61 73 65 20 74  often the case t
c0f0: 68 61 74 20 74 68 65 20 70 61 67 65 20 77 65 20  hat the page we 
c100: 77 61 6e 74 20 69 73 20 61 6c 72 65 61 64 79 20  want is already 
c110: 69 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49  in cache..  ** I
c120: 66 20 73 6f 2c 20 67 65 74 20 69 74 20 64 69 72  f so, get it dir
c130: 65 63 74 6c 79 2e 20 20 54 68 69 73 20 73 61 76  ectly.  This sav
c140: 65 73 20 75 73 20 66 72 6f 6d 20 68 61 76 69 6e  es us from havin
c150: 67 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70  g to call.  ** p
c160: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20  agerPagecount() 
c170: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 70 67 6e  to make sure pgn
c180: 6f 20 69 73 20 77 69 74 68 69 6e 20 6c 69 6d 69  o is within limi
c190: 74 73 2c 20 77 68 69 63 68 20 72 65 73 75 6c 74  ts, which result
c1a0: 73 0a 20 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73  s.  ** in a meas
c1b0: 75 72 65 61 62 6c 65 20 70 65 72 66 6f 72 6d 61  ureable performa
c1c0: 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73  nce improvements
c1d0: 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  ..  */.  *ppPage
c1e0: 20 3d 20 70 50 61 67 65 20 3d 20 62 74 72 65 65   = pPage = btree
c1f0: 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
c200: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61  pgno);.  if( pPa
c210: 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67  ge ){.    /* Pag
c220: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
c230: 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 72 63 20  cache */.    rc 
c240: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
c250: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67  else{.    /* Pag
c260: 65 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  e not in cache. 
c270: 20 41 63 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a   Acquire it. */.
c280: 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67      if( pgno>pag
c290: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
c2a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c2b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c2c0: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
c2d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
c2e0: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
c2f0: 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
c300: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
c310: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
c320: 67 65 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20  ge = *ppPage;.  
c330: 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
c340: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63  isInit ){.    rc
c350: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
c360: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
c370: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
c380: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
c390: 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
c3a0: 29 3b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  );.    *ppPage =
c3b0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
c3c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
c3d0: 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
c3e0: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
c3f0: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
c400: 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
c410: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
c420: 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73  reeGetPage..*/.s
c430: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
c440: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
c450: 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
c460: 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  age ){.    asser
c470: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
c480: 6c 6f 77 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  low==0 || sqlite
c490: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
c4a0: 6e 74 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  nt(pPage->pDbPag
c4b0: 65 29 3e 31 20 29 3b 0a 20 20 20 20 61 73 73 65  e)>1 );.    asse
c4c0: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
c4d0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c4e0: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
c4f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c500: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
c510: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
c520: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
c530: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
c540: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
c550: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
c560: 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
c570: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
c580: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
c590: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
c5a0: 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  tex) );.    sqli
c5b0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
c5c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
c5d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69   }.}../*.** Duri
c5e0: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
c5f0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
c600: 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
c610: 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
c620: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
c630: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
c640: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
c650: 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
c660: 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
c670: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
c680: 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
c690: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
c6a0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
c6b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
c6c0: 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
c6d0: 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
c6e0: 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
c6f0: 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
c700: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
c710: 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
c720: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
c730: 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
c740: 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61  *pData){.  MemPa
c750: 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61  ge *pPage;.  pPa
c760: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
c770: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
c780: 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61  xtra(pData);.  a
c790: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
c7a0: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
c7b0: 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66  pData)>0 );.  if
c7c0: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
c7d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
c7e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
c7f0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
c800: 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67  tex) );.    pPag
c810: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
c820: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
c830: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
c840: 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20  pData)>1 ){.    
c850: 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74    /* pPage might
c860: 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20   not be a btree 
c870: 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20  page;  it might 
c880: 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
c890: 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  age.      ** or 
c8a0: 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61  ptrmap page or a
c8b0: 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20   free page.  In 
c8c0: 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65  those cases, the
c8d0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20   following.     
c8e0: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69   ** call to sqli
c8f0: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
c900: 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  () will likely r
c910: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c920: 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42  RUPT..      ** B
c930: 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f  ut no harm is do
c940: 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64  ne by this.  And
c950: 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f   it is very impo
c960: 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20  rtant that.     
c970: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
c980: 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61  InitPage() be ca
c990: 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74  lled on every bt
c9a0: 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d  ree page so we m
c9b0: 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ake.      ** the
c9c0: 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20   call for every 
c9d0: 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20  page that comes 
c9e0: 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e  in for re-initin
c9f0: 67 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  g. */.      sqli
ca00: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
ca10: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
ca20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
ca30: 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
ca40: 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e  ler for a btree.
ca50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
ca60: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
ca70: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67  ndler(void *pArg
ca80: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
ca90: 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29  Bt = (BtShared*)
caa0: 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
cab0: 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73  pBt->db );.  ass
cac0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
cad0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d  ex_held(pBt->db-
cae0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
caf0: 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  urn sqlite3Invok
cb00: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42  eBusyHandler(&pB
cb10: 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  t->db->busyHandl
cb20: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  er);.}../*.** Op
cb30: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
cb40: 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65  le..** .** zFile
cb50: 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
cb60: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
cb70: 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65   file.  If zFile
cb80: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  name is NULL.** 
cb90: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 77  a new database w
cba0: 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d  ith a random nam
cbb0: 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
cbc0: 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d  his randomly nam
cbd0: 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  ed.** database f
cbe0: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
cbf0: 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65 33  ted when sqlite3
cc00: 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
cc10: 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46  called..** If zF
cc20: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
cc30: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e  ory:" then an in
cc40: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
cc50: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74   is created.** t
cc60: 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
cc70: 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77  ally destroyed w
cc80: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
cc90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
cca0: 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
ccb0: 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
ccc0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
ccd0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
cce0: 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
ccf0: 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
cd00: 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
cd10: 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
cd20: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
cd30: 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
cd40: 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
cd50: 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
cd60: 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
cd70: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
cd80: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
cd90: 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
cda0: 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
cdb0: 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
cdc0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
cdd0: 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73  treeOpen(.  cons
cde0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
cdf0: 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
ce00: 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
ce10: 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
ce20: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
ce30: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
ce40: 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
ce50: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
ce60: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
ce70: 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
ce80: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
ce90: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
cea0: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
ceb0: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
cec0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
ced0: 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
cee0: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
cef0: 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
cf00: 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
cf10: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
cf20: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  .){.  sqlite3_vf
cf30: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
cf40: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
cf50: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
cf60: 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61  btree */.  BtSha
cf70: 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
cf80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
cf90: 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65  red part of btre
cfa0: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
cfb0: 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20   Btree *p;      
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfd0: 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74  /* Handle to ret
cfe0: 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  urn */.  sqlite3
cff0: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65  _mutex *mutexOpe
d000: 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65  n = 0;  /* Preve
d010: 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69  nts a race condi
d020: 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35  tion. Ticket #35
d030: 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  37 */.  int rc =
d040: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
d050: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
d060: 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20   code from this 
d070: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  function */.  u8
d080: 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d0a0: 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73  Byte of unused s
d0b0: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
d0c0: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
d0d0: 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31  char zDbHeader[1
d0e0: 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  00];  /* Databas
d0f0: 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74  e header content
d100: 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   */..  /* Set th
d110: 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d  e variable isMem
d120: 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  db to true for a
d130: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
d140: 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66  base, or .  ** f
d150: 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d  alse for a file-
d160: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 20  based database. 
d170: 54 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f  This symbol is o
d180: 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 0a  nly required if.
d190: 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 66 20 74    ** either of t
d1a0: 68 65 20 73 68 61 72 65 64 2d 64 61 74 61 20 6f  he shared-data o
d1b0: 72 20 61 75 74 6f 76 61 63 75 75 6d 20 66 65 61  r autovacuum fea
d1c0: 74 75 72 65 73 20 61 72 65 20 63 6f 6d 70 69 6c  tures are compil
d1d0: 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  ed .  ** into th
d1e0: 65 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a  e library..  */.
d1f0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
d200: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
d210: 43 41 43 48 45 29 20 7c 7c 20 21 64 65 66 69 6e  CACHE) || !defin
d220: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed(SQLITE_OMIT_A
d230: 55 54 4f 56 41 43 55 55 4d 29 0a 20 20 23 69 66  UTOVACUUM).  #if
d240: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d250: 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e  MEMORYDB.    con
d260: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
d270: 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20   0;.  #else.    
d280: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
d290: 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  b = zFilename &&
d2a0: 20 21 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61   !strcmp(zFilena
d2b0: 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b  me, ":memory:");
d2c0: 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  .  #endif.#endif
d2d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
d2e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
d2f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d300: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
d310: 0a 20 20 70 56 66 73 20 3d 20 64 62 2d 3e 70 56  .  pVfs = db->pV
d320: 66 73 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  fs;.  p = sqlite
d330: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
d340: 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66  of(Btree));.  if
d350: 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ( !p ){.    retu
d360: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
d370: 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  .  }.  p->inTran
d380: 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
d390: 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69    p->db = db;.#i
d3a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d3b0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
d3c0: 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20   p->lock.pBtree 
d3d0: 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69  = p;.  p->lock.i
d3e0: 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69  Table = 1;.#endi
d3f0: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
d400: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
d410: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
d420: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d430: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20  T_DISKIO).  /*. 
d440: 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65   ** If this Btre
d450: 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  e is a candidate
d460: 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68   for shared cach
d470: 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61  e, try to find a
d480: 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20  n.  ** existing 
d490: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
d4a0: 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72  that we can shar
d4b0: 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66  e with.  */.  if
d4c0: 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20 26 26 20  ( isMemdb==0 && 
d4d0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
d4e0: 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
d4f0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
d500: 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
d510: 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20  acheEnabled ){. 
d520: 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61       int nFullPa
d530: 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
d540: 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
d550: 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61     char *zFullPa
d560: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
d570: 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68  Malloc(nFullPath
d580: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  name);.      sql
d590: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
d5a0: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
d5b0: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
d5c0: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
d5d0: 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64  |= SQLITE_Shared
d5e0: 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66 28  Cache;.      if(
d5f0: 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   !zFullPathname 
d600: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d610: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
d620: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d630: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
d640: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
d650: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
d660: 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46  s, zFilename, nF
d670: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  ullPathname, zFu
d680: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
d690: 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73     mutexOpen = s
d6a0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
d6b0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
d6c0: 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20  ATIC_OPEN);.    
d6d0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d6e0: 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29  enter(mutexOpen)
d6f0: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
d700: 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
d710: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
d720: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
d730: 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
d740: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
d750: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
d760: 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41     for(pBt=GLOBA
d770: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
d780: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
d790: 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42  st); pBt; pBt=pB
d7a0: 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  t->pNext){.     
d7b0: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
d7c0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20  nRef>0 );.      
d7d0: 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
d7e0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73  zFullPathname, s
d7f0: 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
d800: 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ame(pBt->pPager)
d810: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
d820: 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
d830: 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65  erVfs(pBt->pPage
d840: 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20  r)==pVfs ){.    
d850: 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
d860: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62           for(iDb
d870: 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e  =db->nDb-1; iDb>
d880: 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20  =0; iDb--){.    
d890: 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70          Btree *p
d8a0: 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61  Existing = db->a
d8b0: 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
d8c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
d8d0: 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74  isting && pExist
d8e0: 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b  ing->pBt==pBt ){
d8f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
d900: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
d910: 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
d920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
d930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
d940: 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
d960: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
d970: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
d980: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
d990: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
d9a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
d9b0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
d9c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
d9d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d9e0: 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42       p->pBt = pB
d9f0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74  t;.          pBt
da00: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
da10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
da20: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
da30: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
da40: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
da50: 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
da60: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
da70: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  hname);.    }.#i
da80: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
da90: 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
daa0: 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f    /* In debug mo
dab0: 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20  de, we mark all 
dac0: 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
dad0: 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65  ases as sharable
dae0: 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  .      ** even w
daf0: 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74  hen they are not
db00: 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65  .  This exercise
db10: 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
db20: 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  de and.      ** 
db30: 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72  gives more oppor
db40: 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72  tunity for asser
db50: 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ts(sqlite3_mutex
db60: 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a  _held()).      *
db70: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * statements to 
db80: 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  find locking pro
db90: 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  blems..      */.
dba0: 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
dbb0: 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 1;.    }.#en
dbc0: 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
dbd0: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
dbe0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
dbf0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
dc00: 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
dc10: 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
dc20: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
dc30: 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  re.    ** the ri
dc40: 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
dc50: 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
dc60: 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
dc70: 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20   that result.   
dc80: 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
dc90: 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
dca0: 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
dcb0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
dcc0: 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
dcd0: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29  8 || sizeof(i64)
dce0: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
dcf0: 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  t( sizeof(u64)==
dd00: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29  8 || sizeof(u64)
dd10: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
dd20: 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d  t( sizeof(u32)==
dd30: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
dd40: 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20   sizeof(u16)==2 
dd50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
dd60: 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29  izeof(Pgno)==4 )
dd70: 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73  ;.  .    pBt = s
dd80: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
dd90: 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29  ( sizeof(*pBt) )
dda0: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30  ;.    if( pBt==0
ddb0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
ddc0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
ddd0: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
dde0: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
ddf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
de00: 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70  gerOpen(pVfs, &p
de10: 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c  Bt->pPager, zFil
de20: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61   EXTRA_SIZE, fla
de50: 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20  gs, vfsFlags);. 
de60: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
de70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
de80: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
de90: 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
dea0: 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
deb0: 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
dec0: 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
ded0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
dee0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
def0: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
df00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
df10: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
df20: 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
df30: 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
df40: 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
df50: 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
df60: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
df70: 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c   pBt;.  .    sql
df80: 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e  ite3PagerSetRein
df90: 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  iter(pBt->pPager
dfa0: 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
dfb0: 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
dfc0: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  = 0;.    pBt->pP
dfd0: 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42  age1 = 0;.    pB
dfe0: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71  t->readOnly = sq
dff0: 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
e000: 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
e010: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
e020: 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  Size = get2byte(
e030: 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b  &zDbHeader[16]);
e040: 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
e050: 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
e060: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
e070: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
e080: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
e090: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
e0a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
e0b0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
e0c0: 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
e0d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e0e0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
e0f0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
e100: 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
e110: 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
e120: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
e130: 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
e140: 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
e150: 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
e160: 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
e170: 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
e180: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
e190: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
e1a0: 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
e1b0: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
e1c0: 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
e1d0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
e1e0: 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
e1f0: 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
e200: 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
e210: 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
e220: 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
e230: 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
e240: 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
e250: 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
e260: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
e270: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
e280: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
e290: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
e2a0: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
e2b0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
e2c0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
e2d0: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
e2e0: 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
e2f0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
e300: 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
e310: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
e320: 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
e330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52   }else{.      nR
e340: 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
e350: 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
e360: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
e370: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
e380: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
e390: 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
e3a0: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
e3b0: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
e3c0: 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
e3d0: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
e3e0: 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
e3f0: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
e400: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
e410: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
e420: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
e430: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
e440: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
e450: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
e460: 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72  erve);.    if( r
e470: 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f  c ) goto btree_o
e480: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74  pen_out;.    pBt
e490: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
e4a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
e4b0: 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
e4c0: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
e4d0: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
e4e0: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
e4f0: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
e500: 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  */.   .#if !defi
e510: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
e520: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
e530: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e540: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
e550: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
e560: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
e570: 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
e580: 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
e590: 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
e5a0: 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
e5b0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  le ){.      sqli
e5c0: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
e5d0: 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42  Shared;.      pB
e5e0: 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
e5f0: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
e600: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
e610: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
e620: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
e630: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
e640: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73  _THREADSAFE && s
e650: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
e660: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
e670: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  .        pBt->mu
e680: 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
e690: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
e6a0: 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
e6b0: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
e6c0: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
e6d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
e6e0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
e6f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e700: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
e710: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
e720: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
e730: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
e740: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
e750: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
e760: 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
e770: 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
e780: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
e790: 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
e7a0: 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
e7b0: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
e7c0: 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
e7d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e7e0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
e7f0: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a  xShared);.    }.
e800: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20  #endif.  }..#if 
e810: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e820: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
e830: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
e840: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
e850: 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  O).  /* If the n
e860: 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20  ew Btree uses a 
e870: 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72  sharable pBtShar
e880: 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68  ed, then link th
e890: 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65  e new.  ** Btree
e8a0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   into the list o
e8b0: 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42  f all sharable B
e8c0: 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61  trees for the sa
e8d0: 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  me connection.. 
e8e0: 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   ** The list is 
e8f0: 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e  kept in ascendin
e900: 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61  g order by pBt a
e910: 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  ddress..  */.  i
e920: 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
e930: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
e940: 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20   Btree *pSib;.  
e950: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
e960: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
e970: 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62    if( (pSib = db
e980: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30  ->aDb[i].pBt)!=0
e990: 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62   && pSib->sharab
e9a0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  le ){.        wh
e9b0: 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76  ile( pSib->pPrev
e9c0: 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d   ){ pSib = pSib-
e9d0: 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20  >pPrev; }.      
e9e0: 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69    if( p->pBt<pSi
e9f0: 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
ea00: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
ea10: 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Sib;.          p
ea20: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
ea30: 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72         pSib->pPr
ea40: 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
ea50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ea60: 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e   while( pSib->pN
ea70: 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65  ext && pSib->pNe
ea80: 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29  xt->pBt<p->pBt )
ea90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
eaa0: 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
eab0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
eac0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
ead0: 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
eae0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
eaf0: 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
eb00: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
eb10: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
eb20: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
eb30: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
eb40: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
eb50: 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
eb60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
eb70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
eb80: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
eb90: 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
eba0: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
ebb0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ebc0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
ebd0: 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
ebe0: 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
ebf0: 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
ec00: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  ->pPager);.    }
ec10: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
ec20: 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
ec30: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
ec40: 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
ec50: 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70   }.  if( mutexOp
ec60: 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
ec70: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
ec80: 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20  held(mutexOpen) 
ec90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
eca0: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
ecb0: 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Open);.  }.  ret
ecc0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ecd0: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
ece0: 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
ecf0: 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
ed00: 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
ed10: 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
ed20: 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
ed30: 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
ed40: 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
ed50: 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
ed60: 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
ed70: 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
ed80: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
ed90: 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
eda0: 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
edb0: 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
edc0: 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
edd0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
ede0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
edf0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
ee00: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ee10: 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42 74 53   *pMaster;.  BtS
ee20: 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
ee30: 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
ee40: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
ee50: 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
ee60: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
ee70: 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  .  pMaster = sql
ee80: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
ee90: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
eea0: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71  IC_MASTER);.  sq
eeb0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
eec0: 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42  r(pMaster);.  pB
eed0: 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  t->nRef--;.  if(
eee0: 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b   pBt->nRef<=0 ){
eef0: 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28  .    if( GLOBAL(
ef00: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
ef10: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
ef20: 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  )==pBt ){.      
ef30: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
ef40: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
ef50: 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e  cheList) = pBt->
ef60: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
ef70: 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
ef80: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
ef90: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
efa0: 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
efb0: 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c  while( ALWAYS(pL
efc0: 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70  ist) && pList->p
efd0: 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20  Next!=pBt ){.   
efe0: 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74       pList=pList
eff0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
f000: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
f010: 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  S(pList) ){.    
f020: 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74      pList->pNext
f030: 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
f040: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f050: 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
f060: 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20  ADSAFE ){.      
f070: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
f080: 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  ee(pBt->mutex);.
f090: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65      }.    remove
f0a0: 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 1;.  }.  sql
f0b0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f0c0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
f0d0: 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c  urn removed;.#el
f0e0: 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  se.  return 1;.#
f0f0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  endif.}../*.** M
f100: 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54  ake sure pBt->pT
f110: 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74  mpSpace points t
f120: 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  o an allocation 
f130: 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53  of .** MX_CELL_S
f140: 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a  IZE(pBt) bytes..
f150: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
f160: 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
f170: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
f180: 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
f190: 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
f1a0: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
f1b0: 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
f1c0: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
f1d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
f1e0: 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54  Free the pBt->pT
f1f0: 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69  mpSpace allocati
f200: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
f210: 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28  d freeTempSpace(
f220: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
f230: 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
f240: 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  e( pBt->pTmpSpac
f250: 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53  e);.  pBt->pTmpS
f260: 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  pace = 0;.}../*.
f270: 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e  ** Close an open
f280: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e   database and in
f290: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72  validate all cur
f2a0: 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sors..*/.int sql
f2b0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42  ite3BtreeClose(B
f2c0: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
f2d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
f2e0: 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  Bt;.  BtCursor *
f2f0: 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  pCur;..  /* Clos
f300: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  e all cursors op
f310: 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61  ened via this ha
f320: 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ndle.  */.  asse
f330: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
f340: 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
f350: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
f360: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
f370: 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43    pCur = pBt->pC
f380: 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20  ursor;.  while( 
f390: 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75  pCur ){.    BtCu
f3a0: 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75  rsor *pTmp = pCu
f3b0: 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43  r;.    pCur = pC
f3c0: 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69  ur->pNext;.    i
f3d0: 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d  f( pTmp->pBtree=
f3e0: 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =p ){.      sqli
f3f0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
f400: 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d  sor(pTmp);.    }
f410: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62  .  }..  /* Rollb
f420: 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74  ack any active t
f430: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66  ransaction and f
f440: 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73  ree the handle s
f450: 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54  tructure..  ** T
f460: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
f470: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
f480: 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c  ) drops any tabl
f490: 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a  e-locks held by.
f4a0: 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65    ** this handle
f4b0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
f4c0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29  BtreeRollback(p)
f4d0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
f4e0: 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
f4f0: 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
f500: 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
f510: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
f520: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
f530: 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
f540: 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
f550: 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
f560: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
f570: 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
f580: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
f590: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
f5a0: 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
f5b0: 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
f5c0: 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
f5d0: 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
f5e0: 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
f5f0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
f600: 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
f610: 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
f620: 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
f630: 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
f640: 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
f650: 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
f660: 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
f670: 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
f680: 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
f690: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
f6a0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
f6b0: 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
f6c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
f6d0: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
f6e0: 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
f6f0: 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
f700: 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
f710: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
f720: 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
f730: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
f740: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f750: 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
f760: 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
f770: 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
f780: 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
f790: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
f7a0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
f7b0: 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d  CHE.  assert( p-
f7c0: 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29  >wantToLock==0 )
f7d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  ;.  assert( p->l
f7e0: 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
f7f0: 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e  ( p->pPrev ) p->
f800: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
f810: 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70  ->pNext;.  if( p
f820: 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65  ->pNext ) p->pNe
f830: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
f840: 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Prev;.#endif..  
f850: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
f860: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f870: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
f880: 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
f890: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
f8a0: 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e  pages allowed in
f8b0: 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
f8c0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * The maximum nu
f8d0: 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61  mber of cache pa
f8e0: 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  ges is set to th
f8f0: 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61  e absolute.** va
f900: 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20  lue of mxPage.  
f910: 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67  If mxPage is neg
f920: 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72  ative, the pager
f930: 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65   will.** operate
f940: 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20   asynchronously 
f950: 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74  - it will not st
f960: 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29  op to do fsync()
f970: 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64  s.** to insure d
f980: 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
f990: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
f9a0: 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e  ce before.** con
f9b0: 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61  tinuing.  Transa
f9c0: 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72  ctions still wor
f9d0: 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  k if synchronous
f9e0: 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20   is off,.** and 
f9f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
fa00: 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
fa10: 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d   if this program
fa20: 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75  .** crashes.  Bu
fa30: 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
fa40: 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
fa50: 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a  s or there is.**
fa60: 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72   an abrupt power
fa70: 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79   failure when sy
fa80: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
fa90: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  , the database.*
faa0: 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20  * could be left 
fab0: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
fac0: 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72  nt and unrecover
fad0: 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53  able state..** S
fae0: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
faf0: 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64   by default so d
fb00: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
fb10: 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72  on is not.** nor
fb20: 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a  mally a worry..*
fb30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
fb40: 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
fb50: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
fb60: 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
fb70: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
fb80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
fb90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
fba0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
fbb0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
fbc0: 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
fbd0: 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
fbe0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
fbf0: 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
fc00: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
fc10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fc20: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
fc30: 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
fc40: 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
fc50: 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
fc60: 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
fc70: 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
fc80: 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
fc90: 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
fca0: 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
fcb0: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
fcc0: 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
fcd0: 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
fce0: 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
fcf0: 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
fd00: 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
fd10: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
fd20: 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
fd30: 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
fd40: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
fd50: 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
fd60: 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
fd70: 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
fd80: 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
fd90: 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
fda0: 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
fdb0: 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
fdc0: 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
fdd0: 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
fde0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
fdf0: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
fe00: 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
fe10: 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c  3BtreeSetSafetyL
fe20: 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69  evel(Btree *p, i
fe30: 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75  nt level, int fu
fe40: 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61  llSync){.  BtSha
fe50: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
fe60: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
fe70: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
fe80: 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
fe90: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
fea0: 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
feb0: 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
fec0: 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65  Level(pBt->pPage
fed0: 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79  r, level, fullSy
fee0: 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nc);.  sqlite3Bt
fef0: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
ff00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ff10: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
ff20: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
ff30: 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20  the given btree 
ff40: 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79  is set to safety
ff50: 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74   level 1.  In ot
ff60: 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65  her.** words, re
ff70: 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20  turn TRUE if no 
ff80: 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e  sync() occurs on
ff90: 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e   the disk files.
ffa0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
ffb0: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
ffc0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
ffd0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
ffe0: 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  >pBt;.  int rc;.
fff0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10000 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
10010 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a  db->mutex) );  .
10020 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
10030 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
10040 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
10050 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73  ager );.  rc = s
10060 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
10070 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  c(pBt->pPager);.
10080 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
10090 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
100a0 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66   rc;.}..#if !def
100b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
100c0 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20  _PAGER_PRAGMAS) 
100d0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
100e0 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a  TE_OMIT_VACUUM).
100f0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
10100 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
10110 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
10120 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
10130 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
10140 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67  * Or, if the pag
10150 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61  e size has alrea
10160 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72  dy been fixed, r
10170 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
10180 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75  DONLY .** withou
10190 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68  t changing anyth
101a0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ing..**.** The p
101b0 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
101c0 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
101d0 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
101e0 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
101f0 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
10200 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
10210 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
10220 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
10230 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
10240 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
10250 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
10260 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
10270 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
10280 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
10290 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
102a0 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
102b0 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
102c0 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
102d0 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
102e0 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
102f0 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
10300 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
10310 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
10320 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
10330 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
10340 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
10350 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
10360 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
10370 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
10380 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
10390 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
103a0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
103b0 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65   the iFix!=0 the
103c0 6e 20 74 68 65 20 70 61 67 65 53 69 7a 65 46 69  n the pageSizeFi
103d0 78 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  xed flag is set 
103e0 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
103f0 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74   size.** and aut
10400 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e  ovacuum mode can
10410 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68   no longer be ch
10420 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
10430 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
10440 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
10450 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
10460 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20  t nReserve, int 
10470 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20  iFix){.  int rc 
10480 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
10490 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
104a0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
104b0 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26   nReserve>=-1 &&
104c0 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
104d0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
104e0 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
104f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
10500 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
10510 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
10520 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10530 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
10540 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
10550 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
10560 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
10570 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
10580 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ze;.  }.  assert
10590 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
105a0 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
105b0 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  ;.  if( pageSize
105c0 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
105d0 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
105e0 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20  GE_SIZE &&.     
105f0 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29     ((pageSize-1)
10600 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b  &pageSize)==0 ){
10610 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
10620 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
10630 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
10640 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70  Bt->pPage1 && !p
10650 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
10660 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
10670 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65   = (u16)pageSize
10680 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
10690 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20  ace(pBt);.  }.  
106a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
106b0 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
106c0 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
106d0 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
106e0 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62  ve);.  pBt->usab
106f0 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
10700 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52  geSize - (u16)nR
10710 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46  eserve;.  if( iF
10720 69 78 20 29 20 70 42 74 2d 3e 70 61 67 65 53 69  ix ) pBt->pageSi
10730 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 20 20 73  zeFixed = 1;.  s
10740 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
10750 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
10760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
10770 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
10780 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
10790 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
107a0 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
107b0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
107c0 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
107d0 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
107e0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
107f0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
10800 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
10810 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  f every page tha
10820 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75  t.** are intentu
10830 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64  ally left unused
10840 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22  .  This is the "
10850 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20  reserved" space 
10860 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74  that is.** somet
10870 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74  imes used by ext
10880 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  ensions..*/.int 
10890 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
108a0 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
108b0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
108c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
108d0 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  );.  n = p->pBt-
108e0 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
108f0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
10900 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
10910 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
10920 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
10930 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
10940 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61  e count for a da
10950 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65  tabase if mxPage
10960 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a   is positive..**
10970 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
10980 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69  made if mxPage i
10990 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  s 0 or negative.
109a0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
109b0 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  f the value of m
109c0 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
109d0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
109e0 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
109f0 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
10a00 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  Count(Btree *p, 
10a10 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
10a20 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
10a30 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
10a40 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  n = sqlite3Pager
10a50 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
10a60 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
10a70 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
10a80 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
10a90 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64  return n;.}.#end
10aa0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
10ab0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
10ac0 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
10ad0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10ae0 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a  T_VACUUM) */../*
10af0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
10b00 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
10b10 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
10b20 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
10b30 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
10b40 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
10b50 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
10b60 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
10b70 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
10b80 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
10b90 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
10ba0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
10bb0 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
10bc0 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
10bd0 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
10be0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
10bf0 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
10c00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
10c10 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
10c20 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
10c30 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
10c40 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
10c50 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
10c60 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
10c70 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
10c80 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
10c90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10ca0 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20  E_OK;.  u8 av = 
10cb0 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a  (u8)autoVacuum;.
10cc0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
10cd0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
10ce0 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
10cf0 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d  d && (av ?1:0)!=
10d00 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
10d10 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
10d20 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
10d30 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61  else{.    pBt->a
10d40 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f  utoVacuum = av ?
10d50 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  1:0;.    pBt->in
10d60 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32  crVacuum = av==2
10d70 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c   ?1:0;.  }.  sql
10d80 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
10d90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
10da0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
10db0 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
10dc0 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61   of the 'auto-va
10dd0 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20  cuum' property. 
10de0 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69  If auto-vacuum i
10df0 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20  s .** enabled 1 
10e00 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
10e10 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74  erwise 0..*/.int
10e20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
10e30 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
10e40 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
10e50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
10e60 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52  UUM.  return BTR
10e70 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
10e80 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  NE;.#else.  int 
10e90 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
10ea0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
10eb0 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42   = (.    (!p->pB
10ec0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42  t->autoVacuum)?B
10ed0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
10ee0 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70  NONE:.    (!p->p
10ef0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f  Bt->incrVacuum)?
10f00 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
10f10 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45  _FULL:.    BTREE
10f20 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
10f30 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  .  );.  sqlite3B
10f40 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
10f50 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
10f60 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  f.}.../*.** Get 
10f70 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
10f80 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
10f90 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
10fa0 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
10fb0 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
10fc0 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
10fd0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
10fe0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
10ff0 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
11000 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
11010 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
11020 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
11030 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
11040 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
11050 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
11060 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
11070 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
11080 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
11090 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
110a0 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
110b0 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
110c0 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
110d0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
110e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
110f0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
11100 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61   int nPage;..  a
11110 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11120 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
11130 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
11140 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  t( pBt->pPage1==
11150 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
11160 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
11170 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
11180 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
11190 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
111a0 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73  n rc;..  /* Do s
111b0 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  ome checking to 
111c0 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20  help insure the 
111d0 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72  file we opened r
111e0 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20  eally is.  ** a 
111f0 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66  valid database f
11200 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20  ile. .  */.  rc 
11210 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
11220 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
11230 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
11240 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11250 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61  K ){.    goto pa
11260 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
11270 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61  .  }else if( nPa
11280 67 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  ge>0 ){.    int 
11290 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e  pageSize;.    in
112a0 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  t usableSize;.  
112b0 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
112c0 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
112d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
112e0 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d  ADB;.    if( mem
112f0 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69  cmp(page1, zMagi
11300 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20  cHeader, 16)!=0 
11310 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
11320 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
11330 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11340 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
11350 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
11360 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
11370 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
11380 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
11390 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
113a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
113b0 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65  The maximum embe
113c0 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
113d0 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32 35  st be exactly 25
113e0 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69  %.  And the mini
113f0 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64  mum.    ** embed
11400 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73  ded fraction mus
11410 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62  t be 12.5% for b
11420 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e  oth leaf-data an
11430 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e  d non-leaf-data.
11440 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67  .    ** The orig
11450 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f  inal design allo
11460 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74  wed these amount
11470 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61  s to vary, but a
11480 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73  s of.    ** vers
11490 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65  ion 3.6.0, we re
114a0 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65  quire them to be
114b0 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20   fixed..    */. 
114c0 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70     if( memcmp(&p
114d0 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c  age1[21], "\100\
114e0 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29  040\040",3)!=0 )
114f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
11500 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
11510 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69      }.    pageSi
11520 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 70  ze = get2byte(&p
11530 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69  age1[16]);.    i
11540 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
11550 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c  &pageSize)!=0 ||
11560 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c   pageSize<512 ||
11570 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45  .        (SQLITE
11580 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33  _MAX_PAGE_SIZE<3
11590 32 37 36 38 20 26 26 20 70 61 67 65 53 69 7a 65  2768 && pageSize
115a0 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
115b0 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20  _SIZE).    ){.  
115c0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
115d0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
115e0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  }.    assert( (p
115f0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
11600 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  );.    usableSiz
11610 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
11620 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
11630 28 20 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d  ( pageSize!=pBt-
11640 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
11650 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64     /* After read
11660 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
11670 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
11680 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61  se assuming a pa
11690 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a  ge size.      **
116a0 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67   of BtShared.pag
116b0 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64  eSize, we have d
116c0 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74  iscovered that t
116d0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a  he page-size is.
116e0 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c        ** actuall
116f0 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f  y pageSize. Unlo
11700 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
11710 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
11720 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a  e1 at.      ** z
11730 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ero and return S
11740 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61  QLITE_OK. The ca
11750 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74  ller will call t
11760 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  his function.   
11770 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
11780 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67   the correct pag
11790 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f  e-size..      */
117a0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
117b0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
117c0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
117d0 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53  e = (u16)usableS
117e0 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ize;.      pBt->
117f0 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  pageSize = (u16)
11800 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
11810 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
11820 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
11830 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
11840 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
11850 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
11860 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11880 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d         pageSize-
11890 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20  usableSize);.   
118a0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
118b0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
118c0 65 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ed;.      return
118d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
118e0 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65  }.    if( usable
118f0 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20  Size<480 ){.    
11900 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
11910 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
11920 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
11930 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a  e = (u16)pageSiz
11940 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  e;.    pBt->usab
11950 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73  leSize = (u16)us
11960 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65  ableSize;.#ifnde
11970 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11980 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
11990 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
119a0 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
119b0 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
119c0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
119d0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
119e0 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
119f0 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
11a00 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
11a10 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
11a20 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
11a30 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
11a40 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
11a50 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
11a60 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
11a70 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
11a80 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
11a90 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
11aa0 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
11ab0 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
11ac0 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
11ad0 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
11ae0 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
11af0 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
11b00 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
11b10 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
11b20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
11b30 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
11b40 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
11b50 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
11b60 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
11b70 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
11b80 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
11b90 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
11ba0 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
11bb0 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
11bc0 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20   2-byte poiner, 
11bd0 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69  a header which i
11be0 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a  s as much as.  *
11bf0 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c  * 17 bytes long,
11c00 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66   0 to N bytes of
11c10 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e   payload, and an
11c20 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65   optional 4 byte
11c30 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70   overflow.  ** p
11c40 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a  age pointer..  *
11c50 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  /.  pBt->maxLoca
11c60 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
11c70 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
11c80 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e  - 23;.  pBt->min
11c90 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73  Local = (pBt->us
11ca0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
11cb0 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d  255 - 23;.  pBt-
11cc0 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e  >maxLeaf = pBt->
11cd0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b  usableSize - 35;
11ce0 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20  .  pBt->minLeaf 
11cf0 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
11d00 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
11d10 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  23;.  assert( pB
11d20 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
11d30 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
11d40 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
11d50 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
11d60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11d70 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
11d80 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
11d90 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
11da0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
11db0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11dc0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
11dd0 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
11de0 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
11df0 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
11e00 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
11e10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
11e20 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
11e30 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
11e40 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
11e50 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
11e60 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
11e70 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
11e80 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
11e90 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
11ea0 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
11eb0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
11ec0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
11ed0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
11ee0 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
11ef0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
11f00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11f10 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
11f20 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
11f30 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
11f40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11f50 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
11f60 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
11f70 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70 42  pCursor==0 || pB
11f80 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
11f90 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
11fa0 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
11fb0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
11fc0 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ONE && pBt->pPag
11fd0 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  e1!=0 ){.    ass
11fe0 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
11ff0 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
12000 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
12010 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
12020 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20  >pPager)==1 );. 
12030 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
12040 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
12050 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
12060 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20  (pBt->pPage1);. 
12070 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
12080 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
12090 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 64 61   Create a new da
120a0 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61  tabase by initia
120b0 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74  lizing the first
120c0 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20   page of the.** 
120d0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
120e0 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28  int newDatabase(
120f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
12100 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a    MemPage *pP1;.
12110 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
12120 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b  *data;.  int rc;
12130 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20  .  int nPage;.. 
12140 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12150 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
12160 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
12170 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
12180 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
12190 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
121a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
121b0 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b 0a  K || nPage>0 ){.
121c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
121d0 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e   }.  pP1 = pBt->
121e0 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
121f0 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
12200 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
12210 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
12220 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
12230 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
12240 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
12250 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
12260 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
12270 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
12280 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
12290 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
122a0 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62  )==16 );.  put2b
122b0 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70  yte(&data[16], p
122c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
122d0 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
122e0 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
122f0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
12300 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70  ableSize<=pBt->p
12310 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e  ageSize && pBt->
12320 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d  usableSize+255>=
12330 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
12340 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38    data[20] = (u8
12350 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
12360 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
12370 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  e);.  data[21] =
12380 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20   64;.  data[22] 
12390 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d  = 32;.  data[23]
123a0 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28   = 32;.  memset(
123b0 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30  &data[24], 0, 10
123c0 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67  0-24);.  zeroPag
123d0 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45  e(pP1, PTF_INTKE
123e0 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c  Y|PTF_LEAF|PTF_L
123f0 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74  EAFDATA );.  pBt
12400 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
12410 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
12420 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
12430 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
12440 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
12450 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
12460 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
12470 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
12480 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
12490 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
124a0 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
124b0 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
124c0 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
124d0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
124e0 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
124f0 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
12500 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
12510 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12520 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
12530 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
12540 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
12550 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
12560 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
12570 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
12580 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
12590 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
125a0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
125b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
125c0 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
125d0 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
125e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
125f0 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
12600 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
12610 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
12620 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
12630 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
12640 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
12650 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
12660 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
12670 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
12680 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
12690 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
126a0 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
126b0 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
126c0 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
126d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
126e0 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
126f0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
12700 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
12710 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
12720 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
12730 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
12740 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
12750 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
12760 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
12770 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
12780 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
12790 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
127a0 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
127b0 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
127c0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
127d0 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
127e0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
127f0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
12800 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
12810 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
12820 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
12830 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
12840 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
12850 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
12860 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
12870 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
12880 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
12890 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
128a0 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
128b0 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
128c0 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
128d0 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
128e0 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
128f0 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
12900 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
12910 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
12920 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
12930 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
12940 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
12950 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
12960 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
12970 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
12980 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
12990 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
129a0 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
129b0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
129c0 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
129d0 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
129e0 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
129f0 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
12a00 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
12a10 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
12a20 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
12a30 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
12a40 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
12a50 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
12a60 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
12a70 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
12a80 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
12a90 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
12aa0 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
12ab0 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
12ac0 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
12ad0 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
12ae0 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
12af0 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
12b00 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
12b10 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
12b20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
12b30 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
12b40 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
12b50 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
12b60 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
12b70 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
12b80 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
12b90 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
12ba0 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
12bb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12bc0 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
12bd0 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
12be0 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70  g){.  sqlite3 *p
12bf0 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53  Block = 0;.  BtS
12c00 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
12c10 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
12c20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
12c30 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12c40 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
12c50 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
12c60 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
12c70 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
12c80 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
12c90 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
12ca0 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
12cb0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
12cc0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
12cd0 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
12ce0 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
12cf0 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
12d00 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
12d10 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
12d20 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
12d30 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
12d40 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
12d50 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20  s_begun;.  }..  
12d60 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
12d70 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
12d80 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
12d90 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
12da0 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61  /.  if( pBt->rea
12db0 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20  dOnly && wrflag 
12dc0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12dd0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
12de0 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
12df0 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  n;.  }..#ifndef 
12e00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
12e10 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66  ED_CACHE.  /* If
12e20 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73   another databas
12e30 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72  e handle has alr
12e40 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72  eady opened a wr
12e50 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
12e60 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68  .  ** on this sh
12e70 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
12e80 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
12e90 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
12ea0 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75  ion is.  ** requ
12eb0 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51  ested, return SQ
12ec0 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a  LITE_LOCKED..  *
12ed0 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67 20  /.  if( (wrflag 
12ee0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
12ef0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
12f00 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73 50 65  TE) || pBt->isPe
12f10 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70 42 6c  nding ){.    pBl
12f20 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74  ock = pBt->pWrit
12f30 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20  er->db;.  }else 
12f40 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a  if( wrflag>1 ){.
12f50 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65      BtLock *pIte
12f60 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72  r;.    for(pIter
12f70 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
12f80 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
12f90 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
12fa0 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
12fb0 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=p ){.        p
12fc0 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70  Block = pIter->p
12fd0 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Btree->db;.     
12fe0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12ff0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
13000 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( pBlock ){.    
13010 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
13020 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
13030 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20  pBlock);.    rc 
13040 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  = SQLITE_LOCKED_
13050 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20  SHAREDCACHE;.   
13060 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
13070 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
13080 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c   /* Any read-onl
13090 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20  y or read-write 
130a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c  transaction impl
130b0 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ies a read-lock 
130c0 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e  on .  ** page 1.
130d0 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65   So if some othe
130e0 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
130f0 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61  lient already ha
13100 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a  s a write-lock .
13110 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20    ** on page 1, 
13120 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
13130 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
13140 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
13150 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 71 75 65 72  E_OK!=(rc = quer
13160 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
13170 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
13180 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
13190 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
131a0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
131b0 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
131c0 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
131d0 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
131e0 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
131f0 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
13200 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
13210 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
13220 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
13230 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
13240 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
13250 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
13260 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
13270 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
13280 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
13290 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
132a0 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
132b0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
132c0 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
132d0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
132e0 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
132f0 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
13300 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
13310 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
13320 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
13330 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
13340 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
13350 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
13360 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
13370 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
13380 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
13390 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
133a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
133b0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
133c0 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
133d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
133e0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
133f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13400 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13410 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
13420 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
13430 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
13440 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
13450 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
13460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13470 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
13480 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
13490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
134a0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
134b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
134c0 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
134d0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
134e0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
134f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
13500 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
13510 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
13520 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
13530 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
13540 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a  andler(pBt) );..
13550 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13560 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
13570 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
13580 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
13590 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
135a0 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
135b0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
135c0 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70  ACHE.      if( p
135d0 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 09 61  ->sharable ){..a
135e0 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70  ssert( p->lock.p
135f0 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c  Btree==p && p->l
13600 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  ock.iTable==1 );
13610 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
13620 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  .eLock = READ_LO
13630 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c  CK;.        p->l
13640 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ock.pNext = pBt-
13650 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  >pLock;.        
13660 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d  pBt->pLock = &p-
13670 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  >lock;.      }.#
13680 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
13690 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
136a0 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
136b0 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
136c0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
136d0 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
136e0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
136f0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
13700 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
13710 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
13720 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
13730 41 43 48 45 0a 20 20 20 20 69 66 28 20 77 72 66  ACHE.    if( wrf
13740 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73  lag ){.      ass
13750 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74  ert( !pBt->pWrit
13760 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  er );.      pBt-
13770 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20  >pWriter = p;.  
13780 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75      pBt->isExclu
13790 73 69 76 65 20 3d 20 28 75 38 29 28 77 72 66 6c  sive = (u8)(wrfl
137a0 61 67 3e 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ag>1);.    }.#en
137b0 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f  dif.  }...trans_
137c0 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d  begun:.  if( rc=
137d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
137e0 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54  flag ){.    /* T
137f0 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
13800 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
13810 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
13820 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
13830 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69   ** open savepoi
13840 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f  nts. If the seco
13850 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
13860 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61  greater than 0 a
13870 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  nd.    ** the su
13880 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  b-journal is not
13890 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
138a0 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f  hen it will be o
138b0 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20  pened here..    
138c0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
138d0 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
138e0 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
138f0 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  r, p->db->nSavep
13900 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  oint);.  }..  bt
13910 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
13920 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
13930 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
13940 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
13950 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13960 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
13970 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
13980 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
13990 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
139a0 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
139b0 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
139c0 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
139d0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
139e0 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
139f0 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
13a00 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
13a10 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
13a20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
13a30 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
13a40 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
13a50 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13a80 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
13a90 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13ac0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
13ad0 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
13ae0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b00 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
13b10 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
13b20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
13b30 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69  ;.  u8 isInitOri
13b40 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
13b50 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
13b60 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
13b70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13b80 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
13b90 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
13ba0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
13bb0 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
13bc0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
13bd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13be0 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
13bf0 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d  ptrmaps_out;.  }
13c00 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
13c10 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
13c20 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
13c30 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
13c40 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
13c50 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20  ge, i);..    rc 
13c60 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  = ptrmapPutOvflP
13c70 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
13c80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
13c90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13ca0 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
13cb0 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20  ptrmaps_out;.   
13cc0 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61   }..    if( !pPa
13cd0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
13ce0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
13cf0 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
13d00 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  l);.      rc = p
13d10 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
13d20 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
13d30 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20  BTREE, pgno);.  
13d40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13d50 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74  TE_OK ) goto set
13d60 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
13d70 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
13d80 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
13d90 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
13da0 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
13db0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
13dc0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
13dd0 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  t+8]);.    rc = 
13de0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
13df0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
13e00 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
13e10 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74   }..set_child_pt
13e20 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61  rmaps_out:.  pPa
13e30 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
13e40 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72  nitOrig;.  retur
13e50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
13e60 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
13e70 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72  e, which is guar
13e80 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 62  anteed to be a b
13e90 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61  tree page, not a
13ea0 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  n overflow.** pa
13eb0 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ge, is a pointer
13ec0 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
13ed0 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
13ee0 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ter so that it p
13ef0 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e  oints to.** iTo.
13f00 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
13f10 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
13f20 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
13f30 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  o be modified, a
13f40 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  s .** follows:.*
13f50 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
13f60 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
13f70 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
13f80 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
13f90 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
13fc0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
13fd0 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
13fe0 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
13ff0 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
14000 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
14010 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
14020 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
14030 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
14040 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
14050 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
14060 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
14070 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
14080 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
14090 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
140a0 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
140b0 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
140c0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
140d0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
140e0 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
140f0 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
14100 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
14110 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
14120 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
14130 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14140 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
14150 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
14160 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
14170 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
14180 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
14190 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
141a0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
141b0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
141c0 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
141d0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
141e0 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
141f0 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
14200 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
14210 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
14220 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
14230 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
14240 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
14250 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
14260 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a  e->aData, iTo);.
14270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
14280 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
14290 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20  ge->isInit;.    
142a0 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
142b0 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Cell;..    sqlit
142c0 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
142d0 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c  pPage);.    nCel
142e0 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
142f0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
14300 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
14310 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
14320 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
14330 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
14340 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
14350 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
14360 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
14370 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14380 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
14390 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
143a0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
143b0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
143c0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
143d0 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
143e0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
143f0 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
14400 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
14410 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
14420 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
14430 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
14440 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
14450 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14470 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
14480 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
14490 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
144a0 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
144b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
144c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
144d0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
144e0 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
144f0 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
14500 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
14510 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
14520 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
14530 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
14540 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
14550 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14560 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
14570 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
14580 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
14590 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
145a0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
145b0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
145c0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
145d0 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
145e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
145f0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
14600 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
14610 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
14620 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
14630 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
14640 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
14650 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
14660 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
14670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
14680 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42  elocatePage(.  B
14690 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
146a0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
146b0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
146c0 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  DbPage,        /
146d0 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d  * Open page to m
146e0 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ove */.  u8 eTyp
146f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
14700 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
14710 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f   'type' entry fo
14720 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
14730 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20  gno iPtrPage,   
14740 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
14750 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27  er map 'page-no'
14760 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
14770 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72  ge */.  Pgno iFr
14780 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  eePage,         
14790 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e   /* The location
147a0 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65   to move pDbPage
147b0 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43   to */.  int isC
147c0 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50 61  ommit.){.  MemPa
147d0 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
147e0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
147f0 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
14800 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
14810 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
14820 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
14830 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
14840 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
14850 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
14860 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
14870 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
14880 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
14890 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
148a0 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
148b0 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
148c0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
148d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
148e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
148f0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
14900 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67    assert( pDbPag
14910 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a  e->pBt==pBt );..
14920 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69    /* Move page i
14930 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20  DbPage from its 
14940 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
14950 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
14960 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54  iFreePage */.  T
14970 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55  RACE(("AUTOVACUU
14980 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20  M: Moving %d to 
14990 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74  free page %d (pt
149a0 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25  r page %d type %
149b0 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44  d)\n", .      iD
149c0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
149d0 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70  , iPtrPage, eTyp
149e0 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  e));.  rc = sqli
149f0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
14a00 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65  (pPager, pDbPage
14a10 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65  ->pDbPage, iFree
14a20 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b  Page, isCommit);
14a30 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14a40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
14a50 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
14a60 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
14a70 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
14a80 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
14a90 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
14aa0 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
14ab0 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
14ac0 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
14ad0 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
14ae0 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
14af0 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
14b00 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
14b10 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
14b20 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
14b30 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
14b40 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
14b50 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
14b60 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
14b70 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
14b80 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
14b90 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
14ba0 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
14bb0 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
14bc0 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
14bd0 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
14be0 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
14bf0 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
14c00 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
14c10 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
14c20 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
14c30 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
14c40 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
14c50 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
14c60 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
14c70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14c80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14c90 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
14ca0 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
14cb0 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
14cc0 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
14cd0 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
14ce0 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l!=0 ){.      rc
14cf0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
14d00 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
14d10 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
14d20 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20  reePage);.      
14d30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14d40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
14d50 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
14d60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14d70 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
14d80 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
14d90 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
14da0 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
14db0 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
14dc0 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
14dd0 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
14de0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
14df0 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
14e00 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
14e10 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
14e20 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
14e30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
14e40 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
14e50 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
14e60 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
14e70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14e80 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
14e90 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
14ea0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
14eb0 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
14ec0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
14ed0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14ee0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
14ef0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
14f00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14f10 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
14f20 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
14f30 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
14f40 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
14f50 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
14f60 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
14f70 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14f80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14f90 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
14fa0 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
14fb0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b  Type, iPtrPage);
14fc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
14fd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
14fe0 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
14ff0 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
15000 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
15010 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
15020 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
15030 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
15040 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
15050 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
15060 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
15070 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
15080 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
15090 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
150a0 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54  .** return SQLIT
150b0 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
150c0 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
150d0 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
150e0 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61  o.** point in ca
150f0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
15100 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
15110 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
15120 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
15130 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  ficly, this func
15140 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
15150 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
15160 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f   .** database so
15170 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
15180 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
15190 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
151a0 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  .** is no longer
151b0 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49   in use..**.** I
151c0 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d  f the nFin param
151d0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
151e0 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  , the implementa
151f0 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20  tion assumes.** 
15200 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
15210 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
15220 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
15230 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72  () until.** it r
15240 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
15250 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20  NE or an error, 
15260 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73  and that nFin is
15270 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
15280 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61  f pages the data
15290 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63  base file will c
152a0 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69  ontain after thi
152b0 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  s .** process is
152c0 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74   complete..*/.st
152d0 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
152e0 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
152f0 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
15300 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b  , Pgno iLastPg){
15310 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
15320 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
15330 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
15340 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
15350 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
15360 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15370 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
15380 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
15390 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
153a0 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
153b0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
153c0 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
153d0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
153e0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69  GE(pBt) ){.    i
153f0 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54  nt rc;.    u8 eT
15400 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
15410 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
15420 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
15430 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
15440 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
15450 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
15460 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
15470 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
15480 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
15490 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
154a0 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
154b0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
154c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
154d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
154e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
154f0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
15500 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
15510 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15520 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
15530 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
15540 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
15550 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
15560 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20   nFin==0 ){.    
15570 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
15580 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
15590 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e  files free-list.
155a0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
155b0 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  uired.        **
155c0 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d   if nFin is non-
155d0 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61  zero. In that ca
155e0 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73  se, the free-lis
155f0 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
15600 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
15610 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69  o zero after thi
15620 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
15630 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  ns, so it doesn'
15640 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  t .        ** ma
15650 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c  tter if it still
15660 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67   contains some g
15670 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a  arbage entries..
15680 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
15690 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
156a0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
156b0 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
156c0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
156d0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
156e0 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
156f0 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a  g, iLastPg, 1);.
15700 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
15710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15720 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
15730 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15740 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
15750 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
15760 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
15770 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
15780 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
15790 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
157a0 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
157b0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
157c0 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
157d0 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
157e0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
157f0 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63  astPg;..      rc
15800 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
15810 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
15820 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
15830 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
15840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15850 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
15860 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
15870 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65  /* If nFin is ze
15880 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75  ro, this loop ru
15890 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ns exactly once 
158a0 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67  and page pLastPg
158b0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61  .      ** is swa
158c0 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69  pped with the fi
158d0 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75  rst free page pu
158e0 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65  lled off the fre
158f0 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a  e list..      **
15900 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65  .      ** On the
15910 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20   other hand, if 
15920 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72 20  nFin is greater 
15930 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
15940 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
15950 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
15960 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
15970 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
15980 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
15990 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
159a0 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
159b0 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20   */.      do {. 
159c0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
159d0 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
159e0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
159f0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
15a00 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
15a10 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
15a20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15a30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
15a40 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
15a50 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
15a60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
15a70 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
15a80 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
15a90 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
15aa0 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65  nFin!=0 && iFree
15ab0 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
15ac0 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
15ad0 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
15ae0 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71    .      rc = sq
15af0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
15b00 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65  pLastPg->pDbPage
15b10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
15b20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15b30 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
15b40 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61  atePage(pBt, pLa
15b50 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74  stPg, eType, iPt
15b60 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20  rPage, iFreePg, 
15b70 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20  nFin!=0);.      
15b80 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
15b90 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
15ba0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15bb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15bc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15bd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
15be0 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a   if( nFin==0 ){.
15bf0 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
15c00 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74 50     while( iLastP
15c10 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
15c20 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41  PAGE(pBt)||PTRMA
15c30 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
15c40 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20  astPg) ){.      
15c50 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
15c60 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
15c70 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  ){.        MemPa
15c80 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 20  ge *pPg;.       
15c90 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
15ca0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
15cb0 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50 67  t, iLastPg, &pPg
15cc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
15cd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15ce0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
15cf0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
15d00 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
15d10 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
15d20 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
15d30 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
15d40 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
15d50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15d60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
15d70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15d80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15d90 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
15da0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
15db0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
15dc0 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
15dd0 69 4c 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20 20  iLastPg);.  }.  
15de0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15df0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
15e00 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
15e10 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
15e20 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
15e30 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
15e40 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
15e50 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
15e60 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
15e70 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
15e80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
15e90 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
15ea0 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
15eb0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
15ec0 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
15ed0 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
15ee0 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
15ef0 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
15f00 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
15f10 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
15f20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
15f30 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
15f40 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
15f50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15f60 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
15f70 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
15f80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15f90 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
15fa0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15fb0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
15fc0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
15fd0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
15fe0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
15ff0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
16000 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
16010 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
16020 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
16030 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  lse{.    invalid
16040 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
16050 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63  che(pBt);.    rc
16060 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
16070 70 28 70 42 74 2c 20 30 2c 20 70 61 67 65 72 50  p(pBt, 0, pagerP
16080 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a  agecount(pBt));.
16090 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
160a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
160b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
160c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
160d0 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
160e0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
160f0 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
16100 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
16110 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75  mmited for an au
16120 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
16130 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  se..**.** If SQL
16140 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
16150 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e  ed, then *pnTrun
16160 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
16170 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
16180 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
16190 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74  file should be t
161a0 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69  runcated to duri
161b0 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
161c0 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20  ocess. .** i.e. 
161d0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
161e0 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65   been reorganize
161f0 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74  d so that only t
16200 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e  he first *pnTrun
16210 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69  c.** pages are i
16220 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
16230 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43   int autoVacuumC
16240 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a  ommit(BtShared *
16250 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pBt){.  int rc =
16260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
16270 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
16280 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41  t->pPager;.  VVA
16290 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20  _ONLY( int nRef 
162a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
162b0 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
162c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
162d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
162e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
162f0 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
16300 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
16310 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e  ;.  assert(pBt->
16320 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69  autoVacuum);.  i
16330 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63  f( !pBt->incrVac
16340 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
16350 6e 46 69 6e 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  nFin;.    Pgno n
16360 46 72 65 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  Free;.    Pgno n
16370 50 74 72 6d 61 70 3b 0a 20 20 20 20 50 67 6e 6f  Ptrmap;.    Pgno
16380 20 69 46 72 65 65 3b 0a 20 20 20 20 63 6f 6e 73   iFree;.    cons
16390 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74  t int pgsz = pBt
163a0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
163b0 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 70 61 67  Pgno nOrig = pag
163c0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
163d0 3b 0a 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  ;..    if( PTRMA
163e0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
163f0 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
16400 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
16410 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
16420 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
16430 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
16440 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
16450 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
16460 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
16470 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
16480 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
16490 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
164a0 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
164b0 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
164c0 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
164d0 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
164e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
164f0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
16500 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
16510 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
16520 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
16530 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
16540 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46     nPtrmap = (nF
16550 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
16560 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
16570 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73  ig)+pgsz/5)/(pgs
16580 7a 2f 35 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  z/5);.    nFin =
16590 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
165a0 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66   nPtrmap;.    if
165b0 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
165c0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
165d0 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
165e0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
165f0 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  .      nFin--;. 
16600 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
16610 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
16620 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
16630 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
16640 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
16650 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a    nFin--;.    }.
16660 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
16670 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
16680 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
16690 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  ..    for(iFree=
166a0 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
166b0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
166c0 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
166d0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
166e0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
166f0 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d  n, iFree);.    }
16700 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
16710 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
16720 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
16730 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
16740 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16750 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16760 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
16770 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
16780 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
16790 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
167a0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
167b0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
167c0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
167d0 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
167e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
167f0 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
16800 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a  >pPager, nFin);.
16810 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
16820 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16830 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
16840 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
16850 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
16860 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71  assert( nRef==sq
16870 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
16880 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
16890 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
168a0 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  lse /* ifndef SQ
168b0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
168c0 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65  CUUM */.# define
168d0 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
168e0 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
168f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
16900 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
16910 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66  e first phase of
16920 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
16930 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  mit.  This routi
16940 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72  ne.** causes a r
16950 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
16960 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69  to be created (i
16970 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
16980 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20  ready exist).** 
16990 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
169a0 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d  th enough inform
169b0 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66  ation so that if
169c0 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63   a power loss oc
169d0 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  curs.** the data
169e0 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74  base can be rest
169f0 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
16a00 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c  inal state by pl
16a10 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68  aying back.** th
16a20 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e  e journal.  Then
16a30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
16a40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65   the journal are
16a50 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a   flushed out to.
16a60 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66  ** the disk.  Af
16a70 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
16a80 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69  is safely on oxi
16a90 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20  de, the changes 
16aa0 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
16ab0 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  se are written i
16ac0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
16ad0 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65   file and flushe
16ae0 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41  d to oxide..** A
16af0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69  t the end of thi
16b00 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c  s call, the roll
16b10 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69  back journal sti
16b20 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  ll exists on the
16b30 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20  .** disk and we 
16b40 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e  are still holdin
16b50 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20  g all locks, so 
16b60 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
16b70 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69  has not.** commi
16b80 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74  tted.  See sqlit
16b90 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
16ba0 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20  seTwo() for the 
16bb0 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
16bc0 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
16bd0 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
16be0 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
16bf0 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
16c00 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
16c10 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
16c20 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
16c30 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
16c40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
16c50 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
16c60 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
16c70 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
16c80 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
16c90 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
16ca0 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
16cb0 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
16cc0 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
16cd0 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
16ce0 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
16cf0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
16d00 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
16d10 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
16d20 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
16d30 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
16d40 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
16d50 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
16d60 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
16d70 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
16d80 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
16d90 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
16da0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
16db0 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
16dc0 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
16dd0 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
16de0 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
16df0 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
16e00 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
16e10 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
16e20 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
16e30 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
16e40 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
16e50 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
16e60 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
16e70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
16e80 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
16e90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
16ea0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
16eb0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
16ec0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16ed0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  = p->pBt;.    sq
16ee0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
16ef0 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p);.#ifndef SQLI
16f00 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
16f10 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
16f20 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
16f30 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
16f40 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  uumCommit(pBt);.
16f50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16f60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16f70 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
16f80 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
16f90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16fa0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
16fb0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16fc0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
16fd0 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
16fe0 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
16ff0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
17000 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
17010 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17020 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17030 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
17040 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
17050 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
17060 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
17070 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
17080 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
17090 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
170a0 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
170b0 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
170c0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
170d0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
170e0 42 74 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a  BtCursor *pCsr;.
170f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17100 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
17110 28 70 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61  (p) );..  /* Sea
17120 72 63 68 20 66 6f 72 20 61 20 63 75 72 73 6f 72  rch for a cursor
17130 20 68 65 6c 64 20 6f 70 65 6e 20 62 79 20 74 68   held open by th
17140 69 73 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65 63  is b-tree connec
17150 74 69 6f 6e 2e 20 49 66 20 6f 6e 65 20 65 78 69  tion. If one exi
17160 73 74 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74  sts,.  ** then t
17170 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
17180 69 6c 6c 20 62 65 20 64 6f 77 6e 67 72 61 64 65  ill be downgrade
17190 64 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79  d to a read-only
171a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
171b0 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 61 63 74  * instead of act
171c0 75 61 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 2e  ually concluded.
171d0 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   A subsequent ca
171e0 6c 6c 20 74 6f 20 43 6f 6d 6d 69 74 50 68 61 73  ll to CommitPhas
171f0 65 54 77 6f 28 29 20 0a 20 20 2a 2a 20 6f 72 20  eTwo() .  ** or 
17200 52 6f 6c 6c 62 61 63 6b 28 29 20 77 69 6c 6c 20  Rollback() will 
17210 66 69 6e 69 73 68 20 74 68 65 20 74 72 61 6e 73  finish the trans
17220 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
17230 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  k the database. 
17240 20 2a 2f 0a 20 20 66 6f 72 28 70 43 73 72 3d 70   */.  for(pCsr=p
17250 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 73  Bt->pCursor; pCs
17260 72 20 26 26 20 70 43 73 72 2d 3e 70 42 74 72 65  r && pCsr->pBtre
17270 65 21 3d 70 3b 20 70 43 73 72 3d 70 43 73 72 2d  e!=p; pCsr=pCsr-
17280 3e 70 4e 65 78 74 29 3b 0a 20 20 61 73 73 65 72  >pNext);.  asser
17290 74 28 20 70 43 73 72 3d 3d 30 20 7c 7c 20 70 2d  t( pCsr==0 || p-
172a0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
172b0 4f 4e 45 20 29 3b 0a 0a 20 20 62 74 72 65 65 43  ONE );..  btreeC
172c0 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
172d0 42 74 29 3b 0a 20 20 69 66 28 20 70 43 73 72 20  Bt);.  if( pCsr 
172e0 29 7b 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  ){.    downgrade
172f0 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
17300 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
17310 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
17320 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
17330 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
17340 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
17350 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
17360 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
17370 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
17380 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
17390 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
173a0 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
173b0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
173c0 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
173d0 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
173e0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
173f0 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
17400 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
17410 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
17420 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
17430 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
17440 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
17450 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
17460 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
17470 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
17480 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
17490 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
174a0 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
174b0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
174c0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
174d0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
174e0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
174f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
17500 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
17510 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
17520 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
17530 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
17540 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
17550 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
17560 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
17570 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
17580 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
17590 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
175a0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
175b0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
175c0 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  d(pBt);.  }..  b
175d0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
175e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
175f0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
17600 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
17610 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
17620 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
17630 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
17640 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
17650 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
17660 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
17670 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
17680 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
17690 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
176a0 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
176b0 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
176c0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
176d0 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
176e0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
176f0 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
17700 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
17710 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
17720 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
17730 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
17740 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
17750 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
17760 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
17770 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
17780 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
17790 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
177a0 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
177b0 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
177c0 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
177d0 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
177e0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
177f0 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
17800 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
17810 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
17820 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   locks..**.** Th
17830 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
17840 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
17850 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
17860 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
17870 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
17880 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
17890 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
178a0 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
178b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
178c0 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
178d0 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
178e0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
178f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17900 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
17910 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
17920 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
17930 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
17940 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
17950 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
17960 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
17970 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
17980 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
17990 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
179a0 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
179b0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
179c0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
179d0 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
179e0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
179f0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
17a00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17a10 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
17a20 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
17a30 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
17a40 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
17a50 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
17a60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17a70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
17a80 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17a90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17aa0 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
17ab0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
17ac0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
17ad0 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
17ae0 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
17af0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17b00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17b10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
17b20 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
17b30 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
17b40 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
17b50 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
17b60 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
17b70 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17b80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
17b90 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
17ba0 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
17bb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17bc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17bd0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
17be0 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73  eTwo(p);.  }.  s
17bf0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17c00 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
17c10 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
17c20 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
17c30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
17c40 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65  rite-cursors ope
17c50 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65  n on this handle
17c60 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
17c70 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
17c80 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
17c90 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
17ca0 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
17cb0 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
17cc0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
17cd0 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
17ce0 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74   routine, a writ
17cf0 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  e-cursor is any 
17d00 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
17d10 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69  s capable of wri
17d20 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
17d30 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  bse.  That means
17d40 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a   the cursor was.
17d50 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  ** originally op
17d60 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
17d70 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
17d80 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62  has not be disab
17d90 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67  led.** by having
17da0 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67   its state chang
17db0 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  ed to CURSOR_FAU
17dc0 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LT..*/.static in
17dd0 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  t countWriteCurs
17de0 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
17df0 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
17e00 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
17e10 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
17e20 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
17e30 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
17e40 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  xt){.    if( pCu
17e50 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75  r->wrFlag && pCu
17e60 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
17e70 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
17e80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
17e90 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
17ea0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
17eb0 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
17ec0 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
17ed0 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
17ee0 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
17ef0 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
17f00 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
17f10 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
17f20 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ces..**.** Every
17f30 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70   cursor is tripp
17f40 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
17f50 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e  rsors that belon
17f60 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61  g.** to other da
17f70 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
17f80 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
17f90 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  o be sharing.** 
17fa0 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
17fb0 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
17fc0 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
17fd0 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
17fe0 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a  lback occurs..**
17ff0 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69   All cursors usi
18000 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  ng the same cach
18010 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65  e must be trippe
18020 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20  d.** to prevent 
18030 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67  them from trying
18040 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65   to use the btre
18050 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72  e after.** the r
18060 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f  ollback.  The ro
18070 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
18080 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a  deleted tables.*
18090 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20  * or moved root 
180a0 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20  pages, so it is 
180b0 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  not sufficient t
180c0 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74  o.** save the st
180d0 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
180e0 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  r.  The cursor m
180f0 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
18100 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dated..*/.void s
18110 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
18120 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
18130 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
18140 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  Code){.  BtCurso
18150 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42  r *p;.  sqlite3B
18160 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
18170 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  );.  for(p=pBtre
18180 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
18190 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
181a0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
181b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
181c0 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
181d0 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
181e0 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d  OR_FAULT;.    p-
181f0 3e 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65 3b  >skip = errCode;
18200 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
18210 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  =p->iPage; i++){
18220 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
18230 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29  ge(p->apPage[i])
18240 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67  ;.      p->apPag
18250 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  e[i] = 0;.    }.
18260 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
18270 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
18280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
18290 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
182a0 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  on in progress. 
182b0 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c   All cursors wil
182c0 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65  l be.** invalide
182d0 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
182e0 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
182f0 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  t to use a curso
18300 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70  r.** that was op
18310 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
18320 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
18330 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ation will resul
18340 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72  t.** in an error
18350 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
18360 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
18370 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
18380 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
18390 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
183a0 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
183b0 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
183c0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
183d0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
183e0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
183f0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
18400 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
18410 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
18420 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
18430 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
18440 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
18450 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
18460 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  pBt, 0, 0);.#ifn
18470 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18480 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
18490 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
184a0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
184b0 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69  is a horrible si
184c0 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f  tuation. An IO o
184d0 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
184e0 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
184f0 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  .    ** trying t
18500 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f  o save cursor po
18510 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73  sitions. If this
18520 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   is an automatic
18530 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20   rollback (as.  
18540 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20    ** the result 
18550 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  of a constraint,
18560 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
18570 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74  e or IO error) t
18580 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  hen .    ** the 
18590 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74  cache may be int
185a0 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73  ernally inconsis
185b0 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69  tent (not contai
185c0 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73  n valid trees) s
185d0 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e  o.    ** we cann
185e0 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  ot simply return
185f0 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68   the error to th
18600 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61  e caller. Instea
18610 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a  d, abort .    **
18620 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61   all queries tha
18630 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61  t may be using a
18640 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ny of the cursor
18650 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f  s that failed to
18660 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   save..    */.  
18670 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72    sqlite3BtreeTr
18680 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
18690 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  rc);.  }.#endif.
186a0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
186b0 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  (p);..  if( p->i
186c0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
186d0 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
186e0 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  c2;..    assert(
186f0 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42   TRANS_WRITE==pB
18700 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
18710 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71   );.    rc2 = sq
18720 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
18730 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
18740 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
18750 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18760 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
18770 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c  ..    /* The rol
18780 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
18790 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61  estroyed the pPa
187a0 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65  ge1->aData value
187b0 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c  .  So.    ** cal
187c0 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  l sqlite3BtreeGe
187d0 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
187e0 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
187f0 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
18800 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
18810 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
18820 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
18830 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
18840 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
18850 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18860 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18870 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
18880 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57    assert( countW
18890 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29  riteCursors(pBt)
188a0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
188b0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
188c0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a  TRANS_READ;.  }.
188d0 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
188e0 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
188f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18900 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18910 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
18920 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
18930 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
18940 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
18950 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
18960 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
18970 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
18980 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
18990 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
189a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
189b0 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
189c0 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
189d0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
189e0 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
189f0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
18a00 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
18a10 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
18a20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
18a30 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
18a40 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
18a50 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
18a60 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
18a70 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
18a80 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
18a90 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
18aa0 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
18ab0 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
18ac0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
18ad0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
18ae0 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
18af0 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
18b00 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
18b10 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
18b20 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
18b30 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
18b40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
18b50 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
18b60 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
18b70 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
18b80 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
18b90 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
18ba0 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
18bb0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
18bc0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
18bd0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
18be0 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
18bf0 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
18c00 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
18c10 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
18c20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
18c30 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
18c40 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
18c50 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
18c60 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
18c70 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
18c80 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
18c90 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
18ca0 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
18cb0 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
18cc0 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
18cd0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
18ce0 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
18cf0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
18d00 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
18d10 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
18d20 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
18d30 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
18d40 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
18d50 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
18d60 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
18d70 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
18d80 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
18d90 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 72    assert( pBt->r
18da0 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadOnly==0 );.  
18db0 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
18dc0 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
18dd0 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e  ( iStatement>p->
18de0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  db->nSavepoint )
18df0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d  ;.  if( NEVER(p-
18e00 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
18e10 57 52 49 54 45 20 7c 7c 20 70 42 74 2d 3e 72 65  WRITE || pBt->re
18e20 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72  adOnly) ){.    r
18e30 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
18e40 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NAL;.  }else{.  
18e50 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
18e60 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
18e70 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
18e80 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
18e90 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
18ea0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
18eb0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
18ec0 69 74 68 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e  ith.    ** an in
18ed0 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
18ee0 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
18ef0 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
18f00 6c 79 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20  ly using.    ** 
18f10 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  SQL statements. 
18f20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
18f30 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f   open, release o
18f40 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20  r rollback any. 
18f50 20 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70     ** such savep
18f60 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
18f70 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
18f80 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
18f90 69 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 2a  is active..    *
18fa0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
18fb0 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
18fc0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
18fd0 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
18fe0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
18ff0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
19000 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19010 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
19020 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
19030 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c  ction, op, is al
19040 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  ways SAVEPOINT_R
19050 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41  OLLBACK.** or SA
19060 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
19070 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   This function e
19080 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f  ither releases o
19090 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  r rolls back the
190a0 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64  .** savepoint id
190b0 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
190c0 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74  meter iSavepoint
190d0 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
190e0 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  he value .** of 
190f0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  op..**.** Normal
19100 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69  ly, iSavepoint i
19110 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
19120 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e  r equal to zero.
19130 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20   However, if op 
19140 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
19150 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69  ROLLBACK, then i
19160 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c  Savepoint may al
19170 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69  so be -1. In thi
19180 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63  s case the .** c
19190 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65  ontents of the e
191a0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
191b0 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  n are rolled bac
191c0 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
191d0 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e  rent.** from a n
191e0 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  ormal transactio
191f0 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e  n rollback, as n
19200 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65  o locks are rele
19210 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ased and the.** 
19220 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61  transaction rema
19230 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74  ins open..*/.int
19240 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
19250 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c  epoint(Btree *p,
19260 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
19270 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
19280 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19290 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e    if( p && p->in
192a0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
192b0 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
192c0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
192d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
192e0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
192f0 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  ASE || op==SAVEP
19300 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
19310 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61  .    assert( iSa
19320 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69  vepoint>=0 || (i
19330 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26  Savepoint==-1 &&
19340 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
19350 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20  OLLBACK) );.    
19360 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
19370 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r(p);.    rc = s
19380 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
19390 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
193a0 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74  , op, iSavepoint
193b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
193c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
193d0 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
193e0 73 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  se(pBt);.    }. 
193f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
19400 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
19410 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19420 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
19430 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
19440 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
19450 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
19460 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72  * iTable. If a r
19470 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20  ead-only cursor 
19480 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
19490 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
194a0 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61  .** the caller a
194b0 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65  lready has at le
194c0 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ast a read-only 
194d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
194e0 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62  .** on the datab
194f0 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20  ase already. If 
19500 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
19510 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  s requested, the
19520 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  n.** the caller 
19530 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61  is assumed to ha
19540 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
19550 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
19560 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30  .** If wrFlag==0
19570 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
19580 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  r can only be us
19590 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  ed for reading..
195a0 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c  ** If wrFlag==1,
195b0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
195c0 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
195d0 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a   reading or for.
195e0 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74  ** writing if ot
195f0 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66  her conditions f
19600 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61  or writing are a
19610 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a  lso met.  These.
19620 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69  ** are the condi
19630 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
19640 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20  be met in order 
19650 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a  for writing to.*
19660 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a  * be allowed:.**
19670 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73  .** 1:  The curs
19680 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  or must have bee
19690 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  n opened with wr
196a0 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a  Flag==1.**.** 2:
196b0 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
196c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
196d0 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
196e0 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
196f0 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
19700 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
19710 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
19720 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
19730 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
19740 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
19750 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
19760 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
19770 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
19780 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
19790 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
197a0 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
197b0 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
197c0 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
197d0 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
197e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
197f0 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
19800 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
19810 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
19820 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
19830 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
19840 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
19850 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
19860 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
19870 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
19880 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
19890 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
198a0 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
198b0 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
198c0 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
198d0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
198e0 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
198f0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
19900 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  .**.** It is ass
19910 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71  umed that the sq
19920 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
19930 53 69 7a 65 28 29 20 62 79 74 65 73 20 6f 66 20  Size() bytes of 
19940 6d 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e 74  memory .** point
19950 65 64 20 74 6f 20 62 79 20 70 43 75 72 20 68 61  ed to by pCur ha
19960 76 65 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62  ve been zeroed b
19970 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  y the caller..*/
19980 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
19990 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
199a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199c0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
199d0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
19a00 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
19a10 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
19a20 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
19a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a40 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
19a50 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
19a60 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
19a70 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
19a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
19a90 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
19aa0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
19ab0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
19ac0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
19ae0 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
19af0 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  sor */.){.  int 
19b00 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
19b30 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
19b40 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20  *pBt = p->pBt;  
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19b60 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68   Shared b-tree h
19b70 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65  andle */..  asse
19b80 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
19b90 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
19ba0 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
19bb0 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d  g==0 || wrFlag==
19bc0 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66  1 );..  /* The f
19bd0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
19be0 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66  statements verif
19bf0 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69  y that if this i
19c00 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20  s a sharable .  
19c10 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  ** b-tree databa
19c20 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  se, the connecti
19c30 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  on is holding th
19c40 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
19c50 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e   locks, .  ** an
19c60 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
19c70 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
19c80 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  ny open cursor t
19c90 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
19ca0 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f  th .  ** this lo
19cb0 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
19cc0 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
19cd0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
19ce0 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ble, pKeyInfo!=0
19cf0 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20  , wrFlag+1) );. 
19d00 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
19d10 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f  =0 || !hasReadCo
19d20 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c  nflicts(p, iTabl
19d30 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  e) );..  /* Asse
19d40 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  rt that the call
19d50 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68  er has opened th
19d60 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73  e required trans
19d70 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73  action. */.  ass
19d80 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  ert( p->inTrans>
19d90 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
19da0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
19db0 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  0 || p->inTrans=
19dc0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
19dd0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
19de0 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50  Page1 && pBt->pP
19df0 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a  age1->aData );..
19e00 20 20 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c    if( NEVER(wrFl
19e10 61 67 20 26 26 20 70 42 74 2d 3e 72 65 61 64 4f  ag && pBt->readO
19e20 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75  nly) ){.    retu
19e30 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
19e40 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  LY;.  }.  if( iT
19e50 61 62 6c 65 3d 3d 31 20 26 26 20 70 61 67 65 72  able==1 && pager
19e60 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d  Pagecount(pBt)==
19e70 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
19e80 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20  SQLITE_EMPTY;.  
19e90 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
19ea0 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
19eb0 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
19ec0 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
19ed0 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
19ee0 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69  variables and li
19ef0 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
19f00 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
19f10 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72  list.  */.  pCur
19f20 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
19f30 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75  no)iTable;.  pCu
19f40 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
19f50 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
19f60 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
19f70 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
19f80 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
19f90 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61  t;.  pCur->wrFla
19fa0 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a  g = (u8)wrFlag;.
19fb0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
19fc0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
19fd0 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
19fe0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
19ff0 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
1a000 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75  ;.  }.  pBt->pCu
1a010 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
1a020 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1a030 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
1a040 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69  pCur->cachedRowi
1a050 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
1a060 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
1a070 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1a080 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0b0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
1a0c0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0f0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1a100 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1a110 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a140 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
1a150 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
1a160 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
1a170 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
1a180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a190 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
1a1a0 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
1a1b0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1d0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1a1e0 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
1a1f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1a200 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1a210 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
1a220 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69  btreeCursor(p, i
1a230 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70  Table, wrFlag, p
1a240 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a  KeyInfo, pCur);.
1a250 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1a260 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1a270 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1a280 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
1a290 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
1a2a0 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
1a2b0 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
1a2c0 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
1a2d0 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
1a2e0 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
1a2f0 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
1a300 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
1a310 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
1a320 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
1a330 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
1a340 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
1a350 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
1a360 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
1a370 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
1a380 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
1a390 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
1a3a0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
1a3b0 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
1a3c0 72 6e 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73  rn sizeof(BtCurs
1a3d0 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  or);.}../*.** Se
1a3e0 74 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77  t the cached row
1a3f0 69 64 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72  id value of ever
1a400 79 20 63 75 72 73 6f 72 20 69 6e 20 74 68 65 20  y cursor in the 
1a410 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
1a420 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72 20 61 6e  le.** as pCur an
1a430 64 20 68 61 76 69 6e 67 20 74 68 65 20 73 61 6d  d having the sam
1a440 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
1a450 65 72 20 61 73 20 70 43 75 72 2e 20 20 54 68 65  er as pCur.  The
1a460 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74   value is.** set
1a470 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a   to iRowid..**.*
1a480 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65 20  * Only positive 
1a490 72 6f 77 69 64 20 76 61 6c 75 65 73 20 61 72 65  rowid values are
1a4a0 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c 69   considered vali
1a4b0 64 20 66 6f 72 20 74 68 69 73 20 63 61 63 68 65  d for this cache
1a4c0 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68 65 20 69  ..** The cache i
1a4d0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
1a4e0 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e   zero, indicatin
1a4f0 67 20 61 6e 20 69 6e 76 61 6c 69 64 20 63 61 63  g an invalid cac
1a500 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20 77  he..** A btree w
1a510 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77 69  ill work fine wi
1a520 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  th zero or negat
1a530 69 76 65 20 72 6f 77 69 64 73 2e 20 20 57 65 20  ive rowids.  We 
1a540 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63  just cannot.** c
1a550 61 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67  ache zero or neg
1a560 61 74 69 76 65 20 72 6f 77 69 64 73 2c 20 77 68  ative rowids, wh
1a570 69 63 68 20 6d 65 61 6e 73 20 74 61 62 6c 65 73  ich means tables
1a580 20 74 68 61 74 20 75 73 65 20 7a 65 72 6f 20 6f   that use zero o
1a590 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 72 6f  r.** negative ro
1a5a0 77 69 64 73 20 6d 69 67 68 74 20 72 75 6e 20 61  wids might run a
1a5b0 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20   little slower. 
1a5c0 20 42 75 74 20 69 6e 20 70 72 61 63 74 69 63 65   But in practice
1a5d0 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67  , zero.** or neg
1a5e0 61 74 69 76 65 20 72 6f 77 69 64 73 20 61 72 65  ative rowids are
1a5f0 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73   very uncommon s
1a600 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  o this should no
1a610 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
1a620 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1a630 74 72 65 65 53 65 74 43 61 63 68 65 64 52 6f 77  treeSetCachedRow
1a640 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
1a650 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  r, sqlite3_int64
1a660 20 69 52 6f 77 69 64 29 7b 0a 20 20 42 74 43 75   iRowid){.  BtCu
1a670 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
1a680 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72  =pCur->pBt->pCur
1a690 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1a6a0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1a6b0 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e  pgnoRoot==pCur->
1a6c0 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61  pgnoRoot ) p->ca
1a6d0 63 68 65 64 52 6f 77 69 64 20 3d 20 69 52 6f 77  chedRowid = iRow
1a6e0 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  id;.  }.  assert
1a6f0 28 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f  ( pCur->cachedRo
1a700 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d  wid==iRowid );.}
1a710 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1a720 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20  he cached rowid 
1a730 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75  for the given cu
1a740 72 73 6f 72 2e 20 20 41 20 6e 65 67 61 74 69 76  rsor.  A negativ
1a750 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74  e or zero.** ret
1a760 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
1a770 74 65 73 20 74 68 61 74 20 74 68 65 20 72 6f 77  tes that the row
1a780 69 64 20 63 61 63 68 65 20 69 73 20 69 6e 76 61  id cache is inva
1a790 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62  lid and should b
1a7a0 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49  e.** ignored.  I
1a7b0 66 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68  f the rowid cach
1a7c0 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f  e has never befo
1a7d0 72 65 20 62 65 65 6e 20 73 65 74 2c 20 74 68 65  re been set, the
1a7e0 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72  n a.** zero is r
1a7f0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69  eturned..*/.sqli
1a800 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  te3_int64 sqlite
1a810 33 42 74 72 65 65 47 65 74 43 61 63 68 65 64 52  3BtreeGetCachedR
1a820 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  owid(BtCursor *p
1a830 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
1a840 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
1a850 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1a860 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
1a870 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1a880 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1a890 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68  s released.** wh
1a8a0 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73  en the last curs
1a8b0 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  or is closed..*/
1a8c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a8d0 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43  eCloseCursor(BtC
1a8e0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1a8f0 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20  Btree *pBtree = 
1a900 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
1a910 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
1a920 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53    int i;.    BtS
1a930 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
1a940 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  r->pBt;.    sqli
1a950 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
1a960 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  tree);.    sqlit
1a970 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
1a980 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  or(pCur);.    if
1a990 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b  ( pCur->pPrev ){
1a9a0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72  .      pCur->pPr
1a9b0 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72  ev->pNext = pCur
1a9c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
1a9d0 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  se{.      pBt->p
1a9e0 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70  Cursor = pCur->p
1a9f0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
1aa00 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
1aa10 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ){.      pCur->p
1aa20 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43  Next->pPrev = pC
1aa30 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d  ur->pPrev;.    }
1aa40 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1aa50 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
1aa60 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
1aa70 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
1aa80 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge[i]);.    }.  
1aa90 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1aaa0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
1aab0 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1aac0 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
1aad0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72     /* sqlite3_fr
1aae0 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20  ee(pCur); */.   
1aaf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1ab00 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
1ab10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ab20 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
1ab30 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
1ab40 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79  Make a temporary
1ab50 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69   cursor by filli
1ab60 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73  ng in the fields
1ab70 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a   of pTempCur..**
1ab80 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63   The temporary c
1ab90 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20  ursor is not on 
1aba0 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20  the cursor list 
1abb0 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a  for the Btree..*
1abc0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
1abd0 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72  reeGetTempCursor
1abe0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1abf0 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70   BtCursor *pTemp
1ac00 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
1ac10 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1ac20 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1ac30 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d  );.  memcpy(pTem
1ac40 70 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65  pCur, pCur, size
1ac50 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 20  of(BtCursor));. 
1ac60 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74   pTempCur->pNext
1ac70 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72   = 0;.  pTempCur
1ac80 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 66  ->pPrev = 0;.  f
1ac90 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 54 65 6d 70  or(i=0; i<=pTemp
1aca0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
1acb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
1acc0 65 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e  erRef(pTempCur->
1acd0 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61  apPage[i]->pDbPa
1ace0 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ge);.  }.  asser
1acf0 74 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 4b 65  t( pTempCur->pKe
1ad00 79 3d 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  y==0 );.}.#endif
1ad10 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20   /* SQLITE_TEST 
1ad20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ad30 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 44 65 6c  E_TEST./*.** Del
1ad40 65 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ete a temporary 
1ad50 63 75 72 73 6f 72 20 73 75 63 68 20 61 73 20 77  cursor such as w
1ad60 61 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 43  as made by the C
1ad70 72 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75  reateTemporaryCu
1ad80 72 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69  rsor().** functi
1ad90 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69  on above..*/.voi
1ada0 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65  d sqlite3BtreeRe
1adb0 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28  leaseTempCursor(
1adc0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1add0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
1ade0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1adf0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1ae00 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
1ae10 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1ae20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1ae30 6e 72 65 66 28 70 43 75 72 2d 3e 61 70 50 61 67  nref(pCur->apPag
1ae40 65 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a  e[i]->pDbPage);.
1ae50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
1ae60 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
1ae70 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1ae80 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a  TE_TEST */../*.*
1ae90 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1aea0 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
1aeb0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
1aec0 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
1aed0 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
1aee0 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
1aef0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
1af00 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c  lid, call.** sql
1af10 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
1af20 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20  ll() to fill it 
1af30 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73  in..**.** BtCurs
1af40 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63  or.info is a cac
1af50 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d  he of the inform
1af60 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72  ation in the cur
1af70 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73  rent cell..** Us
1af80 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72  ing this cache r
1af90 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65  educes the numbe
1afa0 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73 71  r of calls to sq
1afb0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
1afc0 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  ell()..**.** 200
1afd0 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20  7-06-25:  There 
1afe0 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65  is a bug in some
1aff0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56   versions of MSV
1b000 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65  C that cause the
1b010 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  .** compiler to 
1b020 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65  crash when getCe
1b030 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c  llInfo() is impl
1b040 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63  emented as a mac
1b050 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65  ro..** But there
1b060 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c   is a measureabl
1b070 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67  e speed advantag
1b080 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d  e to using the m
1b090 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28  acro on gcc.** (
1b0a0 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c  when less compil
1b0b0 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
1b0c0 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30   like -Os or -O0
1b0d0 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68   are used and th
1b0e0 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73  e.** compiler is
1b0f0 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73   not doing agres
1b100 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20  sive inlining.) 
1b110 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61   So we use a rea
1b120 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  l function.** fo
1b130 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63  r MSVC and a mac
1b140 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e  ro for everythin
1b150 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20  g else.  Ticket 
1b160 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65  #2457..*/.#ifnde
1b170 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
1b180 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
1b190 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
1b1a0 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
1b1b0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e  nfo info;.    in
1b1c0 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1b1d0 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65  iPage;.    memse
1b1e0 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
1b1f0 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73  of(info));.    s
1b200 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
1b210 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
1b220 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e  e[iPage], pCur->
1b230 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69  aiIdx[iPage], &i
1b240 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
1b250 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20  ( memcmp(&info, 
1b260 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a  &pCur->info, siz
1b270 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b  eof(info))==0 );
1b280 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65  .  }.#else.  #de
1b290 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49  fine assertCellI
1b2a0 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69  nfo(x).#endif.#i
1b2b0 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20  fdef _MSC_VER.  
1b2c0 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75  /* Use a real fu
1b2d0 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74  nction in MSVC t
1b2e0 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75  o work around bu
1b2f0 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69  gs in that compi
1b300 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ler. */.  static
1b310 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
1b320 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
1b330 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1b340 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
1b350 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61 67  {.      int iPag
1b360 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1b370 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
1b380 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1b390 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1b3a0 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
1b3b0 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
1b3c0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61  ;.      pCur->va
1b3d0 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
1b3e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1b3f0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
1b400 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  r);.    }.  }.#e
1b410 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d  lse /* if not _M
1b420 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55  SC_VER */.  /* U
1b430 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c  se a macro in al
1b440 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72  l other compiler
1b450 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75  s so that the fu
1b460 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65  nction is inline
1b470 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74  d */.#define get
1b480 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20  CellInfo(pCur)  
1b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4c0 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72      \.  if( pCur
1b4d0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
1b4e0 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
1b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b510 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69       \.    int i
1b520 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1b530 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b560 20 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c 69        \.    sqli
1b570 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
1b580 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1b590 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
1b5a0 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
1b5b0 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75  info); \.    pCu
1b5c0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
1b5d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b600 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73          \.  }els
1b610 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
1b620 20 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 20 20 5c 0a 20 20 20 20 61           \.    a
1b660 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
1b670 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ur);            
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 20 20 5c 0a 20 20 7d 0a            \.  }.
1b6b0 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56  #endif /* _MSC_V
1b6c0 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ER */../*.** Set
1b6d0 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73   *pSize to the s
1b6e0 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65  ize of the buffe
1b6f0 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  r needed to hold
1b700 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
1b710 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65   the key for the
1b720 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
1b730 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
1b740 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a  s not pointing.*
1b750 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  * to a valid ent
1b760 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65  ry, *pSize is se
1b770 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46  t to 0. .**.** F
1b780 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
1b790 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20  the INTKEY flag 
1b7a0 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  set, this routin
1b7b0 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65  e returns the ke
1b7c0 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74  y.** itself, not
1b7d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1b7e0 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e  ytes in the key.
1b7f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b800 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75  treeKeySize(BtCu
1b810 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
1b820 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
1b830 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
1b840 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1b850 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1b860 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1b870 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1b880 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b890 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1b8a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1b8b0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
1b8c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1b8d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1b8e0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1b8f0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1b900 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a  D ){.      *pSiz
1b910 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
1b920 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49  {.      getCellI
1b930 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20  nfo(pCur);.     
1b940 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
1b950 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d  info.nKey;.    }
1b960 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  ;.}../*.** Set *
1b980 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d  pSize to the num
1b990 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1b9a0 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72  data in the entr
1b9b0 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  y the.** cursor 
1b9c0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1b9d0 20 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74   to.  Always ret
1b9e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
1b9f0 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74  * Failure is not
1ba00 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74   possible.  If t
1ba10 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
1ba20 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f   currently.** po
1ba30 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74  inting to an ent
1ba40 72 79 20 28 77 68 69 63 68 20 63 61 6e 20 68 61  ry (which can ha
1ba50 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c  ppen, for exampl
1ba60 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74  e, if.** the dat
1ba70 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 29 20  abase is empty) 
1ba80 74 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73  then *pSize is s
1ba90 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20  et to 0..*/.int 
1baa0 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
1bab0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
1bac0 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29  Cur, u32 *pSize)
1bad0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
1bae0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1baf0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1bb00 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
1bb10 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
1bb20 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
1bb30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bb40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1bb50 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
1bb60 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
1bb70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1bb80 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  ID );.    if( pC
1bb90 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1bba0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1bbb0 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74      /* Not point
1bbc0 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20 65  ing at a valid e
1bbd0 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69 7a  ntry - set *pSiz
1bbe0 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20  e to 0. */.     
1bbf0 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20   *pSize = 0;.   
1bc00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65   }else{.      ge
1bc10 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1bc20 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
1bc30 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
1bc40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1bc50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1bc60 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
1bc70 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
1bc80 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1bc90 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
1bca0 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
1bcb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
1bcc0 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
1bcd0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
1bce0 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
1bcf0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
1bd00 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
1bd10 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
1bd20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
1bd30 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
1bd40 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
1bd50 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
1bd60 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
1bd70 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
1bd80 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1bd90 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
1bda0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1bdb0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1bdc0 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
1bdd0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1bde0 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
1bdf0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
1be00 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
1be10 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
1be20 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
1be30 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
1be40 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
1be50 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
1be60 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
1be70 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
1be80 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
1be90 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
1bea0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
1beb0 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
1bec0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
1bed0 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
1bee0 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
1bef0 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
1bf00 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1bf10 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
1bf20 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
1bf30 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
1bf40 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
1bf50 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
1bf60 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
1bf70 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
1bf80 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
1bf90 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
1bfa0 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
1bfb0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
1bfc0 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
1bfd0 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
1bfe0 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
1bff0 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
1c000 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
1c010 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
1c020 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
1c030 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
1c040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c050 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1c060 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c080 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
1c090 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
1c0a0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
1c0b0 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
1c0c0 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
1c0d0 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
1c0e0 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
1c0f0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
1c100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1c110 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
1c120 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
1c130 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
1c140 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1c150 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
1c160 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1c170 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1c180 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1c190 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1c1a0 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
1c1b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1c1c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1c1d0 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
1c1e0 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
1c1f0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
1c200 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
1c210 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
1c220 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
1c230 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
1c240 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
1c250 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
1c260 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
1c270 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
1c280 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
1c290 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
1c2a0 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
1c2b0 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
1c2c0 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
1c2d0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
1c2e0 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
1c2f0 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
1c300 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
1c310 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1c320 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
1c330 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
1c340 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
1c350 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
1c360 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
1c370 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
1c380 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
1c390 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1c3a0 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
1c3b0 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
1c3c0 20 69 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67   if( iGuess<=pag
1c3d0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
1c3e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1c3f0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
1c400 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
1c410 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1c420 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c430 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1c440 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
1c450 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
1c460 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
1c470 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1c480 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
1c490 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1c4a0 64 69 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  dif..  if( rc==S
1c4b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c4c0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1c4d0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76  eGetPage(pBt, ov
1c4e0 66 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a  fl, &pPage, 0);.
1c4f0 20 20 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53      assert(rc==S
1c500 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
1c510 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  e==0);.    if( n
1c520 65 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  ext==0 && rc==SQ
1c530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c540 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
1c550 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
1c560 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
1c570 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
1c580 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
1c590 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
1c5a0 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
1c5b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1c5c0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
1c5d0 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
1c5e0 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
1c5f0 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
1c600 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
1c610 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
1c620 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
1c630 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
1c640 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
1c650 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
1c660 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
1c670 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1c680 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
1c690 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
1c6a0 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
1c6b0 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
1c6c0 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
1c6d0 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
1c6e0 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
1c6f0 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
1c700 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
1c710 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1c720 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
1c730 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
1c740 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
1c750 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
1c760 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
1c770 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
1c780 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1c790 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
1c7a0 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
1c7b0 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
1c7c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c7d0 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
1c7e0 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
1c7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1c800 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
1c810 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
1c820 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c830 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
1c840 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
1c850 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
1c860 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c870 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
1c880 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
1c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c8a0 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
1c8b0 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
1c8c0 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
1c8d0 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
1c8e0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
1c8f0 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
1c900 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
1c910 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
1c920 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
1c930 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
1c940 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
1c950 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
1c960 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1c970 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
1c980 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c990 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1c9a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
1c9b0 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
1c9c0 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
1c9d0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
1c9e0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
1c9f0 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
1ca00 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
1ca10 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
1ca20 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
1ca30 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
1ca40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ca50 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1ca60 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
1ca70 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
1ca80 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
1ca90 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
1caa0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
1cab0 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
1cac0 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68  inting to. If th
1cad0 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74  e eOp.** paramet
1cae0 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73  er is 0, this is
1caf0 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
1cb00 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69  n (data copied i
1cb10 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  nto.** buffer pB
1cb20 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  uf). If it is no
1cb30 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20  n-zero, a write 
1cb40 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f  (data copied fro
1cb50 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  m.** buffer pBuf
1cb60 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  )..**.** A total
1cb70 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
1cb80 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
1cb90 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
1cba0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
1cbb0 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
1cbc0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
1cbd0 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   pBuf..**.** Thi
1cbe0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
1cbf0 6f 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e  ot make a distin
1cc00 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65  ction between ke
1cc10 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49  y and data..** I
1cc20 74 20 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20  t just reads or 
1cc30 77 72 69 74 65 73 20 62 79 74 65 73 20 66 72 6f  writes bytes fro
1cc40 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72  m the payload ar
1cc50 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20  ea.  Data might 
1cc60 0a 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68  .** appear on th
1cc70 65 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62  e main page or b
1cc80 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
1cc90 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
1cca0 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a  flow .** pages..
1ccb0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43  **.** If the BtC
1ccc0 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62  ursor.isIncrblob
1ccd0 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
1cce0 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  et, and the curr
1ccf0 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e  ent.** cursor en
1cd00 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
1cd10 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
1cd20 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ges, this functi
1cd30 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20  on.** allocates 
1cd40 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
1cd50 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74  zily popluates t
1cd60 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1cd70 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20  -list .** cache 
1cd80 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
1cd90 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73  aOverflow). Subs
1cda0 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
1cdb0 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74   this.** cache t
1cdc0 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
1cdd0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
1cde0 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63  ffset more effic
1cdf0 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
1ce00 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1ce10 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
1ce20 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1ce30 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
1ce40 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
1ce50 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
1ce60 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
1ce70 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
1ce80 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
1ce90 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
1cea0 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
1ceb0 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
1cec0 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
1ced0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
1cee0 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
1cef0 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
1cf00 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
1cf10 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
1cf20 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1cf30 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
1cf40 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
1cf50 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
1cf60 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
1cf70 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
1cf80 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
1cf90 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
1cfa0 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
1cfb0 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
1cfc0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1cfd0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1cfe0 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
1cff0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1d000 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
1d010 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
1d020 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
1d030 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
1d040 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
1d050 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
1d060 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
1d070 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1d080 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
1d090 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
1d0a0 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
1d0b0 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20   int skipKey,   
1d0c0 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20        /* offset 
1d0d0 62 65 67 69 6e 73 20 61 74 20 64 61 74 61 20 69  begins at data i
1d0e0 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a  f this is true *
1d0f0 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20  /.  int eOp     
1d100 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f           /* zero
1d110 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65   to read. non-ze
1d120 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a  ro to write. */.
1d130 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
1d140 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
1d150 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1d160 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a  OK;.  u32 nKey;.
1d170 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a    int iIdx = 0;.
1d180 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1d190 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1d1a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a  pCur->iPage]; /*
1d1b0 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63   Btree page of c
1d1c0 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a  urrent entry */.
1d1d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1d1e0 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20  = pCur->pBt;    
1d1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d200 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73   Btree this curs
1d210 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  or belongs to */
1d220 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1d230 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1d240 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1d250 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
1d260 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1d270 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1d280 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1d290 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1d2a0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1d2b0 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   );..  getCellIn
1d2c0 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
1d2d0 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
1d2e0 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e  o.pCell + pCur->
1d2f0 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
1d300 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69  nKey = (pPage->i
1d310 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74  ntKey ? 0 : (int
1d320 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
1d330 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65  );..  if( skipKe
1d340 79 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  y ){.    offset 
1d350 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  += nKey;.  }.  i
1d360 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20  f( offset+amt > 
1d370 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e  nKey+pCur->info.
1d380 6e 44 61 74 61 20 0a 20 20 20 7c 7c 20 26 61 50  nData .   || &aP
1d390 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
1d3a0 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
1d3b0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
1d3c0 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a  sableSize].  ){.
1d3d0 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
1d3e0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
1d3f0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
1d400 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
1d410 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
1d420 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1d430 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
1d440 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
1d450 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
1d460 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
1d470 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
1d480 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
1d490 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
1d4a0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
1d4b0 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
1d4c0 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
1d4d0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
1d4e0 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
1d4f0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
1d500 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
1d510 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
1d520 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
1d530 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
1d540 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
1d550 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
1d560 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
1d570 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
1d580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
1d590 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
1d5a0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20  .nLocal;.  }..  
1d5b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d5c0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
1d5d0 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c    const u32 ovfl
1d5e0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
1d5f0 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
1d600 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
1d610 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
1d620 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
1d630 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
1d640 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
1d650 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
1d660 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64  nLocal]);..#ifnd
1d670 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1d680 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49  NCRBLOB.    /* I
1d690 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62  f the isIncrblob
1d6a0 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
1d6b0 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72  et and the BtCur
1d6c0 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a  sor.aOverflow[].
1d6d0 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62      ** has not b
1d6e0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
1d6f0 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  llocate it now. 
1d700 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a  The array is siz
1d710 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65  ed at.    ** one
1d720 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
1d730 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1d740 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
1d750 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20  ain. The.    ** 
1d760 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1d770 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
1d780 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64  w page is stored
1d790 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
1d7a0 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20  ,.    ** etc. A 
1d7b0 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
1d7c0 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
1d7d0 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79  ray means "not y
1d7e0 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a  et known".    **
1d7f0 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
1d800 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
1d810 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d820 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f   pCur->isIncrblo
1d830 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72  bHandle && !pCur
1d840 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
1d850 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
1d860 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
1d870 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
1d880 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
1d890 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
1d8a0 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
1d8b0 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71  low = (Pgno *)sq
1d8c0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
1d8d0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76  sizeof(Pgno)*nOv
1d8e0 66 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  fl);.      if( n
1d8f0 4f 76 66 6c 20 26 26 20 21 70 43 75 72 2d 3e 61  Ovfl && !pCur->a
1d900 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
1d910 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d920 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
1d930 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1d940 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
1d950 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
1d960 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1d970 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  and the.    ** e
1d980 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
1d990 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
1d9a0 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
1d9b0 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20  id, skip.    ** 
1d9c0 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
1d9d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1d9e0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
1d9f0 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
1da00 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a  w[offset/ovflSiz
1da10 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78  e] ){.      iIdx
1da20 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53   = (offset/ovflS
1da30 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74  ize);.      next
1da40 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
1da50 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20  erflow[iIdx];.  
1da60 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66      offset = (of
1da70 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset%ovflSize);.
1da80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1da90 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c    for( ; rc==SQL
1daa0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
1dab0 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64  && nextPage; iId
1dac0 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53  x++){..#ifndef S
1dad0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
1dae0 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  LOB.      /* If 
1daf0 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
1db00 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
1db10 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
1db20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
1db30 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
1db40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1db50 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
1db60 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e  [iIdx] || pCur->
1db70 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
1db80 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  =nextPage);.    
1db90 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
1dba0 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
1dbb0 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Page;.      }.#e
1dbc0 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20  ndif..      if( 
1dbd0 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
1dbe0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1dbf0 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
1dc00 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
1dc10 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
1dc20 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
1dc30 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
1dc40 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
1dc50 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
1dc60 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
1dc70 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
1dc80 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
1dc90 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
1dca0 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
1dcb0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
1dcc0 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
1dcd0 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
1dce0 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
1dcf0 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
1dd00 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
1dd10 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e  .        */.#ifn
1dd20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1dd30 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20  INCRBLOB.       
1dd40 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
1dd50 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f  flow && pCur->aO
1dd60 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20  verflow[iIdx+1] 
1dd70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  ){.          nex
1dd80 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
1dd90 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b  verflow[iIdx+1];
1dda0 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
1ddb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
1ddc0 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
1ddd0 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
1dde0 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
1ddf0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  ge);.        off
1de00 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
1de10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1de20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
1de30 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
1de40 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
1de50 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
1de60 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
1de70 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
1de80 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
1de90 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
1dea0 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
1deb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44      */.        D
1dec0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
1ded0 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
1dee0 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  amt;.        rc 
1def0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1df00 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  t(pBt->pPager, n
1df10 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
1df20 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1df30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1df40 0a 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c  .          aPayl
1df50 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
1df60 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
1df70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65  e);.          ne
1df80 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
1df90 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
1dfa0 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
1dfb0 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
1dfc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1dfd0 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
1dfe0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20  ffset;.         
1dff0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
1e000 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
1e010 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
1e020 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
1e030 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
1e040 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1e050 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
1e060 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65  .          offse
1e070 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
1e080 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20   amt -= a;.     
1e090 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a       pBuf += a;.
1e0a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e0b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
1e0c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e0d0 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
1e0e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1e0f0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1e100 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e110 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
1e120 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f   of the key asso
1e130 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
1e140 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
1e150 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
1e160 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
1e170 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
1e180 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
1e190 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
1e1a0 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  set"..**.** Retu
1e1b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
1e1c0 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
1e1d0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
1e1e0 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
1e1f0 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
1e200 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
1e210 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
1e220 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
1e230 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
1e240 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1e250 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73  3BtreeKey(BtCurs
1e260 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
1e270 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
1e280 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
1e290 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1e2a0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1e2b0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
1e2c0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
1e2d0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
1e2e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e2f0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
1e300 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1e310 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1e320 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1e330 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
1e340 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1e350 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 69  >iPage] );.    i
1e360 66 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  f( pCur->apPage[
1e370 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
1e380 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e390 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1e3a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1e3b0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1e3c0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
1e3d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1e3e0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
1e3f0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
1e400 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
1e410 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
1e420 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
1e430 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
1e440 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e450 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
1e460 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
1e470 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
1e480 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
1e490 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
1e4a0 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
1e4b0 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
1e4c0 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
1e4d0 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
1e4e0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1e4f0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1e500 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
1e510 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
1e520 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
1e530 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
1e540 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
1e550 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
1e560 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
1e570 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
1e580 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1e590 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
1e5a0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
1e5b0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
1e5c0 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
1e5d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e5e0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
1e5f0 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61   if ( pCur->eSta
1e600 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1e610 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
1e620 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
1e630 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
1e640 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1e650 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1e660 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
1e670 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1e680 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1e690 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1e6a0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1e6b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e6c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1e6d0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
1e6e0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
1e6f0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
1e700 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1e710 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1e720 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1e730 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1e740 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
1e750 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
1e760 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
1e770 2c 20 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20  , pBuf, 1, 0);. 
1e780 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1e790 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1e7a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
1e7b0 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
1e7c0 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
1e7d0 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
1e7e0 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
1e7f0 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
1e800 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
1e810 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
1e820 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b  the key if skipK
1e830 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69  ey==0 and it poi
1e840 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e  nts to the begin
1e850 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a  ning of data if.
1e860 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20  ** skipKey==1.  
1e870 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
1e880 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
1e890 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
1e8a0 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41  tten.** into *pA
1e8b0 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
1e8c0 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
1e8d0 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
1e8e0 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64  ot be.** a valid
1e8f0 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
1e900 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1e910 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
1e920 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
1e930 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
1e940 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
1e950 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
1e960 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
1e970 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
1e980 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
1e990 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
1e9a0 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
1e9b0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
1e9c0 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
1e9d0 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
1e9e0 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
1e9f0 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
1ea00 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
1ea10 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
1ea20 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
1ea30 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
1ea40 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
1ea50 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b  ssemble.** the k
1ea60 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
1ea70 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
1ea80 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
1ea90 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
1eaa0 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
1eab0 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
1eac0 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
1ead0 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
1eae0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1eaf0 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
1eb00 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
1eb10 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
1eb20 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
1eb30 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
1eb40 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
1eb50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66  unsigned char *f
1eb60 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42  etchPayload(.  B
1eb70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
1eb80 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
1eb90 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
1eba0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
1ebb0 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20    int *pAmt,    
1ebc0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1ebd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
1ebe0 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65  ailable bytes he
1ebf0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70  re */.  int skip
1ec00 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Key          /* 
1ec10 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61  read beginning a
1ec20 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69  t data if this i
1ec30 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  s true */.){.  u
1ec40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
1ec50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67  ayload;.  MemPag
1ec60 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20  e *pPage;.  u32 
1ec70 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63  nKey;.  u32 nLoc
1ec80 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  al;..  assert( p
1ec90 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
1eca0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
1ecb0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1ecc0 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
1ecd0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1ece0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1ecf0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1ed00 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1ed10 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
1ed20 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1ed30 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
1ed40 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
1ed50 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
1ed60 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65  e->nCell );.  ge
1ed70 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1ed80 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
1ed90 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a  ur->info.pCell;.
1eda0 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43    aPayload += pC
1edb0 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
1edc0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
1edd0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65  ntKey ){.    nKe
1ede0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
1edf0 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29      nKey = (int)
1ee00 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
1ee10 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b  .  }.  if( skipK
1ee20 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f  ey ){.    aPaylo
1ee30 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  ad += nKey;.    
1ee40 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
1ee50 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65  nfo.nLocal - nKe
1ee60 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
1ee70 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
1ee80 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  nfo.nLocal;.    
1ee90 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20  if( nLocal>nKey 
1eea0 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20  ){.      nLocal 
1eeb0 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  = nKey;.    }.  
1eec0 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63  }.  *pAmt = nLoc
1eed0 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61  al;.  return aPa
1eee0 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
1eef0 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
1ef00 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
1ef10 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
1ef20 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
1ef30 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
1ef40 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
1ef50 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
1ef60 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
1ef70 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
1ef80 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
1ef90 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
1efa0 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
1efb0 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
1efc0 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
1efd0 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
1efe0 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
1eff0 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
1f000 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
1f010 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
1f020 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
1f030 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
1f040 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
1f050 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
1f060 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
1f070 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
1f080 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
1f090 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
1f0a0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1f0b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
1f0c0 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
1f0d0 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
1f0e0 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
1f0f0 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
1f100 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
1f110 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1f120 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
1f130 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
1f140 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
1f150 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1f160 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73  nt *pAmt){.  ass
1f170 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1f180 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1f190 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
1f1a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
1f1b0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1f1c0 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
1f1d0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1f1e0 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
1f1f0 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f  return (const vo
1f200 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
1f210 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b  (pCur, pAmt, 0);
1f220 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1f230 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
1f240 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
1f250 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
1f260 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
1f270 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1f280 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
1f290 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
1f2a0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1f2b0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1f2c0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1f2d0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1f2e0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1f2f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f  {.    return (co
1f300 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
1f310 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
1f320 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 1);.  }.  ret
1f330 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
1f340 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1f350 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
1f360 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
1f370 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
1f380 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
1f390 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
1f3a0 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
1f3b0 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   to..*/.static i
1f3c0 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42  nt moveToChild(B
1f3d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
1f3e0 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69  32 newPgno){.  i
1f3f0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d  nt rc;.  int i =
1f400 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
1f410 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67  MemPage *pNewPag
1f420 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
1f430 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
1f440 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1f450 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1f460 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1f470 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1f480 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
1f490 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
1f4a0 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  ge<BTCURSOR_MAX_
1f4b0 44 45 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70  DEPTH );.  if( p
1f4c0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43  Cur->iPage>=(BTC
1f4d0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d  URSOR_MAX_DEPTH-
1f4e0 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
1f4f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1f500 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  BKPT;.  }.  rc =
1f510 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
1f520 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
1f530 4e 65 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20  NewPage);.  if( 
1f540 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1f550 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
1f560 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a  +1] = pNewPage;.
1f570 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b    pCur->aiIdx[i+
1f580 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  1] = 0;.  pCur->
1f590 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72  iPage++;..  pCur
1f5a0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1f5b0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
1f5c0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Key = 0;.  if( p
1f5d0 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31  NewPage->nCell<1
1f5e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1f5f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1f600 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
1f610 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1f620 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
1f630 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
1f640 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
1f650 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
1f660 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
1f670 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
1f680 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
1f690 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
1f6a0 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
1f6b0 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
1f6c0 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
1f6d0 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
1f6e0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
1f6f0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
1f700 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
1f710 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
1f720 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
1f730 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
1f740 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
1f750 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
1f760 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
1f770 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
1f780 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
1f790 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72  iChild){.  asser
1f7a0 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74  t( iIdx<=pParent
1f7b0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
1f7c0 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e   iIdx==pParent->
1f7d0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73  nCell ){.    ass
1f7e0 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70  ert( get4byte(&p
1f7f0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
1f800 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
1f810 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  +8])==iChild );.
1f820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1f830 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69  ert( get4byte(fi
1f840 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
1f850 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29  iIdx))==iChild )
1f860 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
1f870 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61   define assertPa
1f880 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29  rentIndex(x,y,z)
1f890 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20   .#endif../*.** 
1f8a0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1f8b0 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
1f8c0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
1f8d0 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
1f8e0 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
1f8f0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1f900 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
1f910 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
1f920 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
1f930 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
1f940 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
1f950 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
1f960 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
1f970 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
1f980 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
1f990 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
1f9a0 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
1f9b0 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
1f9c0 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
1f9d0 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
1f9e0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1f9f0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1fa00 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1fa10 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1fa20 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1fa30 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
1fa40 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
1fa50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
1fa60 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e  );.  assertParen
1fa70 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72  tIndex(.    pCur
1fa80 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1fa90 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
1faa0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1fab0 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
1fac0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1fad0 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20  ->iPage]->pgno. 
1fae0 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67   );.  releasePag
1faf0 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  e(pCur->apPage[p
1fb00 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
1fb10 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
1fb20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1fb30 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
1fb40 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a  alidNKey = 0;.}.
1fb50 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1fb60 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f  cursor to the ro
1fb70 6f 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69  ot page.*/.stati
1fb80 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74  c int moveToRoot
1fb90 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1fba0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  {.  MemPage *pRo
1fbb0 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ot;.  int rc = S
1fbc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65  QLITE_OK;.  Btre
1fbd0 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
1fbe0 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
1fbf0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
1fc00 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1fc10 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1fc20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
1fc30 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
1fc40 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
1fc50 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
1fc60 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
1fc70 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1fc80 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
1fc90 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
1fca0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
1fcb0 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
1fcc0 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
1fcd0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
1fce0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
1fcf0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
1fd00 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ULT ){.      ret
1fd10 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
1fd20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1fd30 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
1fd40 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20  r(pCur);.  }..  
1fd50 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
1fd60 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
1fd70 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
1fd80 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
1fd90 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
1fda0 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
1fdb0 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge[i]);.    }.  
1fdc0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
1fdd0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1fde0 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54  if( .      SQLIT
1fdf0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41  E_OK!=(rc = getA
1fe00 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
1fe10 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
1fe20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  &pCur->apPage[0]
1fe30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
1fe40 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1fe50 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1fe60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1fe70 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
1fe80 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20  iPage = 0;..    
1fe90 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
1fea0 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
1feb0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
1fec0 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
1fed0 69 73 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a  is cursor.    **
1fee0 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65   expected to ope
1fef0 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78  n it on an index
1ff00 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
1ff10 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20  se, if pKeyInfo 
1ff20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20  is.    ** NULL, 
1ff30 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63  the caller expec
1ff40 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ts a table b-tre
1ff50 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  e. If this is no
1ff60 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 20 20  t the case,.    
1ff70 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
1ff80 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
1ff90 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  r.  */.    asser
1ffa0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
1ffb0 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  0]->intKey==1 ||
1ffc0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
1ffd0 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
1ffe0 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 70 4b     if( (pCur->pK
1fff0 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72  eyInfo==0)!=pCur
20000 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
20010 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
20020 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
20030 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
20040 20 7d 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43   }..  pRoot = pC
20050 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
20060 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
20070 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
20080 52 6f 6f 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Root );.  pCur->
20090 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
200a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
200b0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74   = 0;.  pCur->at
200c0 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72  Last = 0;.  pCur
200d0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
200e0 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ..  if( pRoot->n
200f0 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f  Cell==0 && !pRoo
20100 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
20110 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
20120 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
20130 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
20140 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20150 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
20160 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a  oot->pgno==1 );.
20170 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
20180 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
20190 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
201a0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61  ffset+8]);.    a
201b0 73 73 65 72 74 28 20 73 75 62 70 61 67 65 3e 30  ssert( subpage>0
201c0 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   );.    pCur->eS
201d0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
201e0 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  LID;.    rc = mo
201f0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
20200 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73  subpage);.  }els
20210 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  e{.    pCur->eSt
20220 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e  ate = ((pRoot->n
20230 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56  Cell>0)?CURSOR_V
20240 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41  ALID:CURSOR_INVA
20250 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LID);.  }.  retu
20260 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20270 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
20280 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
20290 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
202a0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
202b0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
202c0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
202d0 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
202e0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
202f0 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
20300 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
20310 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
20320 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
20330 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
20340 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
20350 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
20360 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
20370 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20380 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
20390 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
203a0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
203b0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
203c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
203d0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
203e0 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
203f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20400 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
20410 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
20420 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
20430 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
20440 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
20450 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
20460 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
20470 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
20480 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49  pPage, pCur->aiI
20490 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  dx[pCur->iPage])
204a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
204b0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
204c0 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
204d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
204e0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
204f0 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
20500 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
20510 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
20520 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
20530 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
20540 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
20550 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
20560 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
20570 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
20580 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
20590 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
205a0 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
205b0 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
205c0 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
205d0 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
205e0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
205f0 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
20600 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
20610 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
20620 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
20630 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
20640 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
20650 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
20660 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
20670 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
20680 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20690 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
206a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
206b0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
206c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
206d0 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
206e0 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
206f0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
20700 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
20710 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
20720 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
20730 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
20740 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20750 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
20760 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20770 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
20780 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
20790 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
207a0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
207b0 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
207c0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
207d0 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
207e0 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
207f0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
20800 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  gno);.  }.  if( 
20810 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20820 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
20830 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
20840 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
20850 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
20860 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
20870 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
20880 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
20890 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
208a0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
208b0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
208c0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
208d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
208e0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
208f0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
20900 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
20910 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
20920 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
20930 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
20940 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
20950 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
20960 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
20970 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
20980 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
20990 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
209a0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
209b0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
209c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
209d0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
209e0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
209f0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
20a00 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
20a10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20a20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
20a30 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
20a40 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
20a50 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
20a60 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
20a70 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
20a80 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
20a90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20aa0 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
20ab0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
20ac0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20ad0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
20ae0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
20af0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
20b00 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
20b10 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ur);.    }.  }. 
20b20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20b30 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
20b40 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
20b50 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
20b60 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
20b70 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
20b80 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
20b90 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
20ba0 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
20bb0 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
20bc0 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
20bd0 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
20be0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
20bf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
20c00 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
20c10 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
20c20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65  int rc;. .  asse
20c30 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
20c40 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
20c50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
20c60 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
20c70 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
20c80 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
20c90 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61  the cursor alrea
20ca0 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
20cb0 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69   last entry, thi
20cc0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  s is a no-op. */
20cd0 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41  .  if( CURSOR_VA
20ce0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
20cf0 65 20 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73  e && pCur->atLas
20d00 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  t ){.#ifdef SQLI
20d10 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
20d20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
20d30 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  s to assert() th
20d40 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65  at the cursor re
20d50 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20  ally does point 
20d60 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c  .    ** to the l
20d70 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
20d80 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20   b-tree. */.    
20d90 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
20da0 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69  ii=0; ii<pCur->i
20db0 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
20dc0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
20dd0 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72  >aiIdx[ii]==pCur
20de0 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43  ->apPage[ii]->nC
20df0 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ell );.    }.   
20e00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
20e10 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
20e20 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
20e30 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
20e40 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73  ell-1 );.    ass
20e50 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
20e60 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
20e70 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  leaf );.#endif. 
20e80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20e90 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
20ea0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
20eb0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
20ec0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
20ed0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
20ee0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
20ef0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20f00 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
20f10 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
20f20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
20f30 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
20f40 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
20f50 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
20f60 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
20f70 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
20f80 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
20f90 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
20fa0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74  ;.      pCur->at
20fb0 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54  Last = rc==SQLIT
20fc0 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d  E_OK ?1:0;.    }
20fd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20fe0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
20ff0 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
21000 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
21010 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
21020 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
21030 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
21040 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
21050 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
21060 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
21070 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
21080 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
21090 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
210a0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
210b0 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
210c0 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
210d0 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
210e0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
210f0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
21100 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
21110 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
21120 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
21130 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
21140 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
21150 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
21160 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
21170 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
21180 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
21190 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
211a0 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
211b0 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
211c0 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
211d0 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
211e0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
211f0 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
21200 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
21210 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
21220 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
21230 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
21240 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
21250 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
21260 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
21270 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
21280 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
21290 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
212a0 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
212b0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
212c0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
212d0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
212e0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
212f0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
21300 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
21310 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
21320 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
21330 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
21340 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
21350 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
21360 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
21370 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
21380 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
21390 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
213a0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
213b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
213c0 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
213d0 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
213e0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
213f0 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
21400 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
21410 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
21420 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
21430 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
21440 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
21450 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a  /pIdxKey..**.*/.
21460 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
21470 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
21480 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
21490 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
214a0 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
214b0 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
214c0 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
214d0 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
214e0 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
214f0 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
21500 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
21510 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
21520 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
21530 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
21540 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
21550 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
21560 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
21570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21580 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
21590 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
215a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
215b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
215c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
215d0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
215e0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
215f0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
21600 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
21610 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
21620 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
21630 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
21640 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
21650 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
21660 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
21670 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
21680 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
21690 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
216a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20  CURSOR_VALID && 
216b0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
216c0 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50  .   && pCur->apP
216d0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a  age[0]->intKey .
216e0 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
216f0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
21700 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
21710 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
21720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21730 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
21740 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70  Cur->atLast && p
21750 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
21760 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
21770 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
21780 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21790 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
217a0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
217b0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
217c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
217d0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
217e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
217f0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
21800 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
21810 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21820 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
21830 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
21840 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
21850 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
21860 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
21870 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21880 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
21890 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
218a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
218b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
218c0 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
218d0 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
218e0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
218f0 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20  t lwr, upr;.    
21900 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
21910 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
21920 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
21930 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
21940 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a   int c = -1;  /*
21950 20 70 52 65 73 20 72 65 74 75 72 6e 20 69 66 20   pRes return if 
21960 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d  table is empty m
21970 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20  ust be -1 */.   
21980 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
21990 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
219a0 2d 31 3b 0a 20 20 20 20 69 66 28 20 28 21 70 50  -1;.    if( (!pP
219b0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70  age->intKey && p
219c0 49 64 78 4b 65 79 3d 3d 30 29 20 7c 7c 20 75 70  IdxKey==0) || up
219d0 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  r<0 ){.      rc 
219e0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
219f0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
21a00 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
21a10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
21a20 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20  iasRight ){.    
21a30 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
21a40 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
21a50 36 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  6)upr;.    }else
21a60 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  {.      pCur->ai
21a70 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
21a80 20 3d 20 28 75 31 36 29 28 28 75 70 72 2b 6c 77   = (u16)((upr+lw
21a90 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
21aa0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
21ab0 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
21ac0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
21ad0 65 5d 3b 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  e]; /* Index of 
21ae0 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
21af0 70 50 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 75  pPage */.      u
21b00 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  8 *pCell;       
21b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
21b30 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
21b40 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20   pPage */..     
21b50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
21b60 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 65  e = 0;.      pCe
21b70 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
21b80 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67  age, idx) + pPag
21b90 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
21ba0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
21bb0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
21bc0 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
21bd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
21be0 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
21bf0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75            u32 du
21c00 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mmy;.          p
21c10 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e  Cell += getVarin
21c20 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79  t32(pCell, dummy
21c30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
21c40 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
21c50 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65  Cell, (u64*)&nCe
21c60 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
21c70 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  if( nCellKey==in
21c80 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
21c90 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
21ca0 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
21cb0 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
21cc0 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a          c = -1;.
21cd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21ce0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
21cf0 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
21d00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
21d10 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
21d20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61          pCur->va
21d30 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
21d40 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
21d50 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
21d60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21d70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78        /* The max
21d80 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
21d90 61 67 65 2d 73 69 7a 65 20 69 73 20 33 32 37 36  age-size is 3276
21da0 38 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65  8 bytes. This me
21db0 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  ans that.       
21dc0 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   ** the maximum 
21dd0 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  number of record
21de0 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e   bytes stored on
21df0 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65   an index B-Tree
21e00 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
21e10 20 69 73 20 61 74 20 6d 6f 73 74 20 38 31 39 38   is at most 8198
21e20 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 6d 61   bytes, which ma
21e30 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
21e40 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20   2-byte.        
21e50 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20  ** varint. This 
21e60 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
21e70 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74  sed to attempt t
21e80 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20  o avoid parsing 
21e90 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
21ea0 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63  entire cell by c
21eb0 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20  hecking for the 
21ec0 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
21ed0 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20  record is .     
21ee0 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74     ** stored ent
21ef0 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65  irely within the
21f00 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20   b-tree page by 
21f10 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66  inspecting the f
21f20 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  irst .        **
21f30 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   2 bytes of the 
21f40 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cell..        */
21f50 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65  .        int nCe
21f60 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20  ll = pCell[0];. 
21f70 20 20 20 20 20 20 20 69 66 28 20 21 28 6e 43 65         if( !(nCe
21f80 6c 6c 20 26 20 30 78 38 30 29 20 26 26 20 6e 43  ll & 0x80) && nC
21f90 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ell<=pPage->maxL
21fa0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
21fb0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
21fc0 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63   runs if the rec
21fd0 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  ord-size field o
21fe0 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a  f the cell is a.
21ff0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
22000 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20  gle byte varint 
22010 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66  and the record f
22020 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
22030 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20  the main.       
22040 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67     ** b-tree pag
22050 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
22060 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
22070 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
22080 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
22090 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[1], pIdxKey);
220a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
220b0 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20  f( !(pCell[1] & 
220c0 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20  0x80) .         
220d0 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e   && (nCell = ((n
220e0 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b  Cell&0x7f)<<7) +
220f0 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67   pCell[1])<=pPag
22100 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20  e->maxLocal.    
22110 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
22120 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73   /* The record-s
22130 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32  ize field is a 2
22140 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
22150 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20   the record .   
22160 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65         ** fits e
22170 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
22180 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ain b-tree page.
22190 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
221a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
221b0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
221c0 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
221d0 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [2], pIdxKey);. 
221e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
221f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
22200 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72  ecord flows over
22210 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   onto one or mor
22220 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
22230 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  . In.          *
22240 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  * this case the 
22250 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73  whole cell needs
22260 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61   to be parsed, a
22270 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
22280 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  d.          ** a
22290 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nd accessPayload
222a0 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69  () used to retri
222b0 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  eve the record i
222c0 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
222d0 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f    ** buffer befo
222e0 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  re VdbeRecordCom
222f0 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61  pare() can be ca
22300 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lled. */.       
22310 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65     void *pCellKe
22320 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  y;.          u8 
22330 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64  * const pCellBod
22340 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67  y = pCell - pPag
22350 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
22360 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
22370 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
22380 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
22390 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
223a0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
223b0 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
223c0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
223d0 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
223e0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
223f0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20  nCell );.       
22400 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
22410 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
22420 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
22430 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
22440 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
22450 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
22460 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22470 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
22480 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
22490 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
224a0 65 6c 6c 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  ellKey, 0, 0);. 
224b0 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
224c0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
224d0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65  mpare(nCell, pCe
224e0 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b  llKey, pIdxKey);
224f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
22500 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
22510 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
22520 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
22530 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
22540 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22550 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
22560 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
22570 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
22580 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
22590 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a       lwr = idx;.
225a0 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
225b0 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  lwr - 1;.       
225c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
225d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
225e0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
225f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
22600 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
22610 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
22620 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
22630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22640 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
22650 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
22660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22670 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
22680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22690 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20  ( lwr>upr ){.   
226a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
226b0 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
226c0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
226d0 65 5d 20 3d 20 28 75 31 36 29 28 28 6c 77 72 2b  e] = (u16)((lwr+
226e0 75 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20  upr)/2);.    }. 
226f0 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
22700 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  upr+1 );.    ass
22710 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
22720 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
22730 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
22740 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20     chldPg = 0;. 
22750 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72     }else if( lwr
22760 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
22770 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
22780 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
22790 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
227a0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
227b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
227c0 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
227d0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
227e0 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
227f0 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20    if( chldPg==0 
22800 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
22810 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
22820 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
22830 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22840 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
22850 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a      if( pRes ) *
22860 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
22870 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22880 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
22890 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
228a0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
228b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
228c0 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75  u16)lwr;.    pCu
228d0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
228e0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
228f0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  idNKey = 0;.    
22900 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
22910 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
22920 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
22930 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
22940 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69  .  }.moveto_fini
22950 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  sh:.  return rc;
22960 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
22970 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
22980 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
22990 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
229a0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
229b0 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
229c0 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
229d0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
229e0 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
229f0 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
22a00 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
22a10 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
22a20 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
22a30 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
22a40 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
22a50 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
22a60 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
22a70 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
22a80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
22a90 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
22aa0 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
22ab0 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
22ac0 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
22ad0 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
22ae0 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
22af0 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
22b00 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
22b10 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
22b20 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
22b30 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
22b40 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
22b50 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
22b60 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
22b70 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
22b80 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
22b90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
22ba0 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
22bb0 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
22bc0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
22bd0 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
22be0 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
22bf0 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
22c00 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
22c10 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
22c20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
22c30 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
22c40 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
22c50 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
22c60 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
22c70 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
22c80 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
22c90 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
22ca0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
22cb0 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d  ;.  int idx;.  M
22cc0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
22cd0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
22ce0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
22cf0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
22d00 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
22d10 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
22d20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22d30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
22d40 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  }.  assert( pRes
22d50 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52  !=0 );.  if( CUR
22d60 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
22d70 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
22d80 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
22d90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22da0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
22db0 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20  ->skip>0 ){.    
22dc0 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
22dd0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
22de0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22df0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  _OK;.  }.  pCur-
22e00 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50  >skip = 0;..  pP
22e10 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
22e20 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
22e30 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d  .  idx = ++pCur-
22e40 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
22e50 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
22e60 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
22e70 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 3d 70    assert( idx<=p
22e80 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
22e90 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
22ea0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
22eb0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
22ec0 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
22ed0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
22ee0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
22ef0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
22f00 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
22f10 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
22f20 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
22f30 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
22f40 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
22f50 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  rn rc;.      rc 
22f60 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
22f70 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
22f80 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
22f90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
22fa0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
22fb0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
22fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
22fd0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  s = 1;.        p
22fe0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
22ff0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
23000 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23010 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
23020 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
23030 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70  eeMoveToParent(p
23040 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
23050 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
23060 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
23070 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
23080 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23090 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ge]>=pPage->nCel
230a0 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  l );.    *pRes =
230b0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
230c0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
230d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
230e0 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
230f0 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
23100 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
23110 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
23120 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
23130 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69    *pRes = 0;.  i
23140 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
23150 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
23160 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
23170 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
23180 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  t(pCur);.  retur
23190 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
231a0 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
231b0 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
231c0 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
231d0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
231e0 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
231f0 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
23200 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
23210 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
23220 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
23230 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
23240 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
23250 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
23260 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
23270 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
23280 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
23290 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
232a0 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
232b0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
232c0 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
232d0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
232e0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
232f0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
23300 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
23310 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
23320 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
23330 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
23340 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
23350 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b  Cur->atLast = 0;
23360 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
23370 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
23380 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
23390 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
233a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
233b0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
233c0 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  <0 ){.    pCur->
233d0 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70  skip = 0;.    *p
233e0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
233f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23400 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20   }.  pCur->skip 
23410 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
23420 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23430 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
23440 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
23450 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
23460 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
23470 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
23480 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23490 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  e];.    rc = mov
234a0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
234b0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
234c0 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
234d0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
234e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
234f0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
23500 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
23510 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
23520 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61    while( pCur->a
23530 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
23540 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ]==0 ){.      if
23550 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
23560 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
23570 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
23580 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
23590 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
235a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
235b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
235c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
235d0 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70  eeMoveToParent(p
235e0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
235f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
23600 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
23610 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a  validNKey = 0;..
23620 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
23630 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
23640 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
23650 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23660 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70  Page];.    if( p
23670 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
23680 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
23690 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
236a0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
236b0 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
236c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
236d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
236e0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20    }.  }.  *pRes 
236f0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
23700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
23710 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
23720 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
23730 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
23740 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72   new page is mar
23750 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28  ked as dirty.  (
23760 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
23770 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
23780 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  e().** has alrea
23790 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  dy been called o
237a0 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29  n the new page.)
237b0 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68    The new page h
237c0 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20  as also.** been 
237d0 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74  referenced and t
237e0 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
237f0 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ne is responsibl
23800 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a  e for calling.**
23810 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
23820 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  ef() on the new 
23830 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  page when it is 
23840 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  done..**.** SQLI
23850 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
23860 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41  d on success.  A
23870 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
23880 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a  value indicates.
23890 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70  ** an error.  *p
238a0 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f  pPage and *pPgno
238b0 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69   are undefined i
238c0 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
238d0 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e  n error..** Do n
238e0 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ot invoke sqlite
238f0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
23900 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65   *ppPage if an e
23910 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
23920 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
23930 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
23940 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
23950 20 61 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f   a (feeble) effo
23960 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
23970 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
23980 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
23990 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
239a0 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
239b0 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
239c0 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
239d0 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
239e0 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
239f0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
23a00 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
23a10 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
23a20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
23a30 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
23a40 20 74 68 65 20 22 65 78 61 63 74 22 20 70 61 72   the "exact" par
23a50 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
23a60 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75   and the page-nu
23a70 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 73  mber nearby exis
23a80 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20  ts .** anywhere 
23a90 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
23aa0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
23ab0 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65  renteed to be re
23ac0 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
23ad0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
23ae0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
23af0 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63  bases when alloc
23b00 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  ating a new tabl
23b10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
23b20 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
23b30 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
23b40 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20  pBt, .  MemPage 
23b50 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e  **ppPage, .  Pgn
23b60 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e  o *pPgno, .  Pgn
23b70 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65  o nearby,.  u8 e
23b80 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  xact.){.  MemPag
23b90 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  e *pPage1;.  int
23ba0 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20   rc;.  u32 n;   
23bb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
23bc0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
23bd0 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b  list */.  u32 k;
23be0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23bf0 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20  f leaves on the 
23c00 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65  trunk of the fre
23c10 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  elist */.  MemPa
23c20 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a  ge *pTrunk = 0;.
23c30 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76    MemPage *pPrev
23c40 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e  Trunk = 0;.  Pgn
23c50 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a  o mxPage;     /*
23c60 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74   Total size of t
23c70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23c80 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
23c90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
23ca0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
23cb0 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d  .  pPage1 = pBt-
23cc0 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67  >pPage1;.  mxPag
23cd0 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  e = pagerPagecou
23ce0 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67  nt(pBt);.  n = g
23cf0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
23d00 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69  >aData[36]);.  i
23d10 66 28 20 6e 3e 6d 78 50 61 67 65 20 29 7b 0a 20  f( n>mxPage ){. 
23d20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23d30 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
23d40 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a   }.  if( n>0 ){.
23d50 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
23d60 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
23d70 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f  eelist.  Reuse o
23d80 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
23d90 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  s. */.    Pgno i
23da0 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65  Trunk;.    u8 se
23db0 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
23dc0 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
23dd0 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
23de0 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
23df0 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
23e00 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61  f the 'exact' pa
23e10 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65  rameter was true
23e20 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20   and a query of 
23e30 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
23e40 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61      ** shows tha
23e50 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  t the page 'near
23e60 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65  by' is somewhere
23e70 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
23e80 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  t, then.    ** t
23e90 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77  he entire-list w
23ea0 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20  ill be searched 
23eb0 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20  for that page.. 
23ec0 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
23ed0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
23ee0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61  CUUM.    if( exa
23ef0 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d 78  ct && nearby<=mx
23f00 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 75 38  Page ){.      u8
23f10 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73   eType;.      as
23f20 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29  sert( nearby>0 )
23f30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
23f40 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
23f50 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  );.      rc = pt
23f60 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61  rmapGet(pBt, nea
23f70 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b  rby, &eType, 0);
23f80 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
23f90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
23fa0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
23fb0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
23fc0 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
23fd0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
23fe0 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65       *pPgno = ne
23ff0 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  arby;.    }.#end
24000 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
24010 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
24020 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
24030 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
24040 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
24050 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
24060 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
24070 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
24080 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
24090 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
240a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
240b0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
240c0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
240d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
240e0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
240f0 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
24100 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
24110 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
24120 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
24130 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
24140 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
24150 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
24160 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
24170 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
24180 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
24190 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
241a0 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
241b0 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
241c0 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a  s located..    *
241d0 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
241e0 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
241f0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
24200 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
24210 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
24220 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
24230 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
24240 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24250 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
24260 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
24270 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
24280 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 54    }.      if( iT
24290 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20  runk>mxPage ){. 
242a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
242b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
242c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
242d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
242e0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
242f0 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
24300 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  unk, 0);.      }
24310 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
24320 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
24330 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
24340 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
24350 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  age;.      }..  
24360 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
24370 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
24380 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  4]);.      if( k
24390 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
243a0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
243b0 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
243c0 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
243d0 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
243e0 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
243f0 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
24400 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
24410 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
24420 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
24430 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
24440 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
24450 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24460 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
24470 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
24480 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
24490 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
244a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
244b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
244c0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
244d0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
244e0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
244f0 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
24500 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
24510 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
24520 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
24530 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
24540 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
24550 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
24560 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
24570 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
24580 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
24590 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
245a0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
245b0 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75    }else if( k>(u
245c0 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  32)(pBt->usableS
245d0 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20  ize/4 - 2) ){.  
245e0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
245f0 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
24600 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
24610 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
24620 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24630 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
24640 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
24650 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
24660 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24670 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
24680 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
24690 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72  archList && near
246a0 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20  by==iTrunk ){.  
246b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
246c0 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
246d0 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
246e0 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
246f0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
24700 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
24710 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
24720 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
24730 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
24740 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
24750 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20  no==iTrunk );.  
24760 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
24770 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
24780 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
24790 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
247a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
247b0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
247c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
247d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
247e0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
247f0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
24800 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
24810 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
24820 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
24830 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
24840 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
24850 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
24860 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
24870 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
24880 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
24890 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
248a0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
248b0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
248c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
248d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
248e0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
248f0 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
24900 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
24910 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
24920 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
24930 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
24940 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
24950 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
24960 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
24970 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
24980 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
24990 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
249a0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
249b0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
249c0 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
249d0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
249e0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
249f0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
24a00 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  wTrunk>mxPage ){
24a10 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
24a20 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
24a30 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
24a40 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
24a50 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
24a60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24a70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
24a80 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
24a90 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
24aa0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
24ab0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
24ac0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24ad0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
24ae0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
24af0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24b00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24b10 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54  PagerWrite(pNewT
24b20 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
24b30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
24b40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24b50 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
24b60 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
24b70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
24b80 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
24b90 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
24ba0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
24bb0 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
24bc0 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
24bd0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
24be0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
24bf0 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
24c00 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
24c10 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
24c20 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
24c30 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
24c40 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
24c50 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  *4);.          r
24c60 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
24c70 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
24c80 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
24c90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24ca0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
24cb0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
24cc0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
24cd0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
24ce0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
24cf0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
24d00 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
24d10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24d20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24d30 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
24d40 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
24d50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
24d60 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
24d70 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
24d80 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
24d90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
24da0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
24db0 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
24dc0 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75  Data[0], iNewTru
24dd0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
24de0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24df0 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
24e00 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
24e10 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
24e20 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
24e30 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
24e40 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66  o, n-1));.#endif
24e50 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
24e60 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   k>0 ){.        
24e70 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
24e80 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
24e90 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
24ea0 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
24eb0 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
24ec0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
24ed0 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
24ee0 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
24ef0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
24f00 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
24f10 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
24f20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
24f30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
24f40 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
24f50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24f60 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
24f70 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
24f80 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  i;.          int
24f90 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dist;.         
24fa0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
24fb0 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67          dist = g
24fc0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
24fd0 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
24fe0 20 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c         if( dist<
24ff0 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74  0 ) dist = -dist
25000 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
25010 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
25020 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
25030 64 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  d2 = get4byte(&a
25040 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
25050 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20  earby;.         
25060 20 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32     if( d2<0 ) d2
25070 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20   = -d2;.        
25080 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
25090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
250a0 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
250b0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
250c0 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
250d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
250e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
250f0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
25100 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
25110 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
25120 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
25130 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
25140 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61  .        if( iPa
25150 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  ge>mxPage ){.   
25160 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25170 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25180 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
25190 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
251a0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
251b0 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
251c0 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e  List || iPage==n
251d0 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20  earby ){.       
251e0 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74     int noContent
251f0 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  ;.          Pgno
25200 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   nPage;.        
25210 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
25220 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 50 61 67  ;.          nPag
25230 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  e = pagerPagecou
25240 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  nt(pBt);.       
25250 20 20 20 69 66 28 20 69 50 61 67 65 3e 6e 50 61     if( iPage>nPa
25260 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
25270 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f    /* Free page o
25280 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
25290 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  e file */.      
252a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
252b0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
252c0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
252d0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
252e0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
252f0 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
25300 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
25310 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
25320 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
25340 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
25350 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
25360 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
25370 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
25380 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
25390 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1));.          i
253a0 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
253b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
253c0 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
253d0 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
253e0 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
253f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25400 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
25410 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
25420 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
25430 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
25440 74 65 61 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70  teable(pTrunk->p
25450 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
25460 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
25470 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
25480 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
25490 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
254a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
254b0 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
254c0 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
254d0 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
254e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
254f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
25500 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
25510 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
25520 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
25530 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
25540 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
25550 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
25560 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
25570 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
25580 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
25590 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
255a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
255b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
255c0 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
255d0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
255e0 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
255f0 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
25600 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
25610 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
25620 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
25630 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63  e freelist, so c
25640 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
25650 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65   at the.    ** e
25660 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  nd of the file *
25670 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20  /.    int nPage 
25680 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
25690 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 50 67 6e  (pBt);.    *pPgn
256a0 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a  o = nPage + 1;..
256b0 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d      if( *pPgno==
256c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
256d0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
256e0 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
256f0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
25700 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
25710 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
25720 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
25730 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
25740 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  *pPgno) ){.     
25750 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
25760 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
25770 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
25780 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
25790 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
257a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
257b0 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
257c0 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
257d0 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
257e0 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
257f0 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
25800 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
25810 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
25820 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
25830 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
25840 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52  Pg = 0;.      TR
25850 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
25860 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
25870 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70  ile (pointer-map
25880 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e   page)\n", *pPgn
25890 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  o));.      asser
258a0 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
258b0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
258c0 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
258d0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
258e0 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
258f0 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20   &pPg, 0);.     
25900 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25910 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
25920 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
25930 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67  rite(pPg->pDbPag
25940 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
25950 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20  asePage(pPg);.  
25960 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
25970 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
25980 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b        (*pPgno)++
25990 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67  ;.      if( *pPg
259a0 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
259b0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 28 2a  _PAGE(pBt) ){ (*
259c0 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20  pPgno)++; }.    
259d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73  }.#endif..    as
259e0 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
259f0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
25a00 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  pBt) );.    rc =
25a10 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
25a20 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
25a30 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , ppPage, 0);.  
25a40 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
25a50 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
25a60 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
25a70 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
25a80 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
25a90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
25aa0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
25ab0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  (*ppPage);.    }
25ac0 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
25ad0 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
25ae0 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
25af0 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
25b00 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
25b10 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
25b20 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
25b30 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
25b40 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
25b50 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
25b60 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
25b70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25b80 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73  _OK ){.    if( s
25b90 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
25ba0 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
25bb0 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b  )->pDbPage)>1 ){
25bc0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
25bd0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
25be0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25bf0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
25c00 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67     }.    (*ppPag
25c10 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  e)->isInit = 0;.
25c20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
25c30 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
25c40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25c50 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
25c60 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
25c70 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74   page iPage to t
25c80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25c90 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20   free-list. .** 
25ca0 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
25cb0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
25cc0 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72  ot already a par
25cd0 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69  t of the free-li
25ce0 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  st..**.** The va
25cf0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
25d00 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
25d10 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
25d20 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a  on is optional..
25d30 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  ** If the caller
25d40 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65   happens to have
25d50 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
25d60 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
25d70 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
25d80 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65  ng to page iPage
25d90 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70   handy, it may p
25da0 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65  ass it as the se
25db0 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20  cond value. .** 
25dc0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61  Otherwise, it ma
25dd0 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  y pass NULL..**.
25de0 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20  ** If a pointer 
25df0 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a  to a MemPage obj
25e00 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73  ect is passed as
25e10 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
25e20 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66  ment,.** its ref
25e30 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
25e40 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74  not altered by t
25e50 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
25e60 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
25e70 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a  Page2(BtShared *
25e80 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d  pBt, MemPage *pM
25e90 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61  emPage, Pgno iPa
25ea0 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
25eb0 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  pTrunk = 0;     
25ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
25ed0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
25ee0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72  ge */.  Pgno iTr
25ef0 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
25f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
25f10 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  age number of fr
25f20 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
25f30 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65  ge */ .  MemPage
25f40 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
25f50 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20  pPage1;      /* 
25f60 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20  Local reference 
25f70 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d  to page 1 */.  M
25f80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fa0 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67     /* Page being
25fb0 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e   freed. May be N
25fc0 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ULL. */.  int rc
25fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25ff0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
26000 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
26010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26020 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
26030 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
26040 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f   on free-list */
26050 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
26060 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
26070 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
26080 61 73 73 65 72 74 28 20 69 50 61 67 65 3e 31 20  assert( iPage>1 
26090 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d  );.  assert( !pM
260a0 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61  emPage || pMemPa
260b0 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20  ge->pgno==iPage 
260c0 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61  );..  if( pMemPa
260d0 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20  ge ){.    pPage 
260e0 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20  = pMemPage;.    
260f0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
26100 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
26110 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
26120 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c  age = btreePageL
26130 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65  ookup(pBt, iPage
26140 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63  );.  }..  /* Inc
26150 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
26160 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
26170 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
26180 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
26190 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
261a0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
261b0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
261c0 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  .  nFree = get4b
261d0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
261e0 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62  ta[36]);.  put4b
261f0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
26200 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29  ta[36], nFree+1)
26210 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
26220 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
26230 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54   /* If the SQLIT
26240 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  E_SECURE_DELETE 
26250 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
26260 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
26270 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73  then.  ** always
26280 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
26290 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
262a0 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
262b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 21 70 50  .  */.  if( (!pP
262c0 61 67 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c  age && (rc = sql
262d0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
262e0 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
262f0 61 67 65 2c 20 30 29 29 29 0a 20 20 20 7c 7c 20  age, 0))).   || 
26300 20 20 20 20 20 20 20 20 20 20 20 28 72 63 20 3d             (rc =
26310 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
26320 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
26330 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74  e)).  ){.    got
26340 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
26350 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 50 61    }.  memset(pPa
26360 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
26370 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
26380 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ze);.#endif..  /
26390 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
263a0 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
263b0 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
263c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
263d0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
263e0 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
263f0 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
26400 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
26410 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
26420 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
26430 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  pBt, iPage, PTRM
26440 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b  AP_FREEPAGE, 0);
26450 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
26460 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
26470 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d  .  }..  /* Now m
26480 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63  anipulate the ac
26490 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72  tual database fr
264a0 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72  ee-list structur
264b0 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  e. There are two
264c0 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74  .  ** possibilit
264d0 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65  ies. If the free
264e0 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74  -list is current
264f0 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20  ly empty, or if 
26500 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
26510 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
26520 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
26530 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ll, then this pa
26540 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  ge will become a
26550 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c  .  ** new free-l
26560 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
26570 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  Otherwise, it wi
26580 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66  ll become a leaf
26590 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   of the.  ** fir
265a0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
265b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65   the current fre
265c0 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f  e-list. This blo
265d0 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20  ck tests if it. 
265e0 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
265f0 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  to add the page 
26600 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69  as a new free-li
26610 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20  st leaf..  */.  
26620 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a  if( nFree!=0 ){.
26630 20 20 20 20 69 6e 74 20 6e 4c 65 61 66 3b 20 20      int nLeaf;  
26640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26650 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
26660 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e  of leaf cells on
26670 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a   trunk page */..
26680 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
26690 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
266a0 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72  Data[32]);.    r
266b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
266c0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
266d0 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
266e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
266f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26700 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
26710 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  ut;.    }..    n
26720 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28  Leaf = get4byte(
26730 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
26740 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61  ]);.    if( nLea
26750 66 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  f<0 ){.      rc 
26760 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
26770 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
26780 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
26790 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c      }.    if( nL
267a0 65 61 66 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53  eaf<pBt->usableS
267b0 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
267c0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
267d0 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
267e0 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
267f0 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
26800 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
26810 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
26820 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
26830 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
26840 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
26850 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
26860 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
26870 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
26880 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
26890 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
268a0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
268b0 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
268c0 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
268d0 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
268e0 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
268f0 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
26900 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
26910 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
26920 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
26930 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
26940 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
26950 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
26960 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
26970 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
26980 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
26990 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
269a0 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
269b0 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
269c0 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
269d0 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
269e0 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
269f0 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 61  ** we will conta
26a00 69 6e 20 74 6f 20 72 65 73 74 72 69 63 74 20 74  in to restrict t
26a10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
26a20 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69  ries to usableSi
26a30 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a  ze/4 - 8.      *
26a40 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73  * for now.  At s
26a50 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
26a60 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76   future (once ev
26a70 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61  eryone has upgra
26a80 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ded.      ** to 
26a90 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20  3.6.0 or later) 
26aa0 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64  we should consid
26ab0 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f  er fixing the co
26ac0 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a  nditional above.
26ad0 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64        ** to read
26ae0 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32   "usableSize/4-2
26af0 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73  " instead of "us
26b00 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20  ableSize/4-8".. 
26b10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
26b20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26b30 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
26b40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
26b50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26b60 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
26b70 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
26b80 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a  a[4], nLeaf+1);.
26b90 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
26ba0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
26bb0 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67  8+nLeaf*4], iPag
26bc0 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
26bd0 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
26be0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
26bf0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
26c00 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
26c10 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
26c20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
26c30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
26c40 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73  rc = btreeSetHas
26c50 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61  Content(pBt, iPa
26c60 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
26c70 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
26c80 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e  PAGE: %d leaf on
26c90 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e   trunk page %d\n
26ca0 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54  ",pPage->pgno,pT
26cb0 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
26cc0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
26cd0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
26ce0 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
26cf0 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20  l flows to this 
26d00 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77  point, then it w
26d10 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
26d20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20  to add the.  ** 
26d30 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
26d40 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70  reed as a leaf p
26d50 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  age of the first
26d60 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
26d70 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f  ee-list..  ** Po
26d80 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
26d90 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
26da0 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62  empty, or possib
26db0 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a  ly because the .
26dc0 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
26dd0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
26de0 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65  t is full. Eithe
26df0 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20  r way, the page 
26e00 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a  being freed.  **
26e10 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
26e20 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b   new first trunk
26e30 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
26e40 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e-list..  */.  i
26e50 66 28 20 20 20 28 28 21 70 50 61 67 65 29 20 26  f(   ((!pPage) &
26e60 26 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  & (0 != (rc = sq
26e70 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
26e80 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
26e90 50 61 67 65 2c 20 30 29 29 29 29 0a 20 20 20 20  Page, 0)))).    
26ea0 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
26eb0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
26ec0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
26ed0 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74  ))).  ){.    got
26ee0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
26ef0 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70    }.  put4byte(p
26f00 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72  Page->aData, iTr
26f10 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65  unk);.  put4byte
26f20 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34  (&pPage->aData[4
26f30 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74  ], 0);.  put4byt
26f40 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
26f50 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  [32], iPage);.  
26f60 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
26f70 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20  E: %d new trunk 
26f80 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25  page replacing %
26f90 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
26fa0 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72  o, iTrunk));..fr
26fb0 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  eepage_out:.  if
26fc0 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70  ( pPage ){.    p
26fd0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
26fe0 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
26ff0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
27000 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
27010 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
27020 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  }.static int fre
27030 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
27040 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
27050 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
27060 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
27070 67 65 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  ge->pgno);.}../*
27080 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65  .** Free any ove
27090 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
270a0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
270b0 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73  given Cell..*/.s
270c0 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43  tatic int clearC
270d0 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
270e0 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ge, unsigned cha
270f0 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53  r *pCell){.  BtS
27100 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
27110 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49  ge->pBt;.  CellI
27120 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f  nfo info;.  Pgno
27130 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74   ovflPgno;.  int
27140 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c   rc;.  int nOvfl
27150 3b 0a 20 20 75 31 36 20 6f 76 66 6c 50 61 67 65  ;.  u16 ovflPage
27160 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
27170 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
27180 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
27190 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
271a0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
271b0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
271c0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
271d0 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d   info.iOverflow=
271e0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
271f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
27200 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
27210 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
27220 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
27230 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67   */.  }.  ovflPg
27240 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
27250 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
27260 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  low]);.  assert(
27270 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
27280 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61   > 4 );.  ovflPa
27290 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
272a0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
272b0 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50  nOvfl = (info.nP
272c0 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c  ayload - info.nL
272d0 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
272e0 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
272f0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
27300 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
27310 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69  nOvfl>0 );.  whi
27320 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
27330 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20     Pgno iNext = 
27340 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  0;.    MemPage *
27350 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69  pOvfl = 0;.    i
27360 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c  f( ovflPgno<2 ||
27370 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50   ovflPgno>pagerP
27380 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
27390 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e  .      /* 0 is n
273a0 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20  ot a legal page 
273b0 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
273c0 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a  1 cannot be an .
273d0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
273e0 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72  w page. Therefor
273f0 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20  e if ovflPgno<2 
27400 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  or past the end 
27410 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
27420 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61   file the databa
27430 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
27440 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  pt. */.      ret
27450 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
27460 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
27470 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a     if( nOvfl ){.
27480 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
27490 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
274a0 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
274b0 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20  , &iNext);.     
274c0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
274d0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
274e0 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42  c = freePage2(pB
274f0 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67  t, pOvfl, ovflPg
27500 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 76  no);.    if( pOv
27510 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  fl ){.      sqli
27520 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
27530 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  vfl->pDbPage);. 
27540 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
27550 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
27560 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78   ovflPgno = iNex
27570 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
27580 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
27590 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
275a0 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
275b0 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
275c0 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
275d0 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
275e0 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
275f0 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
27600 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
27610 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
27620 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
27630 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
27640 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
27650 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
27660 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
27670 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
27680 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
27690 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
276a0 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
276b0 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
276c0 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
276d0 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
276e0 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
276f0 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
27700 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
27710 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
27720 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
27730 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
27740 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
27750 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
27760 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
27770 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
27780 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
27790 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
277a0 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
277b0 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
277c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
277d0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
277e0 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
277f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
27800 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
27810 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
27820 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
27830 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
27840 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
27850 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
27860 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
27870 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  ta,int nData,   
27880 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
27890 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
278a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278b0 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79  /* Extra zero by
278c0 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
278d0 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20   pData */.  int 
278e0 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
278f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
27900 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
27910 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
27920 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
27930 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
27940 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20   nSrc, n, rc;.  
27950 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  int spaceLeft;. 
27960 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
27970 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
27980 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a  pToRelease = 0;.
27990 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
279a0 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
279b0 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
279c0 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
279d0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
279e0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66  ;.  Pgno pgnoOvf
279f0 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65  l = 0;.  int nHe
27a00 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ader;.  CellInfo
27a10 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74   info;..  assert
27a20 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
27a30 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
27a40 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
27a50 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65   pPage is not ne
27a60 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61  cessarily writea
27a70 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20  ble since pCell 
27a80 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61  might be auxilia
27a90 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73  ry.  ** buffer s
27aa0 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70  pace that is sep
27ab0 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70  arate from the p
27ac0 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61  Page buffer area
27ad0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
27ae0 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ell<pPage->aData
27af0 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67   || pCell>=&pPag
27b00 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
27b10 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
27b20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
27b30 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
27b40 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
27b50 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
27b60 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
27b70 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20   nHeader = 0;.  
27b80 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
27b90 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
27ba0 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20  += 4;.  }.  if( 
27bb0 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
27bc0 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
27bd0 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
27be0 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74  l[nHeader], nDat
27bf0 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73  a+nZero);.  }els
27c00 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e  e{.    nData = n
27c10 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Zero = 0;.  }.  
27c20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
27c30 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
27c40 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b  der], *(u64*)&nK
27c50 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ey);.  sqlite3Bt
27c60 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
27c70 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
27c80 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
27c90 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48  info.nHeader==nH
27ca0 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72  eader );.  asser
27cb0 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b  t( info.nKey==nK
27cc0 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
27cd0 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32  info.nData==(u32
27ce0 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29  )(nData+nZero) )
27cf0 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
27d00 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
27d10 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44  .  nPayload = nD
27d20 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69  ata + nZero;.  i
27d30 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
27d40 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70   ){.    pSrc = p
27d50 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
27d60 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74   nData;.    nDat
27d70 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20  a = 0;.  }else{ 
27d80 0a 20 20 20 20 69 66 28 20 6e 4b 65 79 3e 30 78  .    if( nKey>0x
27d90 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79  7fffffff || pKey
27da0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
27db0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
27dc0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  PT;.    }.    nP
27dd0 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e  ayload += (int)n
27de0 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  Key;.    pSrc = 
27df0 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d  pKey;.    nSrc =
27e00 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a   (int)nKey;.  }.
27e10 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f    *pnSize = info
27e20 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c  .nSize;.  spaceL
27e30 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  eft = info.nLoca
27e40 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20  l;.  pPayload = 
27e50 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
27e60 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65  .  pPrior = &pCe
27e70 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
27e80 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50  w];..  while( nP
27e90 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
27ea0 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
27eb0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
27ec0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
27ed0 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
27ee0 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
27ef0 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
27f00 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
27f10 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
27f20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
27f30 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
27f40 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
27f50 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
27f60 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
27f70 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
27f80 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
27f90 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
27fa0 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
27fb0 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
27fc0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
27fd0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
27fe0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
27ff0 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
28000 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
28010 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65  Ovfl, 0);.#ifnde
28020 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
28030 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
28040 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
28050 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
28060 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20  vacuum, and the 
28070 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
28080 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76  uent.      ** ov
28090 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62  erflow page is b
280a0 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20  eing allocated, 
280b0 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  add an entry to 
280c0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
280d0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61        ** for tha
280e0 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20  t page now. .   
280f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
28100 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
28110 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
28120 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
28130 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20  partial entry . 
28140 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70       ** to the p
28150 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77  ointer-map. If w
28160 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20  e write nothing 
28170 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d  to this pointer-
28180 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20  map slot,.      
28190 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69  ** then the opti
281a0 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20  mistic overflow 
281b0 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  chain processing
281c0 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a   in clearCell().
281d0 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73        ** may mis
281e0 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e  interpret the un
281f0 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75  initialised valu
28200 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  es and delete th
28210 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67  e.      ** wrong
28220 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
28230 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
28240 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
28250 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
28260 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28270 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
28280 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f  e = (pgnoPtrmap?
28290 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
282a0 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  :PTRMAP_OVERFLOW
282b0 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  1);.        rc =
282c0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
282d0 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c  pgnoOvfl, eType,
282e0 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20   pgnoPtrmap);.  
282f0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
28300 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
28310 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
28320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28330 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
28340 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
28350 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
28360 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  lease);.        
28370 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28380 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
28390 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
283a0 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69  t zero than pPri
283b0 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  or points into t
283c0 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
283d0 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
283e0 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
283f0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
28400 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
28410 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
28420 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
28430 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
28440 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
28450 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
28460 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50  ..      /* If pP
28470 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20  rior is part of 
28480 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
28490 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
284a0 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
284b0 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
284c0 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
284d0 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
284e0 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
284f0 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d   pPrior>=&pPage-
28500 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
28510 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
28520 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
28530 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
28540 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
28550 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
28560 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
28570 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
28580 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
28590 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
285a0 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
285b0 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
285c0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
285d0 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
285e0 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
285f0 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
28600 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
28610 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
28620 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
28630 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
28640 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
28650 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
28660 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20  spaceLeft;..    
28670 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
28680 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
28690 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74  n pPayload point
286a0 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
286b0 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70  area.    ** of p
286c0 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
286d0 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
286e0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
286f0 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ble. */.    asse
28700 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
28710 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
28720 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
28730 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
28740 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ) );..    /* If 
28750 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74  pPayload is part
28760 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
28770 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
28780 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
28790 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
287a0 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
287b0 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f    assert( pPaylo
287c0 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ad<pPage->aData 
287d0 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50  || pPayload>=&pP
287e0 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
287f0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
28800 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
28810 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
28820 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
28830 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72   );..    if( nSr
28840 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  c>0 ){.      if(
28850 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
28860 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
28870 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ( pSrc );.      
28880 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
28890 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
288a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
288b0 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
288c0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
288d0 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
288e0 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
288f0 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
28900 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
28910 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
28920 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
28930 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
28940 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
28950 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
28960 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
28970 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
28980 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
28990 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
289a0 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
289b0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
289c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
289d0 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
289e0 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
289f0 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
28a00 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
28a10 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
28a20 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
28a30 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
28a40 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
28a50 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
28a60 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
28a70 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
28a80 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
28a90 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
28aa0 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
28ab0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
28ac0 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
28ad0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
28ae0 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67   dropCell(MemPag
28af0 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64  e *pPage, int id
28b00 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e  x, int sz){.  in
28b10 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  t i;          /*
28b20 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
28b30 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
28b40 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
28b50 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
28b60 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
28b70 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
28b80 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
28b90 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
28ba0 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
28bb0 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
28bc0 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
28bd0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
28be0 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
28bf0 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
28c00 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
28c10 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
28c20 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
28c30 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
28c40 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
28c50 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
28c60 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
28c70 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
28c80 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
28c90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
28ca0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
28cb0 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61  mutex) );.  data
28cc0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
28cd0 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70  .  ptr = &data[p
28ce0 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
28cf0 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20   + 2*idx];.  pc 
28d00 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
28d10 0a 20 20 69 66 28 20 28 70 63 3c 70 50 61 67 65  .  if( (pc<pPage
28d20 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70  ->hdrOffset+6+(p
28d30 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 29  Page->leaf?0:4))
28d40 0a 20 20 20 20 20 7c 7c 20 28 70 63 2b 73 7a 3e  .     || (pc+sz>
28d50 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
28d60 6c 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 72  leSize) ){.    r
28d70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
28d80 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
28d90 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28   rc = freeSpace(
28da0 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a  pPage, pc, sz);.
28db0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28dc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
28dd0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  n rc;.  }.  for(
28de0 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65  i=idx+1; i<pPage
28df0 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74  ->nCell; i++, pt
28e00 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30  r+=2){.    ptr[0
28e10 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20  ] = ptr[2];.    
28e20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b  ptr[1] = ptr[3];
28e30 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43  .  }.  pPage->nC
28e40 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74  ell--;.  put2byt
28e50 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68  e(&data[pPage->h
28e60 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61  drOffset+3], pPa
28e70 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50  ge->nCell);.  pP
28e80 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
28e90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
28ea0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
28eb0 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
28ec0 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
28ed0 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
28ee0 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
28ef0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
28f00 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
28f10 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
28f20 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
28f30 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
28f40 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
28f50 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
28f60 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
28f70 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
28f80 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
28f90 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
28fa0 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
28fb0 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
28fc0 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
28fd0 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
28fe0 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64  age->aOvfl[] and
28ff0 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
29000 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
29010 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
29020 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
29030 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
29040 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
29050 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
29060 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
29070 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
29080 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
29090 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
290a0 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
290b0 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mented..**.** If
290c0 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
290d0 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ro, then do not 
290e0 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e  copy the first n
290f0 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68  Skip bytes of th
29100 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63  e.** cell. The c
29110 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77  aller will overw
29120 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20  rite them after 
29130 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
29140 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b  turns. If.** nSk
29150 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
29160 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e  then pCell may n
29170 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69  ot point to an i
29180 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f  nvalid memory lo
29190 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20  cation .** (but 
291a0 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61  pCell+nSkip is a
291b0 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f  lways valid)..*/
291c0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65  .static int inse
291d0 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
291e0 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
291f0 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
29200 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
29210 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
29220 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
29230 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
29240 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
29250 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
29260 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
29270 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
29280 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
29290 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
292a0 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
292b0 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
292c0 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
292d0 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
292e0 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
292f0 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
29300 50 67 6e 6f 20 69 43 68 69 6c 64 20 20 20 20 20  Pgno iChild     
29310 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
29320 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20  , replace first 
29330 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69  4 bytes with thi
29340 73 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20  s value */.){.  
29350 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20  int idx;        
29360 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
29370 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
29380 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
29390 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
293a0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
293b0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74  unter */.  int t
293c0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
293d0 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f  First byte of co
293e0 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65  ntent for any ce
293f0 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ll in data[] */.
29400 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20    int end;      
29410 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
29420 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  e past the last 
29430 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
29440 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
29450 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ins;          /*
29460 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d   Index in data[]
29470 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20   where new cell 
29480 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72  pointer is inser
29490 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ted */.  int hdr
294a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
294b0 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d  fset into data[]
294c0 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65 61   of the page hea
294d0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  der */.  int cel
294e0 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64  lOffset;   /* Ad
294f0 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63  dress of first c
29500 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
29510 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
29520 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
29530 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
29540 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
29550 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
29560 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72       /* Used for
29570 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74   moving informat
29580 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61  ion around in da
29590 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  ta[] */..  int n
295a0 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f  Skip = (iChild ?
295b0 20 34 20 3a 20 30 29 3b 0a 0a 20 20 61 73 73 65   4 : 0);..  asse
295c0 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
295d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
295e0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
295f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
29600 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28  >nCell<=MX_CELL(
29610 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d  pPage->pBt) && M
29620 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
29630 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73  t)<=5460 );.  as
29640 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
29650 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a  erflow<=ArraySiz
29660 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20  e(pPage->aOvfl) 
29670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
29680 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
29690 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  ge, pCell) );.  
296a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
296b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
296c0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
296d0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  .  if( pPage->nO
296e0 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e  verflow || sz+2>
296f0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
29700 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b      if( pTemp ){
29710 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
29720 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c  emp+nSkip, pCell
29730 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
29740 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
29750 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20   pTemp;.    }.  
29760 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
29770 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
29780 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20  Cell, iChild);. 
29790 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61     }.    j = pPa
297a0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b  ge->nOverflow++;
297b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28  .    assert( j<(
297c0 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67  int)(sizeof(pPag
297d0 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66  e->aOvfl)/sizeof
297e0 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d  (pPage->aOvfl[0]
297f0 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  )) );.    pPage-
29800 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20  >aOvfl[j].pCell 
29810 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61  = pCell;.    pPa
29820 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78  ge->aOvfl[j].idx
29830 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c   = (u16)i;.  }el
29840 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  se{.    int rc =
29850 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
29860 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
29870 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
29880 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29890 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
298a0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
298b0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
298c0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
298d0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64  DbPage) );.    d
298e0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
298f0 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20 70 50  ta;.    hdr = pP
29900 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
29910 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
29920 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
29930 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74  ;.    cellOffset
29940 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
29950 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20  fset;.    end = 
29960 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
29970 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b  Page->nCell + 2;
29980 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f  .    ins = cellO
29990 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20  ffset + 2*i;.   
299a0 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d   if( end > top -
299b0 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 72 63 20   sz ){.      rc 
299c0 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
299d0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  (pPage);.      i
299e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
299f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
29a00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
29a10 20 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62       top = get2b
29a20 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
29a30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29a40 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70   end + sz <= top
29a50 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64   );.    }.    id
29a60 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  x = allocateSpac
29a70 65 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20  e(pPage, sz);.  
29a80 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 30 20    assert( idx>0 
29a90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  );.    assert( e
29aa0 6e 64 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26  nd <= get2byte(&
29ab0 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a  data[hdr+5]) );.
29ac0 20 20 20 20 69 66 20 28 69 64 78 2b 73 7a 20 3e      if (idx+sz >
29ad0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
29ae0 62 6c 65 53 69 7a 65 29 20 7b 0a 20 20 20 20 20  bleSize) {.     
29af0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
29b00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
29b10 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43   }.    pPage->nC
29b20 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65  ell++;.    pPage
29b30 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d  ->nFree = pPage-
29b40 3e 6e 46 72 65 65 20 2d 20 28 75 31 36 29 28 32  >nFree - (u16)(2
29b50 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63   + sz);.    memc
29b60 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b  py(&data[idx+nSk
29b70 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  ip], pCell+nSkip
29b80 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
29b90 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
29ba0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64       put4byte(&d
29bb0 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64  ata[idx], iChild
29bc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
29bd0 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64  (j=end-2, ptr=&d
29be0 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a  ata[j]; j>ins; j
29bf0 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20  -=2, ptr-=2){.  
29c00 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
29c10 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b  [-2];.      ptr[
29c20 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20  1] = ptr[-1];.  
29c30 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65    }.    put2byte
29c40 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78  (&data[ins], idx
29c50 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
29c60 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
29c70 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66  age->nCell);.#if
29c80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29c90 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
29ca0 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
29cb0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
29cc0 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
29cd0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
29ce0 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
29cf0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
29d00 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
29d10 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
29d20 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
29d30 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
29d40 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
29d50 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 74 72        return ptr
29d60 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
29d70 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
29d80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
29d90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29da0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
29db0 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20  a list of cells 
29dc0 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  to a page.  The 
29dd0 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69  page should be i
29de0 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a  nitially empty..
29df0 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65  ** The cells are
29e00 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66   guaranteed to f
29e10 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  it on the page..
29e20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
29e30 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d  ssemblePage(.  M
29e40 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
29e50 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
29e60 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f  be assemblied */
29e70 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
29e80 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
29e90 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
29ea0 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20  dd to this page 
29eb0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
29ec0 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
29ed0 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65  rs to cell bodie
29ee0 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a  s */.  u16 *aSiz
29ef0 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  e        /* Size
29f00 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a  s of the cells *
29f10 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
29f20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
29f30 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
29f40 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20   *pCellptr;     
29f50 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
29f60 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  xt cell pointer 
29f70 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64  */.  int cellbod
29f80 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  y;     /* Addres
29f90 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62  s of next cell b
29fa0 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  ody */.  u8 * co
29fb0 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
29fc0 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20  ->aData;        
29fd0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
29fe0 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  to data for pPag
29ff0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
2a000 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
2a010 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
2a020 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
2a030 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20  header on pPage 
2a040 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  */.  const int n
2a050 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e  Usable = pPage->
2a060 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
2a070 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
2a080 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73  of page */..  as
2a090 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2a0a0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
2a0b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2a0c0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2a0d0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2a0e0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e    assert( nCell>
2a0f0 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f  =0 && nCell<=MX_
2a100 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2a110 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
2a120 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b  e->pBt)<=5460 );
2a130 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2a140 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2a150 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2a160 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  e) );..  /* Chec
2a170 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
2a180 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a 65  has just been ze
2a190 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67 65  roed by zeroPage
2a1a0 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  () */.  assert( 
2a1b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2a1c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65 74  );.  assert( get
2a1d0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2a1e0 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a  5])==nUsable );.
2a1f0 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 64  .  pCellptr = &d
2a200 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
2a210 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d  ffset + nCell*2]
2a220 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e  ;.  cellbody = n
2a230 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d  Usable;.  for(i=
2a240 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69  nCell-1; i>=0; i
2a250 2d 2d 29 7b 0a 20 20 20 20 70 43 65 6c 6c 70 74  --){.    pCellpt
2a260 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c  r -= 2;.    cell
2a270 62 6f 64 79 20 2d 3d 20 61 53 69 7a 65 5b 69 5d  body -= aSize[i]
2a280 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
2a290 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64  Cellptr, cellbod
2a2a0 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  y);.    memcpy(&
2a2b0 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20  data[cellbody], 
2a2c0 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65  apCell[i], aSize
2a2d0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32  [i]);.  }.  put2
2a2e0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
2a2f0 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74  ], nCell);.  put
2a300 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2a310 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  5], cellbody);. 
2a320 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
2a330 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61   (nCell*2 + nUsa
2a340 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b  ble - cellbody);
2a350 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
2a360 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a  = (u16)nCell;.}.
2a370 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2a380 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  wing parameters 
2a390 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61  determine how ma
2a3a0 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65  ny adjacent page
2a3b0 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a  s get involved.*
2a3c0 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67  * in a balancing
2a3d0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20   operation.  NN 
2a3e0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2a3f0 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
2a400 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20  ther side.** of 
2a410 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61  the page that pa
2a420 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
2a430 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
2a440 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65  tion.  NB is the
2a450 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  .** total number
2a460 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70   of pages that p
2a470 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c  articipate, incl
2a480 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74  uding the target
2a490 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20   page and.** NN 
2a4a0 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
2a4b0 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20  her side..**.** 
2a4c0 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  The minimum valu
2a4d0 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66  e of NN is 1 (of
2a4e0 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65   course).  Incre
2a4f0 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31  asing NN above 1
2a500 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20  .** (to 2 or 3) 
2a510 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69  gives a modest i
2a520 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45  mprovement in SE
2a530 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20  LECT and DELETE 
2a540 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
2a550 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61  n exchange for a
2a560 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74   larger degradat
2a570 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e  ion in INSERT an
2a580 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d  d UPDATE perform
2a590 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  ance..** The val
2a5a0 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73  ue of NN appears
2a5b0 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73   to give the bes
2a5c0 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c  t results overal
2a5d0 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e  l..*/.#define NN
2a5e0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   1             /
2a5f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  * Number of neig
2a600 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
2a610 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  side of pPage */
2a620 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a  .#define NB (NN*
2a630 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74  2+1)      /* Tot
2a640 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65  al pages involve
2a650 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65  d in the balance
2a660 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51   */...#ifndef SQ
2a670 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
2a680 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  ALANCE./*.** Thi
2a690 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c  s version of bal
2a6a0 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74  ance() handles t
2a6b0 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61  he common specia
2a6c0 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  l case where.** 
2a6d0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62  a new entry is b
2a6e0 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e  eing inserted on
2a6f0 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
2a700 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  ht-end of the.**
2a710 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20   tree, in other 
2a720 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20  words, when the 
2a730 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  new entry will b
2a740 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73  ecome the larges
2a750 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68  t.** entry in th
2a760 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  e tree..**.** In
2a770 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20  stead of trying 
2a780 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69  balance the 3 ri
2a790 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61  ght-most leaf pa
2a7a0 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a  ges, just add.**
2a7b0 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
2a7c0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
2a7d0 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f  de and put the o
2a7e0 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a  ne new entry in.
2a7f0 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  ** that page.  T
2a800 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72  his leaves the r
2a810 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65  ight side of the
2a820 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a   tree somewhat.*
2a830 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42  * unbalanced.  B
2a840 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74  ut odds are that
2a850 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65   we will be inse
2a860 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65  rting new entrie
2a870 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
2a880 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20  soon afterwards 
2a890 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d  so the nearly em
2a8a0 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75  pty page will qu
2a8b0 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70  ickly.** fill up
2a8c0 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a  .  On average..*
2a8d0 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68  *.** pPage is th
2a8e0 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  e leaf page whic
2a8f0 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  h is the right-m
2a900 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ost page in the 
2a910 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74  tree..** pParent
2a920 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20   is its parent. 
2a930 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65   pPage must have
2a940 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c   a single overfl
2a950 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63  ow entry.** whic
2a960 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69  h is also the ri
2a970 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f  ght-most entry o
2a980 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
2a990 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66  * The pSpace buf
2a9a0 66 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 73  fer is used to s
2a9b0 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79  tore a temporary
2a9c0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76   copy of the div
2a9d0 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61  ider.** cell tha
2a9e0 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  t will be insert
2a9f0 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  ed into pParent.
2aa00 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e   Such a cell con
2aa10 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20  sists of a 4.** 
2aa20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
2aa30 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76   followed by a v
2aa40 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
2aa50 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72  nteger. In other
2aa60 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f  .** words, at mo
2aa70 73 74 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e  st 13 bytes. Hen
2aa80 63 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75  ce the pSpace bu
2aa90 66 66 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a  ffer must be at.
2aaa0 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74 65  ** least 13 byte
2aab0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
2aac0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2aad0 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a  _quick(MemPage *
2aae0 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65  pParent, MemPage
2aaf0 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70   *pPage, u8 *pSp
2ab00 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ace){.  BtShared
2ab10 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50   *const pBt = pP
2ab20 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20  age->pBt;    /* 
2ab30 42 2d 54 72 65 65 20 44 61 74 61 62 61 73 65 20  B-Tree Database 
2ab40 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  */.  MemPage *pN
2ab50 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
2ab60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2ab70 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ly allocated pag
2ab80 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
2ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2abb0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
2abc0 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20  Pgno pgnoNew;   
2abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abe0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2abf0 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a  ber of pNew */..
2ac00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2ac10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2ac20 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2ac30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2ac40 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2ac50 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
2ac60 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
2ac70 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2ac80 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 69 66  flow==1 );..  if
2ac90 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d  ( pPage->nCell<=
2aca0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2acb0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2acc0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
2acd0 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73 20   new page. This 
2ace0 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
2acf0 20 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69   the right-sibli
2ad00 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67  ng of .  ** pPag
2ad10 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65  e. Make the pare
2ad20 6e 74 20 70 61 67 65 20 77 72 69 74 61 62 6c 65  nt page writable
2ad30 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  , so that the ne
2ad40 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20  w divider cell. 
2ad50 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72   ** may be inser
2ad60 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65  ted. If both the
2ad70 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  se operations ar
2ad80 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72  e successful, pr
2ad90 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63  oceed..  */.  rc
2ada0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2adb0 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
2adc0 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29   &pgnoNew, 0, 0)
2add0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
2ade0 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75  ITE_OK ){..    u
2adf0 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63  8 *pOut = &pSpac
2ae00 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43  e[4];.    u8 *pC
2ae10 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76  ell = pPage->aOv
2ae20 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20  fl[0].pCell;.   
2ae30 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65   u16 szCell = ce
2ae40 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2ae50 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20   pCell);.    u8 
2ae60 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73  *pStop;..    ass
2ae70 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2ae80 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65  rIswriteable(pNe
2ae90 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  w->pDbPage) );. 
2aea0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2aeb0 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46  ->aData[0]==(PTF
2aec0 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
2aed0 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29  DATA|PTF_LEAF) )
2aee0 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
2aef0 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  New, PTF_INTKEY|
2af00 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
2af10 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65  _LEAF);.    asse
2af20 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31  mblePage(pNew, 1
2af30 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c  , &pCell, &szCel
2af40 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  l);..    /* If t
2af50 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
2af60 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
2af70 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
2af80 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69  er map.    ** wi
2af90 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  th entries for t
2afa0 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64  he new page, and
2afb0 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f   any pointer fro
2afc0 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65  m the .    ** ce
2afd0 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ll on the page t
2afe0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
2aff0 67 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66  ge. If either of
2b000 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70   these.    ** op
2b010 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20  erations fails, 
2b020 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
2b030 69 73 20 73 65 74 2c 20 62 75 74 20 74 68 65 20  is set, but the 
2b040 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20  contents.    ** 
2b050 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  of the parent pa
2b060 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e  ge are still man
2b070 69 70 75 6c 61 74 65 64 20 62 79 20 74 68 68 20  ipulated by thh 
2b080 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20  code below..    
2b090 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61  ** That is Ok, a
2b0a0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
2b0b0 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20   parent page is 
2b0c0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20  guaranteed to.  
2b0d0 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61    ** be marked a
2b0e0 73 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69  s dirty. Returni
2b0f0 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
2b100 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20   will cause a.  
2b110 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75    ** rollback, u
2b120 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67  ndoing any chang
2b130 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70  es made to the p
2b140 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
2b150 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
2b160 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2b170 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2b180 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54  pBt, pgnoNew, PT
2b190 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
2b1a0 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ent->pgno);.    
2b1b0 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65    if( szCell>pNe
2b1c0 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 26 26 20 72  w->minLocal && r
2b1d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b1e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
2b1f0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e  mapPutOvflPtr(pN
2b200 65 77 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ew, pCell);.    
2b210 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
2b220 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69 76   /* Create a div
2b230 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73  ider cell to ins
2b240 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ert into pParent
2b250 2e 20 54 68 65 20 64 69 76 69 64 65 72 20 63 65  . The divider ce
2b260 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  ll.    ** consis
2b270 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70  ts of a 4-byte p
2b280 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20  age number (the 
2b290 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  page number of p
2b2a0 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a  Page) and.    **
2b2b0 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
2b2c0 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68  th key value (wh
2b2d0 69 63 68 20 6d 75 73 74 20 62 65 20 74 68 65 20  ich must be the 
2b2e0 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68  same value as th
2b2f0 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74  e.    ** largest
2b300 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a   key on pPage)..
2b310 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f      **.    ** To
2b320 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73   find the larges
2b330 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70  t key value on p
2b340 50 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64  Page, first find
2b350 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2b360 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
2b370 70 50 61 67 65 2e 20 54 68 65 20 66 69 72 73 74  pPage. The first
2b380 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74   two fields of t
2b390 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65  his cell are the
2b3a0 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d   .    ** record-
2b3b0 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69 61 62  length (a variab
2b3c0 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
2b3d0 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74  r at most 32-bit
2b3e0 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a  s in size).    *
2b3f0 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61  * and the key va
2b400 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c 65 20  lue (a variable 
2b410 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20  length integer, 
2b420 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c  may have any val
2b430 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ue)..    ** The 
2b440 66 69 72 73 74 20 6f 66 20 74 68 65 20 77 68 69  first of the whi
2b450 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65  le(...) loops be
2b460 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74  low skips over t
2b470 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68  he record-length
2b480 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54  .    ** field. T
2b490 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28  he second while(
2b4a0 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73  ...) loop copies
2b4b0 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66   the key value f
2b4c0 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  rom the.    ** c
2b4d0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74  ell on pPage int
2b4e0 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
2b4f0 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  fer..    */.    
2b500 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2b510 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e  (pPage, pPage->n
2b520 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74  Cell-1);.    pSt
2b530 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a  op = &pCell[9];.
2b540 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43      while( (*(pC
2b550 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20  ell++)&0x80) && 
2b560 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20  pCell<pStop );. 
2b570 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c     pStop = &pCel
2b580 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[9];.    while(
2b590 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a   ((*(pOut++) = *
2b5a0 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29  (pCell++))&0x80)
2b5b0 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
2b5c0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  );..    /* Inser
2b5d0 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
2b5e0 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72  r cell into pPar
2b5f0 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65  ent. */.    inse
2b600 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70  rtCell(pParent,p
2b610 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 70 53  Parent->nCell,pS
2b620 70 61 63 65 2c 28 69 6e 74 29 28 70 4f 75 74 2d  pace,(int)(pOut-
2b630 70 53 70 61 63 65 29 2c 30 2c 70 50 61 67 65 2d  pSpace),0,pPage-
2b640 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 2f 2a 20  >pgno);..    /* 
2b650 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68  Set the right-ch
2b660 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70  ild pointer of p
2b670 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20  Parent to point 
2b680 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
2b690 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
2b6a0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
2b6b0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
2b6c0 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29  set+8], pgnoNew)
2b6d0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65  ;.  .    /* Rele
2b6e0 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
2b6f0 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  e to the new pag
2b700 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73  e. */.    releas
2b710 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d  ePage(pNew);.  }
2b720 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2b730 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2b740 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
2b750 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a  NCE */..#if 0./*
2b760 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2b770 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  n does not contr
2b780 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74  ibute anything t
2b790 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
2b7a0 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74  of SQLite..** it
2b7b0 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63   is sometimes ac
2b7c0 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72  tivated temporar
2b7d0 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67  ily while debugg
2b7e0 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73  ing code respons
2b7f0 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74  ible .** for set
2b800 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70  ting pointer-map
2b810 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
2b820 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68  tic int ptrmapCh
2b830 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65  eckPages(MemPage
2b840 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e   **apPage, int n
2b850 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Page){.  int i, 
2b860 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  j;.  for(i=0; i<
2b870 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nPage; i++){.   
2b880 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20   Pgno n;.    u8 
2b890 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  e;.    MemPage *
2b8a0 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69  pPage = apPage[i
2b8b0 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ];.    BtShared 
2b8c0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
2b8d0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
2b8e0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2b8f0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
2b900 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b  pPage->nCell; j+
2b910 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e  +){.      CellIn
2b920 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75  fo info;.      u
2b930 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20  8 *z;.     .    
2b940 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70    z = findCell(p
2b950 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20  Page, j);.      
2b960 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
2b970 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
2b980 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  z, &info);.     
2b990 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
2b9a0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50  low ){.        P
2b9b0 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
2b9c0 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65  yte(&z[info.iOve
2b9d0 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20  rflow]);.       
2b9e0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2b9f0 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  ovfl, &e, &n);. 
2ba00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2ba10 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
2ba20 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46   e==PTRMAP_OVERF
2ba30 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOW1 );.      }.
2ba40 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
2ba50 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2ba60 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67    Pgno child = g
2ba70 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20  et4byte(z);.    
2ba80 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42      ptrmapGet(pB
2ba90 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e  t, child, &e, &n
2baa0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2bab0 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
2bac0 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42  o && e==PTRMAP_B
2bad0 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a  TREE );.      }.
2bae0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
2baf0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2bb00 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d      Pgno child =
2bb10 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2bb20 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2bb30 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2bb40 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42      ptrmapGet(pB
2bb50 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e  t, child, &e, &n
2bb60 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2bb70 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
2bb80 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  && e==PTRMAP_BTR
2bb90 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EE );.    }.  }.
2bba0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
2bbb0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
2bbc0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
2bbd0 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f  d to copy the co
2bbe0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d  ntents of the b-
2bbf0 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64  tree node stored
2bc00 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72   .** on page pFr
2bc10 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
2bc20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61  If page pFrom wa
2bc30 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67  s not a leaf pag
2bc40 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70  e, then.** the p
2bc50 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
2bc60 65 73 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c  es for each chil
2bc70 64 20 70 61 67 65 20 61 72 65 20 75 70 64 61 74  d page are updat
2bc80 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a  ed so that the.*
2bc90 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74  * parent page st
2bca0 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e  ored in the poin
2bcb0 74 65 72 20 6d 61 70 20 69 73 20 70 61 67 65 20  ter map is page 
2bcc0 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f  pTo. If pFrom co
2bcd0 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63  ntained.** any c
2bce0 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c  ells with overfl
2bcf0 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73  ow page pointers
2bd00 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65  , then the corre
2bd10 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72  sponding pointer
2bd20 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
2bd30 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64  are also updated
2bd40 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72   so that the par
2bd50 65 6e 74 20 70 61 67 65 20 69 73 20 70 61 67 65  ent page is page
2bd60 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   pTo..**.** If p
2bd70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c  From is currentl
2bd80 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f  y carrying any o
2bd90 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65  verflow cells (e
2bda0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a  ntries in the.**
2bdb0 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d   MemPage.aOvfl[]
2bdc0 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72   array), they ar
2bdd0 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20  e not copied to 
2bde0 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  pTo. .**.** Befo
2bdf0 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61  re returning, pa
2be00 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74  ge pTo is reinit
2be10 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 73 71  ialized using sq
2be20 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
2be30 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ge()..**.** The 
2be40 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74  performance of t
2be50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2be60 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74  not critical. It
2be70 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
2be80 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65   .** the balance
2be90 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64  _shallower() and
2bea0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
2beb0 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65  ) procedures, ne
2bec0 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63  ither of.** whic
2bed0 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74  h are called oft
2bee0 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20  en under normal 
2bef0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a  circumstances..*
2bf00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
2bf10 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d  yNodeContent(Mem
2bf20 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d  Page *pFrom, Mem
2bf30 50 61 67 65 20 2a 70 54 6f 29 7b 0a 20 20 42 74  Page *pTo){.  Bt
2bf40 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70  Shared * const p
2bf50 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b  Bt = pFrom->pBt;
2bf60 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46  .  u8 * const aF
2bf70 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61  rom = pFrom->aDa
2bf80 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  ta;.  u8 * const
2bf90 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74   aTo = pTo->aDat
2bfa0 61 3b 0a 20 20 69 6e 74 20 63 6f 6e 73 74 20 69  a;.  int const i
2bfb0 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d  FromHdr = pFrom-
2bfc0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 6e  >hdrOffset;.  in
2bfd0 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d  t const iToHdr =
2bfe0 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29   ((pTo->pgno==1)
2bff0 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 69   ? 100 : 0);.  i
2c000 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c010 4b 3b 0a 20 20 69 6e 74 20 69 44 61 74 61 3b 0a  K;.  int iData;.
2c020 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d  .  assert( pFrom
2c030 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
2c040 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72  sert( pFrom->nFr
2c050 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20  ee>=iToHdr );.  
2c060 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65  assert( get2byte
2c070 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72  (&aFrom[iFromHdr
2c080 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75 73 61 62 6c  +5])<=pBt->usabl
2c090 65 53 69 7a 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  eSize );..  /* C
2c0a0 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e  opy the b-tree n
2c0b0 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ode content from
2c0c0 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
2c0d0 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 69 44  age pTo. */.  iD
2c0e0 61 74 61 20 3d 20 67 65 74 32 62 79 74 65 28 26  ata = get2byte(&
2c0f0 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35  aFrom[iFromHdr+5
2c100 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61 54  ]);.  memcpy(&aT
2c110 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d  o[iData], &aFrom
2c120 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73  [iData], pBt->us
2c130 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b  ableSize-iData);
2c140 0a 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69  .  memcpy(&aTo[i
2c150 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69  ToHdr], &aFrom[i
2c160 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d  FromHdr], pFrom-
2c170 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
2c180 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 0a  pFrom->nCell);..
2c190 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a    /* Reinitializ
2c1a0 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68  e page pTo so th
2c1b0 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
2c1c0 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
2c1d0 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 6d 61  tructure.  ** ma
2c1e0 74 63 68 20 74 68 65 20 6e 65 77 20 64 61 74 61  tch the new data
2c1f0 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  . The initializa
2c200 74 69 6f 6e 20 6f 66 20 70 54 6f 20 22 63 61 6e  tion of pTo "can
2c210 6e 6f 74 22 20 66 61 69 6c 2c 20 61 73 20 74 68  not" fail, as th
2c220 65 0a 20 20 2a 2a 20 64 61 74 61 20 63 6f 70 69  e.  ** data copi
2c230 65 64 20 66 72 6f 6d 20 70 46 72 6f 6d 20 69 73  ed from pFrom is
2c240 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 76 61 6c   known to be val
2c250 69 64 2e 20 20 2a 2f 0a 20 20 70 54 6f 2d 3e 69  id.  */.  pTo->i
2c260 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 54 45 53  sInit = 0;.  TES
2c270 54 4f 4e 4c 59 28 72 63 20 3d 20 29 20 73 71 6c  TONLY(rc = ) sql
2c280 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
2c290 65 28 70 54 6f 29 3b 0a 20 20 61 73 73 65 72 74  e(pTo);.  assert
2c2a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c2b0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
2c2c0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
2c2d0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
2c2e0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
2c2f0 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  map entries.  **
2c300 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20   for any b-tree 
2c310 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
2c320 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63  s that pTo now c
2c330 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
2c340 74 65 72 73 20 74 6f 2e 20 2a 2f 0a 20 20 69 66  ters to. */.  if
2c350 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2c360 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
2c370 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b  ildPtrmaps(pTo);
2c380 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c390 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2c3a0 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
2c3b0 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74  butes cells on t
2c3c0 68 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68  he iParentIdx'th
2c3d0 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
2c3e0 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20  t.** (hereafter 
2c3f0 22 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20  "the page") and 
2c400 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73  up to 2 siblings
2c410 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67   so that all pag
2c420 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68  es have about th
2c430 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74  e.** same amount
2c440 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20   of free space. 
2c450 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65  Usually a single
2c460 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68   sibling on eith
2c470 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a  er side of the.*
2c480 2a 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20  * page are used 
2c490 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
2c4a0 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69  , though both si
2c4b0 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
2c4c0 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69  e from one.** si
2c4d0 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  de if the page i
2c4e0 73 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c  s the first or l
2c4f0 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73  ast child of its
2c500 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20   parent. If the 
2c510 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77  page .** has few
2c520 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e  er than 2 siblin
2c530 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68  gs (something wh
2c540 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
2c550 70 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a  pen if the page.
2c560 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67  ** is a root pag
2c570 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20  e or a child of 
2c580 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65  a root page) the
2c590 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
2c5a0 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74  siblings.** part
2c5b0 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
2c5c0 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
2c5d0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
2c5e0 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61  blings of the pa
2c5f0 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
2c600 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
2c610 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72  ed by .** one or
2c620 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
2c630 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
2c640 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
2c650 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a  not over full. .
2c660 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2c670 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
2c680 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
2c690 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
2c6a0 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69  n the page.** mi
2c6b0 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
2c6c0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65   be stored in Me
2c6d0 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54  mPage.aData[]. T
2c6e0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
2c6f0 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
2c700 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20   overfull. This 
2c710 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
2c720 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61  that all cells a
2c730 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74  llocated.** to t
2c740 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
2c750 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74  siblings fit int
2c760 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  o MemPage.aData[
2c770 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ] before returni
2c780 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ng..**.** In the
2c790 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
2c7a0 63 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e  cing the page an
2c7b0 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20  d its siblings, 
2c7c0 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20  cells may be.** 
2c7d0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72  inserted into or
2c7e0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
2c7f0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70  e parent page (p
2c800 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73  Parent). Doing s
2c810 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74  o.** may cause t
2c820 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74  he parent page t
2c830 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
2c840 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
2c850 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65  If this.** happe
2c860 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ns, it is the re
2c870 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
2c880 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e  the caller to in
2c890 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74  voke the correct
2c8a0 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f  .** balancing ro
2c8b0 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69  utine to fix thi
2c8c0 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74  s problem (see t
2c8d0 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75  he balance() rou
2c8e0 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  tine). .**.** If
2c8f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
2c900 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
2c910 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
2c920 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
2c930 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
2c940 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74  d state. So if t
2c950 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
2c960 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
2c970 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
2c980 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
2c990 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
2c9a0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
2c9b0 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c  ion, aOvflSpace,
2c9c0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2c9d0 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 70 61 67   a.** buffer pag
2c9e0 65 2d 73 69 7a 65 20 62 79 74 65 73 20 69 6e 20  e-size bytes in 
2c9f0 73 69 7a 65 2e 20 49 66 2c 20 69 6e 20 69 6e 73  size. If, in ins
2ca00 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74  erting cells int
2ca10 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20  o the parent.** 
2ca20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2c 20  page (pParent), 
2ca30 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2ca40 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c  becomes overfull
2ca50 2c 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73  , this buffer is
2ca60 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
2ca70 65 20 74 68 65 20 70 61 72 65 6e 74 73 20 6f 76  e the parents ov
2ca80 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65  erflow cells. Be
2ca90 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
2caa0 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61  ion inserts.** a
2cab0 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72   maximum of four
2cac0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
2cad0 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
2cae0 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78  age, and the max
2caf0 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  imum.** size of 
2cb00 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69  a cell stored wi
2cb10 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  thin an internal
2cb20 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20   node is always 
2cb30 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a  less than 1/4.**
2cb40 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
2cb50 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63  e, the aOvflSpac
2cb60 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67 75  e[] buffer is gu
2cb70 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
2cb80 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66  arge.** enough f
2cb90 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  or all overflow 
2cba0 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cells..**.** If 
2cbb0 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73 65  aOvflSpace is se
2cbc0 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  t to a null poin
2cbd0 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
2cbe0 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
2cbf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
2cc00 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2cc10 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65  ce_nonroot(.  Me
2cc20 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
2cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cc40 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20   Parent page of 
2cc50 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62  siblings being b
2cc60 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  alanced */.  int
2cc70 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20   iParentIdx,    
2cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cc90 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70 61  Index of "the pa
2cca0 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  ge" in pParent *
2ccb0 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61  /.  u8 *aOvflSpa
2ccc0 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
2ccd0 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65      /* page-size
2cce0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2ccf0 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20  for parent ovfl 
2cd00 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 20  */.  int isRoot 
2cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2cd30 70 50 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f  pParent is a roo
2cd40 74 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 42  t-page */.){.  B
2cd50 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
2cd60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2cd70 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73  he whole databas
2cd80 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
2cd90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2cda0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2cdb0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
2cdc0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  [] */.  int nMax
2cdd0 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
2cde0 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
2cdf0 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c  d size of apCell
2ce00 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e  , szCell, aFrom.
2ce10 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d   */.  int nNew =
2ce20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2ce30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ce40 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d  pages in apNew[]
2ce50 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20   */.  int nOld; 
2ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ce80 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d  pages in apOld[]
2ce90 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20   */.  int i, j, 
2cea0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2ceb0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2cec0 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44  ers */.  int nxD
2ced0 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
2cee0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69        /* Next di
2cef0 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50  vider slot in pP
2cf00 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
2cf10 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2cf20 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2cf30 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
2cf40 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61  ode */.  u16 lea
2cf50 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20  fCorrection;    
2cf60 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50        /* 4 if pP
2cf70 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
2cf80 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e  0 if not */.  in
2cf90 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20  t leafData;     
2cfa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2cfb0 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61  ue if pPage is a
2cfc0 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44   leaf of a LEAFD
2cfd0 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e  ATA tree */.  in
2cfe0 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20  t usableSpace;  
2cff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
2d000 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79  tes in pPage bey
2d010 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a  ond the header *
2d020 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67  /.  int pageFlag
2d030 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2d040 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61   /* Value of pPa
2d050 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a  ge->aData[0] */.
2d060 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20    int subtotal; 
2d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d080 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79  * Subtotal of by
2d090 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20  tes in cells on 
2d0a0 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  one page */.  in
2d0b0 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20  t iSpace1 = 0;  
2d0c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2d0d0 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
2d0e0 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a  of aSpace1[] */.
2d0f0 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65    int iOvflSpace
2d100 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
2d110 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
2d120 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63  yte of aOvflSpac
2d130 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  e[] */.  int szS
2d140 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  cratch;         
2d150 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2d160 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
2d170 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d  requested */.  M
2d180 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42  emPage *apOld[NB
2d190 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  ];          /* p
2d1a0 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74  Page and up to t
2d1b0 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  wo siblings */. 
2d1c0 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
2d1d0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
2d1e0 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
2d1f0 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
2d200 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
2d210 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
2d220 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
2d230 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
2d240 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
2d250 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68  g */.  u8 *pRigh
2d260 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2d270 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20      /* Location 
2d280 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67  in parent of rig
2d290 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74  ht-sibling point
2d2a0 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69  er */.  u8 *apDi
2d2b0 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20  v[NB-1];        
2d2c0 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20       /* Divider 
2d2d0 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
2d2e0 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77   */.  int cntNew
2d2f0 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
2d300 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
2d310 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61  Cell[] of cell a
2d320 66 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a  fter i-th page *
2d330 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42  /.  int szNew[NB
2d340 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
2d350 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a   /* Combined siz
2d360 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65  e of cells place
2d370 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f   on i-th page */
2d380 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d  .  u8 **apCell =
2d390 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d3a0 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
2d3b0 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
2d3c0 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
2d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d3e0 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
2d3f0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
2d400 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53  ll[] */.  u8 *aS
2d410 70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20  pace1;          
2d420 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
2d430 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69  for copies of di
2d440 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a  viders cells */.
2d450 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
2d460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d470 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74  * Temp var to st
2d480 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ore a page numbe
2d490 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d  r in */..  pBt =
2d4a0 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20   pParent->pBt;. 
2d4b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2d4c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2d4d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2d4e0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2d4f0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2d500 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2d510 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45  ;..#if 0.  TRACE
2d520 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
2d530 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
2d540 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
2d550 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
2d560 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  pgno));.#endif..
2d570 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
2d580 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68  nt pParent may h
2d590 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
2d5a0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41  overflow cell. A
2d5b0 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20  nd if.  ** this 
2d5c0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73  overflow cell is
2d5d0 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73   present, it mus
2d5e0 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69  t be the cell wi
2d5f0 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  th .  ** index i
2d600 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20  ParentIdx. This 
2d610 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61  scenario comes a
2d620 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66  bout when this f
2d630 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
2d640 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74  called (indirect
2d650 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ly) from sqlite3
2d660 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e 20 2a  BtreeDelete(). *
2d670 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
2d680 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
2d690 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  0 || pParent->nO
2d6a0 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20  verflow==1 );.  
2d6b0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
2d6c0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
2d6d0 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b   pParent->aOvfl[
2d6e0 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e 74 49  0].idx==iParentI
2d6f0 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f  dx );..  if( !aO
2d700 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20  vflSpace ){.    
2d710 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2d720 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  MEM;.  }..  /* F
2d730 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20  ind the sibling 
2d740 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65  pages to balance
2d750 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68  . Also locate th
2d760 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  e cells in pPare
2d770 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69  nt .  ** that di
2d780 76 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67  vide the sibling
2d790 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  s. An attempt is
2d7a0 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e   made to find NN
2d7b0 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20   siblings on .  
2d7c0 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  ** either side o
2d7d0 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69  f pPage. More si
2d7e0 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e  blings are taken
2d7f0 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20   from one side, 
2d800 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69  however, .  ** i
2d810 66 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65  f there are fewe
2d820 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e  r than NN siblin
2d830 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20  gs on the other 
2d840 73 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74  side. If pParent
2d850 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20  .  ** has NB or 
2d860 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74  fewer children t
2d870 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  hen all children
2d880 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20   of pParent are 
2d890 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20  taken.  .  **.  
2d8a0 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73  ** This loop als
2d8b0 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69 76 69  o drops the divi
2d8c0 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74  der cells from t
2d8d0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
2d8e0 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74  This.  ** way, t
2d8f0 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
2d900 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
2d910 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65  s not have to de
2d920 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a  al with any.  **
2d930 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
2d940 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  in the parent pa
2d950 67 65 2c 20 61 73 20 69 66 20 6f 6e 65 20 65 78  ge, as if one ex
2d960 69 73 74 65 64 20 69 74 20 68 61 73 20 61 6c 72  isted it has alr
2d970 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 72  eady.  ** been r
2d980 65 6d 6f 76 65 64 2e 20 20 2a 2f 0a 20 20 69 20  emoved.  */.  i 
2d990 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  = pParent->nOver
2d9a0 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e  flow + pParent->
2d9b0 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32  nCell;.  if( i<2
2d9c0 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
2d9d0 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 69 2b  0;.    nOld = i+
2d9e0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
2d9f0 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20 20 69 66  nOld = 3;.    if
2da00 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20  ( iParentIdx==0 
2da10 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
2da20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20     .      nxDiv 
2da30 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
2da40 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69  f( iParentIdx==i
2da50 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20   ){.      nxDiv 
2da60 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65 6c 73 65  = i-2;.    }else
2da70 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  {.      nxDiv = 
2da80 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20  iParentIdx-1;.  
2da90 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 3b 0a 20    }.    i = 2;. 
2daa0 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69   }.  if( (i+nxDi
2dab0 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
2dac0 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e  flow)==pParent->
2dad0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69  nCell ){.    pRi
2dae0 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e  ght = &pParent->
2daf0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
2db00 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d  drOffset+8];.  }
2db10 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74  else{.    pRight
2db20 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72   = findCell(pPar
2db30 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
2db40 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
2db50 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67  ;.  }.  pgno = g
2db60 65 74 34 62 79 74 65 28 70 52 69 67 68 74 29 3b  et4byte(pRight);
2db70 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
2db80 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
2db90 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
2dba0 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  , &apOld[i]);.  
2dbb0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2dbc0 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20    memset(apOld, 
2dbd0 30 2c 20 69 2a 73 69 7a 65 6f 66 28 4d 65 6d 50  0, i*sizeof(MemP
2dbe0 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f  age*));.      go
2dbf0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2dc00 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  up;.    }.    nM
2dc10 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f  axCells += 1+apO
2dc20 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f  ld[i]->nCell+apO
2dc30 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ld[i]->nOverflow
2dc40 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d  ;.    if( (i--)=
2dc50 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =0 ) break;..   
2dc60 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f   if( pParent->nO
2dc70 76 65 72 66 6c 6f 77 20 26 26 20 69 2b 6e 78 44  verflow && i+nxD
2dc80 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 4f 76  iv==pParent->aOv
2dc90 66 6c 5b 30 5d 2e 69 64 78 20 29 7b 0a 20 20 20  fl[0].idx ){.   
2dca0 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50     apDiv[i] = pP
2dcb0 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  arent->aOvfl[0].
2dcc0 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70 67 6e  pCell;.      pgn
2dcd0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  o = get4byte(apD
2dce0 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a  iv[i]);.      sz
2dcf0 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  New[i] = cellSiz
2dd00 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70  ePtr(pParent, ap
2dd10 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70  Div[i]);.      p
2dd20 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2dd30 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  w = 0;.    }else
2dd40 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d  {.      apDiv[i]
2dd50 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72   = findCell(pPar
2dd60 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
2dd70 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
2dd80 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67  ;.      pgno = g
2dd90 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d  et4byte(apDiv[i]
2dda0 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69  );.      szNew[i
2ddb0 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
2ddc0 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
2ddd0 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72  ]);..      /* Dr
2dde0 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  op the cell from
2ddf0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2de00 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c  . apDiv[i] still
2de10 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20   points to.     
2de20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74   ** the cell wit
2de30 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20  hin the parent, 
2de40 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68  even though it h
2de50 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e  as been dropped.
2de60 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
2de70 73 20 73 61 66 65 20 62 65 63 61 75 73 65 20 64  s safe because d
2de80 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f  ropping a cell o
2de90 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 74  nly overwrites t
2dea0 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a  he first.      *
2deb0 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20  * four bytes of 
2dec0 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e  it, and this fun
2ded0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e  ction does not n
2dee0 65 65 64 20 74 68 65 20 66 69 72 73 74 0a 20 20  eed the first.  
2def0 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65      ** four byte
2df00 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
2df10 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f   cell. So the po
2df20 69 6e 74 65 72 20 69 73 20 73 61 66 65 20 74 6f  inter is safe to
2df30 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61   use.      ** la
2df40 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20  ter on.  .      
2df50 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65  **.      ** Unle
2df60 73 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  ss SQLite is com
2df70 70 69 6c 65 64 20 69 6e 20 73 65 63 75 72 65 2d  piled in secure-
2df80 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20  delete mode. In 
2df90 74 68 69 73 20 63 61 73 65 2c 0a 20 20 20 20 20  this case,.     
2dfa0 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c   ** the dropCell
2dfb0 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
2dfc0 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e  overwrite the en
2dfd0 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a  tire cell with z
2dfe0 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  eroes..      ** 
2dff0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65  In this case, te
2e000 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74  mporarily copy t
2e010 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65  he cell into the
2e020 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20   aOvflSpace[].  
2e030 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49      ** buffer. I
2e040 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64  t will be copied
2e050 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f   out again as so
2e060 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65  on as the aSpace
2e070 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20  [] buffer.      
2e080 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  ** is allocated.
2e090 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
2e0a0 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
2e0b0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61  .      memcpy(&a
2e0c0 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b  OvflSpace[apDiv[
2e0d0 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  i]-pParent->aDat
2e0e0 61 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a  a], apDiv[i], sz
2e0f0 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61  New[i]);.      a
2e100 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c  pDiv[i] = &aOvfl
2e110 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70  Space[apDiv[i]-p
2e120 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a  Parent->aData];.
2e130 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64 72 6f  #endif.      dro
2e140 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  pCell(pParent, i
2e150 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
2e160 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77  nOverflow, szNew
2e170 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [i]);.    }.  }.
2e180 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43  .  /* Make nMaxC
2e190 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20  ells a multiple 
2e1a0 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f  of 4 in order to
2e1b0 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65   preserve 8-byte
2e1c0 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20  .  ** alignment 
2e1d0 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d  */.  nMaxCells =
2e1e0 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29   (nMaxCells + 3)
2e1f0 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  &~3;..  /*.  ** 
2e200 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
2e210 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  or memory struct
2e220 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20  ures.  */.  k = 
2e230 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  pBt->pageSize + 
2e240 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
2e250 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72  mPage));.  szScr
2e260 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d  atch =.       nM
2e270 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
2e280 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  8*)             
2e290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43            /* apC
2e2a0 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d  ell */.     + nM
2e2b0 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
2e2c0 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20  16)             
2e2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43            /* szC
2e2e0 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42  ell */.     + pB
2e2f0 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20  t->pageSize     
2e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70            /* aSp
2e320 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b  ace1 */.     + k
2e330 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20  *nOld;          
2e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2e360 67 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70  ge copies (apCop
2e370 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d  y) */.  apCell =
2e380 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d   sqlite3ScratchM
2e390 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68  alloc( szScratch
2e3a0 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c   ); .  if( apCel
2e3b0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
2e3c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2e3d0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2e3e0 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73  cleanup;.  }.  s
2e3f0 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61  zCell = (u16*)&a
2e400 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  pCell[nMaxCells]
2e410 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75  ;.  aSpace1 = (u
2e420 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43  8*)&szCell[nMaxC
2e430 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28  ells];.  assert(
2e440 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2e450 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29  NMENT(aSpace1) )
2e460 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61  ;..  /*.  ** Loa
2e470 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c  d pointers to al
2e480 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69  l cells on sibli
2e490 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ng pages and the
2e4a0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
2e4b0 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63   ** into the loc
2e4c0 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61  al apCell[] arra
2e4d0 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20  y.  Make copies 
2e4e0 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
2e4f0 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73  ells.  ** into s
2e500 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
2e510 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64  om aSpace1[] and
2e520 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20   remove the the 
2e530 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20  divider Cells.  
2e540 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e  ** from pParent.
2e550 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
2e560 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f  e siblings are o
2e570 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68  n leaf pages, th
2e580 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69  en the child poi
2e590 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a  nters of the.  *
2e5a0 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * divider cells 
2e5b0 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f  are stripped fro
2e5c0 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f  m the cells befo
2e5d0 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69  re they are copi
2e5e0 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70  ed.  ** into aSp
2e5f0 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73  ace1[].  In this
2e600 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20   way, all cells 
2e610 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20  in apCell[] are 
2e620 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69  without.  ** chi
2e630 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66  ld pointers.  If
2e640 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
2e650 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61  t leaves, then a
2e660 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20  ll cell in.  ** 
2e670 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65  apCell[] include
2e680 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
2e690 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c    Either way, al
2e6a0 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
2e6b0 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69  l[].  ** are ali
2e6c0 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65  ke..  **.  ** le
2e6d0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34  afCorrection:  4
2e6e0 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
2e6f0 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65  eaf.  0 if pPage
2e700 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a   is not a leaf..
2e710 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44    **       leafD
2e720 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65  ata:  1 if pPage
2e730 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20   holds key+data 
2e740 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64  and pParent hold
2e750 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a  s only keys..  *
2e760 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69  /.  leafCorrecti
2e770 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c  on = apOld[0]->l
2e780 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74  eaf*4;.  leafDat
2e790 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61  a = apOld[0]->ha
2e7a0 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30  sData;.  for(i=0
2e7b0 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
2e7c0 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20      int limit;. 
2e7d0 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72     .    /* Befor
2e7e0 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
2e7f0 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f   else, take a co
2e800 70 79 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f  py of the i'th o
2e810 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a  riginal sibling.
2e820 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20      ** The rest 
2e830 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2e840 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66   will use data f
2e850 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72  rom the copies r
2e860 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  ather.    ** tha
2e870 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
2e880 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f  ages since the o
2e890 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69  riginal pages wi
2e8a0 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20  ll be in the.   
2e8b0 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62   ** process of b
2e8c0 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
2e8d0 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  .  */.    MemPag
2e8e0 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
2e8f0 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  [i] = (MemPage*)
2e900 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61  &aSpace1[pBt->pa
2e910 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20  geSize + k*i];. 
2e920 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20     memcpy(pOld, 
2e930 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66  apOld[i], sizeof
2e940 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20  (MemPage));.    
2e950 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76  pOld->aData = (v
2e960 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20  oid*)&pOld[1];. 
2e970 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e     memcpy(pOld->
2e980 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d  aData, apOld[i]-
2e990 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67  >aData, pBt->pag
2e9a0 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d  eSize);..    lim
2e9b0 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  it = pOld->nCell
2e9c0 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  +pOld->nOverflow
2e9d0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
2e9e0 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
2e9f0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
2ea00 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
2ea10 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
2ea20 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
2ea30 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
2ea40 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
2ea50 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
2ea60 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
2ea70 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 6e 43  Cell]);.      nC
2ea80 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ell++;.    }.   
2ea90 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26   if( i<nOld-1 &&
2eaa0 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20 20 20   !leafData){.   
2eab0 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75 31 36     u16 sz = (u16
2eac0 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20  )szNew[i];.     
2ead0 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
2eae0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
2eaf0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
2eb00 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
2eb10 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 54 65   = sz;.      pTe
2eb20 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53  mp = &aSpace1[iS
2eb30 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 69 53  pace1];.      iS
2eb40 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20  pace1 += sz;.   
2eb50 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
2eb60 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29  Bt->pageSize/4 )
2eb70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2eb80 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61  iSpace1<=pBt->pa
2eb90 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
2eba0 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70  memcpy(pTemp, ap
2ebb0 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20  Div[i], sz);.   
2ebc0 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
2ebd0 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72   = pTemp+leafCor
2ebe0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61  rection;.      a
2ebf0 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
2ec00 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66  ction==0 || leaf
2ec10 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
2ec20 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
2ec30 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43  ell] = szCell[nC
2ec40 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65  ell] - leafCorre
2ec50 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  ction;.      if(
2ec60 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a   !pOld->leaf ){.
2ec70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2ec80 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
2ec90 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
2eca0 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66  ert( pOld->hdrOf
2ecb0 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  fset==0 );.     
2ecc0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
2ecd0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63  pointer of the c
2ece0 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62  hild page pOld b
2ecf0 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a  ecomes the left.
2ed00 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
2ed10 65 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  er of the divide
2ed20 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  r cell */.      
2ed30 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b    memcpy(apCell[
2ed40 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61  nCell], &pOld->a
2ed50 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20  Data[8], 4);.   
2ed60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ed70 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
2ed80 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20  rrection==4 );. 
2ed90 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
2eda0 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20  l[nCell]<4 ){.  
2edb0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
2edc0 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c  t allow any cell
2edd0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34  s smaller than 4
2ede0 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20   bytes. */.     
2edf0 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
2ee00 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l] = 4;.        
2ee10 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2ee20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nCell++;.    }. 
2ee30 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
2ee40 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d  gure out the num
2ee50 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65  ber of pages nee
2ee60 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ded to hold all 
2ee70 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a  nCell cells..  *
2ee80 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d  * Store this num
2ee90 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73  ber in "k".  Als
2eea0 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b  o compute szNew[
2eeb0 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74  ] which is the t
2eec0 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  otal.  ** size o
2eed0 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74  f all cells on t
2eee0 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64  he i-th page and
2eef0 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20   cntNew[] which 
2ef00 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  is the index.  *
2ef10 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66  * in apCell[] of
2ef20 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64   the cell that d
2ef30 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72  ivides page i fr
2ef40 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20  om page i+1.  . 
2ef50 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68   ** cntNew[k] sh
2ef60 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c  ould equal nCell
2ef70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75  ..  **.  ** Valu
2ef80 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  es computed by t
2ef90 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a  his block:.  **.
2efa0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b    **           k
2efb0 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  : The total numb
2efc0 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61  er of sibling pa
2efd0 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65  ges.  **    szNe
2efe0 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65  w[i]: Spaced use
2eff0 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69  d on the i-th si
2f000 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
2f010 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e     cntNew[i]: In
2f020 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  dex in apCell[] 
2f030 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72  and szCell[] for
2f040 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
2f050 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  to.  **         
2f060 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f       the right o
2f070 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  f the i-th sibli
2f080 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73  ng page..  ** us
2f090 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65  ableSpace: Numbe
2f0a0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
2f0b0 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  ace available on
2f0c0 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20   each sibling.. 
2f0d0 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62   ** .  */.  usab
2f0e0 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75  leSpace = pBt->u
2f0f0 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b  sableSize - 12 +
2f100 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
2f110 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d  .  for(subtotal=
2f120 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  k=i=0; i<nCell; 
2f130 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
2f140 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( i<nMaxCells );
2f150 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d  .    subtotal +=
2f160 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a   szCell[i] + 2;.
2f170 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c      if( subtotal
2f180 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29   > usableSpace )
2f190 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d  {.      szNew[k]
2f1a0 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a   = subtotal - sz
2f1b0 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63  Cell[i];.      c
2f1c0 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20  ntNew[k] = i;.  
2f1d0 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61      if( leafData
2f1e0 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
2f1f0 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20   subtotal = 0;. 
2f200 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20       k++;.      
2f210 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63  if( k>NB+1 ){ rc
2f220 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2f230 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f  T; goto balance_
2f240 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d  cleanup; }.    }
2f250 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20  .  }.  szNew[k] 
2f260 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e  = subtotal;.  cn
2f270 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b  tNew[k] = nCell;
2f280 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20  .  k++;..  /*.  
2f290 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63  ** The packing c
2f2a0 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70  omputed by the p
2f2b0 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73  revious block is
2f2c0 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74   biased toward t
2f2d0 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a  he siblings.  **
2f2e0 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64   on the left sid
2f2f0 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62  e.  The left sib
2f300 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73  lings are always
2f310 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68   nearly full, wh
2f320 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67  ile the.  ** rig
2f330 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
2f340 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20  might be nearly 
2f350 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f  empty.  This blo
2f360 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d  ck of code attem
2f370 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75  pts.  ** to adju
2f380 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f  st the packing o
2f390 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65  f siblings to ge
2f3a0 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e  t a better balan
2f3b0 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
2f3c0 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
2f3d0 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70   more than an op
2f3e0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65  timization.  The
2f3f0 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d   packing above m
2f400 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20  ight.  ** be so 
2f410 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61  out of balance a
2f420 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e  s to be illegal.
2f430 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
2f440 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
2f450 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  ** sibling might
2f460 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   be completely e
2f470 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75  mpty.  This adju
2f480 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70  stment is not op
2f490 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66  tional..  */.  f
2f4a0 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69  or(i=k-1; i>0; i
2f4b0 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52  --){.    int szR
2f4c0 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b  ight = szNew[i];
2f4d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62    /* Size of sib
2f4e0 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68  ling on the righ
2f4f0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  t */.    int szL
2f500 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d  eft = szNew[i-1]
2f510 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62  ; /* Size of sib
2f520 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74  ling on the left
2f530 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20   */.    int r;  
2f540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f550 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f  ndex of right-mo
2f560 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20  st cell in left 
2f570 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69  sibling */.    i
2f580 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20  nt d;           
2f590 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
2f5a0 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65  irst cell to the
2f5b0 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73   left of right s
2f5c0 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72  ibling */..    r
2f5d0 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
2f5e0 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20   1;.    d = r + 
2f5f0 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
2f600 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78    assert( d<nMax
2f610 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
2f620 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73  ert( r<nMaxCells
2f630 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73   );.    while( s
2f640 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52  zRight==0 || szR
2f650 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32  ight+szCell[d]+2
2f660 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c  <=szLeft-(szCell
2f670 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20  [r]+2) ){.      
2f680 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c  szRight += szCel
2f690 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[d] + 2;.      
2f6a0 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c  szLeft -= szCell
2f6b0 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63  [r] + 2;.      c
2f6c0 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20  ntNew[i-1]--;.  
2f6d0 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
2f6e0 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64  -1] - 1;.      d
2f6f0 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
2f700 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ata;.    }.    s
2f710 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68  zNew[i] = szRigh
2f720 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31  t;.    szNew[i-1
2f730 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a  ] = szLeft;.  }.
2f740 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20  .  /* Either we 
2f750 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  found one or mor
2f760 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b  e cells (cntnew[
2f770 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20  0])>0) or pPage 
2f780 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61  is.  ** a virtua
2f790 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20  l root page.  A 
2f7a0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
2f7b0 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65  e is when the re
2f7c0 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67  al root.  ** pag
2f7d0 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20  e is page 1 and 
2f7e0 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20  we are the only 
2f7f0 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61  child of that pa
2f800 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
2f810 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c  t( cntNew[0]>0 |
2f820 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  | (pParent->pgno
2f830 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  ==1 && pParent->
2f840 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20  nCell==0) );..  
2f850 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2f860 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20   old: %d %d %d  
2f870 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d  ",.    apOld[0]-
2f880 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64  >pgno, .    nOld
2f890 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e  >=2 ? apOld[1]->
2f8a0 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f  pgno : 0,.    nO
2f8b0 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d  ld>=3 ? apOld[2]
2f8c0 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b  ->pgno : 0.  ));
2f8d0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
2f8e0 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73  cate k new pages
2f8f0 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67  .  Reuse old pag
2f900 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c  es where possibl
2f910 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 70  e..  */.  if( ap
2f920 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20  Old[0]->pgno<=1 
2f930 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2f940 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
2f950 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2f960 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65  anup;.  }.  page
2f970 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d  Flags = apOld[0]
2f980 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f  ->aData[0];.  fo
2f990 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
2f9a0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
2f9b0 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e  New;.    if( i<n
2f9c0 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  Old ){.      pNe
2f9d0 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61  w = apNew[i] = a
2f9e0 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61  pOld[i];.      a
2f9f0 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
2fa00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2fa10 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e  agerWrite(pNew->
2fa20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2fa30 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nNew++;.      if
2fa40 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
2fa50 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2fa60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
2fa70 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
2fa80 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
2fa90 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2faa0 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e  pNew, &pgno, pgn
2fab0 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 0);.      if(
2fac0 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
2fad0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2fae0 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65    apNew[i] = pNe
2faf0 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  w;.      nNew++;
2fb00 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
2fb10 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
2fb20 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77  ntry for the new
2fb30 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
2fb40 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55  /.      if( ISAU
2fb50 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2fb60 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2fb70 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67  ut(pBt, pNew->pg
2fb80 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
2fb90 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
2fba0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2fbb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2fbc0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
2fbd0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2fbe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2fbf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2fc00 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61   Free any old pa
2fc10 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
2fc20 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20  t reused as new 
2fc30 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  pages..  */.  wh
2fc40 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20  ile( i<nOld ){. 
2fc50 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2fc60 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
2fc70 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
2fc80 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2fc90 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
2fca0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pOld[i]);.    ap
2fcb0 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
2fcc0 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  i++;.  }..  /*. 
2fcd0 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20   ** Put the new 
2fce0 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
2fcf0 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ng order.  This 
2fd00 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65  helps to.  ** ke
2fd10 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ep entries in th
2fd20 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f  e disk file in o
2fd30 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73  rder so that a s
2fd40 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  can.  ** of the 
2fd50 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61  table is a linea
2fd60 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
2fd70 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20  he file.  That. 
2fd80 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70   ** in turn help
2fd90 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  s the operating 
2fda0 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65  system to delive
2fdb0 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f  r pages.  ** fro
2fdc0 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20  m the disk more 
2fdd0 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rapidly..  **.  
2fde0 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73  ** An O(n^2) ins
2fdf0 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f  ertion sort algo
2fe00 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62  rithm is used, b
2fe10 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20  ut since.  ** n 
2fe20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  is never more th
2fe30 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63  an NB (a small c
2fe40 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73  onstant), that s
2fe50 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62  hould.  ** not b
2fe60 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a  e a problem..  *
2fe70 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d  *.  ** When NB==
2fe80 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69  3, this one opti
2fe90 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74  mization makes t
2fea0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
2feb0 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65   about 25% faste
2fec0 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65  r for large inse
2fed0 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74  rtions and delet
2fee0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
2fef0 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b  (i=0; i<k-1; i++
2ff00 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20  ){.    int minV 
2ff10 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  = apNew[i]->pgno
2ff20 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d  ;.    int minI =
2ff30 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   i;.    for(j=i+
2ff40 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<k; j++){.  
2ff50 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d      if( apNew[j]
2ff60 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64  ->pgno<(unsigned
2ff70 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20  )minV ){.       
2ff80 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20   minI = j;.     
2ff90 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b     minV = apNew[
2ffa0 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20  j]->pgno;.      
2ffb0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2ffc0 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
2ffd0 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d  int t;.      Mem
2ffe0 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
2fff0 74 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67  t = apNew[i]->pg
30000 6e 6f 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61  no;.      pT = a
30010 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61  pNew[i];.      a
30020 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b  pNew[i] = apNew[
30030 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
30040 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20  ew[minI] = pT;. 
30050 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45     }.  }.  TRACE
30060 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25  (("new: %d(%d) %
30070 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
30080 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20  %d) %d(%d)\n",. 
30090 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e     apNew[0]->pgn
300a0 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20  o, szNew[0],.   
300b0 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77   nNew>=2 ? apNew
300c0 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [1]->pgno : 0, n
300d0 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31  New>=2 ? szNew[1
300e0 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
300f0 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70  =3 ? apNew[2]->p
30100 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  gno : 0, nNew>=3
30110 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
30120 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61  .    nNew>=4 ? a
30130 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[3]->pgno : 
30140 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e  0, nNew>=4 ? szN
30150 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[3] : 0,.    n
30160 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34  New>=5 ? apNew[4
30170 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
30180 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20  w>=5 ? szNew[4] 
30190 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  : 0));..  assert
301a0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
301b0 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
301c0 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
301d0 20 70 75 74 34 62 79 74 65 28 70 52 69 67 68 74   put4byte(pRight
301e0 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  , apNew[nNew-1]-
301f0 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20  >pgno);..  /*.  
30200 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69  ** Evenly distri
30210 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  bute the data in
30220 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73   apCell[] across
30230 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a   the new pages..
30240 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69    ** Insert divi
30250 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70  der cells into p
30260 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73  Parent as necess
30270 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20  ary..  */.  j = 
30280 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
30290 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
302a0 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20  /* Assemble the 
302b0 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
302c0 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
302d0 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69   *pNew = apNew[i
302e0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  ];.    assert( j
302f0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
30300 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
30310 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20   pageFlags);.   
30320 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
30330 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c  ew, cntNew[i]-j,
30340 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a   &apCell[j], &sz
30350 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73  Cell[j]);.    as
30360 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c  sert( pNew->nCel
30370 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20  l>0 || (nNew==1 
30380 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29  && cntNew[0]==0)
30390 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
303a0 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  pNew->nOverflow=
303b0 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63  =0 );..    j = c
303c0 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f  ntNew[i];..    /
303d0 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
303e0 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20   page assembled 
303f0 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68  above was not th
30400 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  e right-most sib
30410 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73  ling,.    ** ins
30420 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65  ert a divider ce
30430 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ll into the pare
30440 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
30450 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e      assert( i<nN
30460 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c  ew-1 || j==nCell
30470 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43   );.    if( j<nC
30480 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ell ){.      u8 
30490 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38  *pCell;.      u8
304a0 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69   *pTemp;.      i
304b0 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73  nt sz;..      as
304c0 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
304d0 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  s );.      pCell
304e0 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20   = apCell[j];.  
304f0 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b      sz = szCell[
30500 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  j] + leafCorrect
30510 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  ion;.      pTemp
30520 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69   = &aOvflSpace[i
30530 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20  OvflSpace];.    
30540 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61    if( !pNew->lea
30550 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  f ){.        mem
30560 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61  cpy(&pNew->aData
30570 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a  [8], pCell, 4);.
30580 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
30590 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
305a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72      /* If the tr
305b0 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74  ee is a leaf-dat
305c0 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20  a tree, and the 
305d0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61  siblings are lea
305e0 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a  ves, .        **
305f0 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
30600 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  o divider cell i
30610 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74  n apCell[]. Inst
30620 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72  ead, the divider
30630 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c   .        ** cel
30640 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  l consists of th
30650 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  e integer key fo
30660 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  r the right-most
30670 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20   cell of .      
30680 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
30690 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20  -page assembled 
306a0 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20  above only..    
306b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43      */.        C
306c0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
306d0 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
306e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
306f0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77  arseCellPtr(pNew
30700 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e  , apCell[j], &in
30710 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65  fo);.        pCe
30720 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
30730 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74      sz = 4 + put
30740 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
30750 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20  , info.nKey);.  
30760 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
30770 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
30780 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34        pCell -= 4
30790 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73  ;.        /* Obs
307a0 63 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f  cure case for no
307b0 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  n-leaf-data tree
307c0 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61  s: If the cell a
307d0 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20  t pCell was.    
307e0 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c      ** previousl
307f0 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65  y stored on a le
30800 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73  af node, and its
30810 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77   reported size w
30820 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20  as 4.        ** 
30830 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d  bytes, then it m
30840 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ay actually be s
30850 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73  maller than this
30860 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65   .        ** (se
30870 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  e sqlite3BtreePa
30880 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20  rseCellPtr(), 4 
30890 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e  bytes is the min
308a0 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20  imum size of.   
308b0 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c       ** any cell
308c0 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70  ). But it is imp
308d0 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74  ortant to pass t
308e0 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20  he correct size 
308f0 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  to .        ** i
30900 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20  nsertCell(), so 
30910 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c  reparse the cell
30920 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a   now..        **
30930 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
30940 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e   that this can n
30950 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61  ever happen in a
30960 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69  n SQLite data fi
30970 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20  le, as all.     
30980 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20     ** cells are 
30990 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
309a0 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e  . It only happen
309b0 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65  s in b-trees use
309c0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  d.        ** to 
309d0 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45  evaluate "IN (SE
309e0 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73  LECT ...)" and s
309f0 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a  imilar clauses..
30a00 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30a10 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d     if( szCell[j]
30a20 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==4 ){.         
30a30 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72   assert(leafCorr
30a40 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20  ection==4);.    
30a50 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
30a60 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
30a70 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pCell);.        
30a80 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
30a90 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a  iOvflSpace += sz
30aa0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30ab0 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  sz<=pBt->pageSiz
30ac0 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73  e/4 );.      ass
30ad0 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65 3c  ert( iOvflSpace<
30ae0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
30af0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73  ;.      rc = ins
30b00 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
30b10 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73   nxDiv, pCell, s
30b20 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e  z, pTemp, pNew->
30b30 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
30b40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30b50 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
30b60 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73  eanup;.      ass
30b70 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
30b80 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
30b90 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
30ba0 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  ;..      j++;.  
30bb0 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
30bc0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
30bd0 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
30be0 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
30bf0 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
30c00 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
30c10 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
30c20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  )==0 ){.    u8 *
30c30 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79  zChild = &apCopy
30c40 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nOld-1]->aData[
30c50 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  8];.    memcpy(&
30c60 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61  apNew[nNew-1]->a
30c70 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c  Data[8], zChild,
30c80 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   4);.  }..  if( 
30c90 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e  isRoot && pParen
30ca0 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70  t->nCell==0 && p
30cb0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
30cc0 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72  t<=apNew[0]->nFr
30cd0 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ee ){.    /* The
30ce0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
30cf0 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e  e b-tree now con
30d00 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20  tains no cells. 
30d10 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67  The only sibling
30d20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20  .    ** page is 
30d30 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
30d40 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43  of the parent. C
30d50 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
30d60 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   of the.    ** c
30d70 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74  hild page into t
30d80 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65  he parent, decre
30d90 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c  asing the overal
30da0 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a  l height of the.
30db0 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74      ** b-tree st
30dc0 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20  ructure by one. 
30dd0 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62 65  This is describe
30de0 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63  d as the "balanc
30df0 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20  e-shallower".   
30e00 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68   ** sub-algorith
30e10 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65  m in some docume
30e20 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a  ntation..    **.
30e30 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
30e40 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
30e50 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
30e60 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43  all to copyNodeC
30e70 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a  ontent() .    **
30e80 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65   sets all pointe
30e90 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f  r-map entries co
30ea0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64  rresponding to d
30eb0 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70 61  atabase image pa
30ec0 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ges .    ** for 
30ed0 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65  which the pointe
30ee0 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68  r is stored with
30ef0 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62  in the content b
30f00 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20  eing copied..   
30f10 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
30f20 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c  econd assert bel
30f30 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61 74  ow verifies that
30f40 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
30f50 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a  is defragmented.
30f60 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20      ** (it must 
30f70 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75  be, as it was ju
30f80 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64  st reconstructed
30f90 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50   using assembleP
30fa0 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20  age()). This.   
30fb0 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   ** is important
30fc0 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   if the parent p
30fd0 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
30fe0 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  e page 1 of the 
30ff0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
31000 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61  image.  */.    a
31010 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29  ssert( nNew==1 )
31020 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  ;.    assert( ap
31030 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d  New[0]->nFree ==
31040 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32 62   .        (get2b
31050 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61  yte(&apNew[0]->a
31060 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30  Data[5])-apNew[0
31070 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70  ]->cellOffset-ap
31080 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29  New[0]->nCell*2)
31090 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28   .    );.    if(
310a0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
310b0 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  = copyNodeConten
310c0 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72  t(apNew[0], pPar
310d0 65 6e 74 29 29 20 29 7b 0a 20 20 20 20 20 20 72  ent)) ){.      r
310e0 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4e  c = freePage(apN
310f0 65 77 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ew[0]);.    }.  
31100 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55 54 4f  }else if( ISAUTO
31110 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f 2a  VACUUM ){.    /*
31120 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   Fix the pointer
31130 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
31140 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20 74   all the cells t
31150 68 61 74 20 77 65 72 65 20 73 68 69 66 74 65 64  hat were shifted
31160 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a 2a   around. .    **
31170 20 54 68 65 72 65 20 61 72 65 20 73 65 76 65 72   There are sever
31180 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79 70  al different typ
31190 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61  es of pointer-ma
311a0 70 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6e  p entries that n
311b0 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eed to.    ** be
311c0 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
311d0 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f 6d  his routine. Som
311e0 65 20 6f 66 20 74 68 65 73 65 20 68 61 76 65 20  e of these have 
311f0 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61 64 79  been set already
31200 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61 6e  , but.    ** man
31210 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68 65 20  y have not. The 
31220 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 73  following is a s
31230 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a 20  ummary:.    **. 
31240 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20 65     **   1) The e
31250 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
31260 64 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c 69  d with new sibli
31270 6e 67 20 70 61 67 65 73 20 74 68 61 74 20 77 65  ng pages that we
31280 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20 20  re not.    **   
31290 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68 65 6e     siblings when
312a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
312b0 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 73 65  as called. These
312c0 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
312d0 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 73    **      been s
312e0 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65 65  et. We don't nee
312f0 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74  d to worry about
31300 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74 68   old siblings th
31310 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a 20 20  at were.    **  
31320 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68 65      moved to the
31330 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68 65   free-list - the
31340 20 66 72 65 65 50 61 67 65 28 29 20 63 6f 64 65   freePage() code
31350 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65 0a   has taken care.
31360 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66 20 74      **      of t
31370 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  hose..    **.   
31380 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70 6f 69   **   2) The poi
31390 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
313a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
313b0 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
313c0 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  low.    **      
313d0 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65 72  page in any over
313e0 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65 64  flow chains used
313f0 20 62 79 20 6e 65 77 20 64 69 76 69 64 65 72 20   by new divider 
31400 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20 20  cells. These .  
31410 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20 61    **      have a
31420 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65 6e  lso already been
31430 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20 62   taken care of b
31440 79 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c  y the insertCell
31450 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a  () code..    **.
31460 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20 74      **   3) If t
31470 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  he sibling pages
31480 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
31490 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
314a0 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20  pages of.    ** 
314b0 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72 65       cells store
314c0 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e 67  d on the sibling
314d0 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64 20   pages may need 
314e0 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
314f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 34     **.    **   4
31500 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  ) If the sibling
31510 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 69   pages are not i
31520 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e  nternal intkey n
31530 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a 20  odes, then any. 
31540 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65 72 66     **      overf
31550 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64 20 62  low pages used b
31560 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20 6d 61  y these cells ma
31570 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64  y need to be upd
31580 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  ated.    **     
31590 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65   (internal intke
315a0 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63 6f  y nodes never co
315b0 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74  ntain pointers t
315c0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
315d0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
315e0 20 20 20 35 29 20 49 66 20 74 68 65 20 73 69 62     5) If the sib
315f0 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e  ling pages are n
31600 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
31610 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
31620 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e 74 72      **      entr
31630 69 65 73 20 66 6f 72 20 74 68 65 20 72 69 67 68  ies for the righ
31640 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66  t-child pages of
31650 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20 6d 61   each sibling ma
31660 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20 20  y need.    **   
31670 20 20 20 74 6f 20 62 65 20 75 70 64 61 74 65 64     to be updated
31680 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
31690 43 61 73 65 73 20 31 20 61 6e 64 20 32 20 61 72  Cases 1 and 2 ar
316a0 65 20 64 65 61 6c 74 20 77 69 74 68 20 61 62 6f  e dealt with abo
316b0 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65  ve by other code
316c0 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  . The next.    *
316d0 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  * block deals wi
316e0 74 68 20 63 61 73 65 73 20 33 20 61 6e 64 20 34  th cases 3 and 4
316f0 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61 66 74   and the one aft
31700 65 72 20 74 68 61 74 2c 20 63 61 73 65 20 35 2e  er that, case 5.
31710 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73 65   Since.    ** se
31720 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20  tting a pointer 
31730 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61 20 72  map entry is a r
31740 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65 6e 73  elatively expens
31750 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74  ive operation, t
31760 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  his.    ** code 
31770 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74 65  only sets pointe
31780 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
31790 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66  r child or overf
317a0 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 68  low pages that h
317b0 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74 75 61  ave.    ** actua
317c0 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77 65 65  lly moved betwee
317d0 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20 20  n pages.  */.   
317e0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
317f0 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20 4d   apNew[0];.    M
31800 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61  emPage *pOld = a
31810 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69 6e  pCopy[0];.    in
31820 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f  t nOverflow = pO
31830 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
31840 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64 20     int iNextOld 
31850 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20  = pOld->nCell + 
31860 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
31870 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28  nt iOverflow = (
31880 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c 64  nOverflow ? pOld
31890 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 3a  ->aOvfl[0].idx :
318a0 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b   -1);.    j = 0;
318b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
318d0 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69  Current 'old' si
318e0 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20  bling page */.  
318f0 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20    k = 0;        
31900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31910 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
31920 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61  'new' sibling pa
31930 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  ge */.    for(i=
31940 30 3b 20 69 3c 6e 43 65 6c 6c 20 26 26 20 72 63  0; i<nCell && rc
31950 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
31960 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 44  ){.      int isD
31970 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  ivider = 0;.    
31980 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78    while( i==iNex
31990 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20  tOld ){.        
319a0 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65  /* Cell i is the
319b0 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   cell immediatel
319c0 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
319d0 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64  last cell on old
319e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c  .        ** sibl
319f0 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66 20 74  ing page j. If t
31a00 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
31a10 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f  not leaf pages o
31a20 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f an.        ** 
31a30 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74  intkey b-tree, t
31a40 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73 20 61  hen cell i was a
31a50 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a   divider cell. *
31a60 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d  /.        pOld =
31a70 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20   apCopy[++j];.  
31a80 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d        iNextOld =
31a90 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b   i + !leafData +
31aa0 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70   pOld->nCell + p
31ab0 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
31ac0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64          if( pOld
31ad0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
31ae0 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c           nOverfl
31af0 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72  ow = pOld->nOver
31b00 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  flow;.          
31b10 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20  iOverflow = i + 
31b20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64  !leafData + pOld
31b30 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a  ->aOvfl[0].idx;.
31b40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31b50 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 21 6c    isDivider = !l
31b60 65 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20 20  eafData;  .     
31b70 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
31b80 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20  (nOverflow>0 || 
31b90 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20  iOverflow<i );. 
31ba0 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65       assert(nOve
31bb0 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d  rflow<2 || pOld-
31bc0 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70  >aOvfl[0].idx==p
31bd0 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64  Old->aOvfl[1].id
31be0 78 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  x-1);.      asse
31bf0 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c  rt(nOverflow<3 |
31c00 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d  | pOld->aOvfl[1]
31c10 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66  .idx==pOld->aOvf
31c20 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20  l[2].idx-1);.   
31c30 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66     if( i==iOverf
31c40 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69  low ){.        i
31c50 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20  sDivider = 1;.  
31c60 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76        if( (--nOv
31c70 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20  erflow)>0 ){.   
31c80 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77         iOverflow
31c90 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
31ca0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
31cb0 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b   i==cntNew[k] ){
31cc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c  .        /* Cell
31cd0 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69   i is the cell i
31ce0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
31cf0 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65  wing the last ce
31d00 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20  ll on new.      
31d10 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67    ** sibling pag
31d20 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c  e k. If the sibl
31d30 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
31d40 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20  f pages of an.  
31d50 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20        ** intkey 
31d60 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c  b-tree, then cel
31d70 6c 20 69 20 69 73 20 61 20 64 69 76 69 64 65 72  l i is a divider
31d80 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   cell.  */.     
31d90 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
31da0 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  ++k];.        if
31db0 28 20 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f  ( !leafData ) co
31dc0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
31dd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
31de0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
31df0 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
31e00 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Old );.      ass
31e10 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a  ert( k<nNew );..
31e20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
31e30 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61  cell was origina
31e40 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c  lly divider cell
31e50 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77   (and is not now
31e60 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e  ) or.      ** an
31e70 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
31e80 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77  or if the cell w
31e90 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  as located on a 
31ea0 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e  different siblin
31eb0 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20  g.      ** page 
31ec0 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e  before the balan
31ed0 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70  cing, then the p
31ee0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
31ef0 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  es associated.  
31f00 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20      ** with any 
31f10 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f  child or overflo
31f20 77 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  w pages need to 
31f30 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a  be updated.  */.
31f40 20 20 20 20 20 20 69 66 28 20 69 73 44 69 76 69        if( isDivi
31f50 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e  der || pOld->pgn
31f60 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b  o!=pNew->pgno ){
31f70 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65  .        if( !le
31f80 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a  afCorrection ){.
31f90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
31fa0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65  trmapPut(pBt, ge
31fb0 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69 5d  t4byte(apCell[i]
31fc0 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  ), PTRMAP_BTREE,
31fd0 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20   pNew->pgno);.  
31fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31ff0 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e  if( szCell[i]>pN
32000 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 26 26 20  ew->minLocal && 
32010 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
32020 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32030 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
32040 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d  (pNew, apCell[i]
32050 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
32060 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
32070 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74  if( !leafCorrect
32080 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ion ){.      for
32090 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
320a0 5f 4f 4b 20 26 26 20 69 3c 6e 4e 65 77 3b 20 69  _OK && i<nNew; i
320b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ++){.        rc 
320c0 3d 20 70 74 72 6d 61 70 50 75 74 28 0a 09 20 20  = ptrmapPut(..  
320d0 20 20 70 42 74 2c 20 67 65 74 34 62 79 74 65 28    pBt, get4byte(
320e0 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61  &apNew[i]->aData
320f0 5b 38 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52  [8]), PTRMAP_BTR
32100 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67  EE, apNew[i]->pg
32110 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
32120 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a   }..#if 0.    /*
32130 20 54 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b   The ptrmapCheck
32140 50 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73  Pages() contains
32150 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
32160 65 6e 74 73 20 74 68 61 74 20 76 65 72 69 66 79  ents that verify
32170 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c   that.    ** all
32180 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
32190 65 73 20 61 72 65 20 73 65 74 20 63 6f 72 72 65  es are set corre
321a0 63 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65  ctly. This is he
321b0 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20  lpful while .   
321c0 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54   ** debugging. T
321d0 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64  his is usually d
321e0 69 73 61 62 6c 65 64 20 62 65 63 61 75 73 65 20  isabled because 
321f0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
32200 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61  se may.    ** ca
32210 75 73 65 20 61 6e 20 61 73 73 65 72 74 28 29 20  use an assert() 
32220 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69  statement to fai
32230 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61  l.  */.    ptrma
32240 70 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65  pCheckPages(apNe
32250 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74  w, nNew);.    pt
32260 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 26  rmapCheckPages(&
32270 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e  pParent, 1);.#en
32280 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  dif.  }..  asser
32290 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e  t( pParent->isIn
322a0 69 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22  it );.  TRACE(("
322b0 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65  BALANCE: finishe
322c0 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64  d: old=%d new=%d
322d0 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20   cells=%d\n",.  
322e0 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e          nOld, nN
322f0 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20  ew, nCell));..  
32300 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20  /*.  ** Cleanup 
32310 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
32320 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63  ..  */.balance_c
32330 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
32340 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43  3ScratchFree(apC
32350 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ell);.  for(i=0;
32360 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
32370 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
32380 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pOld[i]);.  }.  
32390 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
323a0 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
323b0 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29  sePage(apNew[i])
323c0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
323d0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
323e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
323f0 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72  alled when the r
32400 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
32410 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
32420 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68  s.** overfull (h
32430 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  as one or more o
32440 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a  verflow pages)..
32450 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c  **.** A new chil
32460 64 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61  d page is alloca
32470 74 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ted and the cont
32480 65 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72 72  ents of the curr
32490 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  ent root.** page
324a0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72  , including over
324b0 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65 20  flow cells, are 
324c0 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
324d0 63 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a  child. The root.
324e0 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  ** page is then 
324f0 6f 76 65 72 77 72 69 74 74 65 6e 20 74 6f 20 6d  overwritten to m
32500 61 6b 65 20 69 74 20 61 6e 20 65 6d 70 74 79 20  ake it an empty 
32510 70 61 67 65 20 77 69 74 68 20 74 68 65 20 72 69  page with the ri
32520 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f  ght-child .** po
32530 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 74  inter pointing t
32540 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 0a  o the new page..
32550 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
32560 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e  urning, all poin
32570 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
32580 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
32590 20 70 61 67 65 73 20 0a 2a 2a 20 74 68 61 74 20   pages .** that 
325a0 74 68 65 20 6e 65 77 20 63 68 69 6c 64 2d 70 61  the new child-pa
325b0 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  ge now contains 
325c0 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 65 20  pointers to are 
325d0 75 70 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20  updated. The.** 
325e0 65 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64  entry correspond
325f0 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 72  ing to the new r
32600 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  ight-child point
32610 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a  er of the root.*
32620 2a 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20 75  * page is also u
32630 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  pdated..**.** If
32640 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70   successful, *pp
32650 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20  Child is set to 
32660 63 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65  contain a refere
32670 6e 63 65 20 74 6f 20 74 68 65 20 63 68 69 6c 64  nce to the child
32680 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20 53 51   .** page and SQ
32690 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
326a0 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
326b0 65 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  e the caller is 
326c0 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63  required.** to c
326d0 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
326e0 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65 78  ) on *ppChild ex
326f0 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61  actly once. If a
32700 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  n error occurs,.
32710 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
32720 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
32730 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74   *ppChild is set
32740 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63   to 0..*/.static
32750 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65   int balance_dee
32760 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f  per(MemPage *pRo
32770 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  ot, MemPage **pp
32780 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63  Child){.  int rc
32790 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
327a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
327b0 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75  rn value from su
327c0 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
327d0 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
327e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
327f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
32800 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a  new child page *
32810 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  /.  Pgno pgnoChi
32820 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
32830 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
32840 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69  r of the new chi
32850 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53  ld page */.  BtS
32860 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52 6f  hared *pBt = pRo
32870 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54  ot->pBt;    /* T
32880 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61  he BTree */..  a
32890 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f  ssert( pRoot->nO
328a0 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61  verflow>0 );.  a
328b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
328c0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
328d0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d  utex) );..  /* M
328e0 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65 20 72  ake pRoot, the r
328f0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
32900 62 2d 74 72 65 65 2c 20 77 72 69 74 61 62 6c 65  b-tree, writable
32910 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  . Allocate a new
32920 20 0a 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74   .  ** page that
32930 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
32940 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64   new right-child
32950 20 6f 66 20 70 50 61 67 65 2e 20 43 6f 70 79 20   of pPage. Copy 
32960 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a  the contents.  *
32970 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 73 74  * of the node st
32980 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e  ored on pRoot in
32990 74 6f 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  to the new child
329a0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
329b0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
329c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
329d0 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  rite(pRoot->pDbP
329e0 61 67 65 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  age)).   || SQLI
329f0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 61 6c 6c  TE_OK!=(rc = all
32a00 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
32a10 42 74 2c 26 70 43 68 69 6c 64 2c 26 70 67 6e 6f  Bt,&pChild,&pgno
32a20 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67 6e  Child,pRoot->pgn
32a30 6f 2c 30 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  o,0)).   || SQLI
32a40 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 63 6f 70  TE_OK!=(rc = cop
32a50 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52 6f  yNodeContent(pRo
32a60 6f 74 2c 20 70 43 68 69 6c 64 29 29 0a 20 20 20  ot, pChild)).   
32a70 7c 7c 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d  || (ISAUTOVACUUM
32a80 20 26 26 20 0a 20 20 20 20 20 20 20 53 51 4c 49   && .       SQLI
32a90 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 70 74 72  TE_OK!=(rc = ptr
32aa0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
32ab0 43 68 69 6c 64 2c 20 50 54 52 4d 41 50 5f 42 54  Child, PTRMAP_BT
32ac0 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  REE, pRoot->pgno
32ad0 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 70  ))).  ){.    *pp
32ae0 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72  Child = 0;.    r
32af0 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
32b00 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  d);.    return r
32b10 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
32b20 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
32b30 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d  riteable(pChild-
32b40 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
32b50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
32b60 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
32b70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29  Root->pDbPage) )
32b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69  ;.  assert( pChi
32b90 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74  ld->nCell==pRoot
32ba0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52  ->nCell );..  TR
32bb0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
32bc0 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f  opy root %d into
32bd0 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70   %d\n", pRoot->p
32be0 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  gno, pChild->pgn
32bf0 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20  o));..  /* Copy 
32c00 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
32c10 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f  ls from pRoot to
32c20 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d   pChild */.  mem
32c30 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66  cpy(pChild->aOvf
32c40 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c  l, pRoot->aOvfl,
32c50 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f   pRoot->nOverflo
32c60 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e  w*sizeof(pRoot->
32c70 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  aOvfl[0]));.  pC
32c80 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
32c90 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c  = pRoot->nOverfl
32ca0 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74  ow;..  /* Zero t
32cb0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
32cc0 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73 74 61  Root. Then insta
32cd0 6c 6c 20 70 43 68 69 6c 64 20 61 73 20 74 68 65  ll pChild as the
32ce0 20 72 69 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f   right-child. */
32cf0 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f  .  zeroPage(pRoo
32d00 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  t, pChild->aData
32d10 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29  [0] & ~PTF_LEAF)
32d20 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 52  ;.  put4byte(&pR
32d30 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
32d40 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
32d50 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a  pgnoChild);..  *
32d60 70 70 43 68 69 6c 64 20 3d 20 70 43 68 69 6c 64  ppChild = pChild
32d70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
32d80 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
32d90 68 65 20 70 61 67 65 20 74 68 61 74 20 70 43 75  he page that pCu
32da0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
32db0 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62  ts to has just b
32dc0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a  een modified in.
32dd0 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69  ** some way. Thi
32de0 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72  s function figur
32df0 65 73 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d  es out if this m
32e00 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e  odification mean
32e10 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65  s the.** tree ne
32e20 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63  eds to be balanc
32e30 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61  ed, and if so ca
32e40 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72 69  lls the appropri
32e50 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a  ate balancing .*
32e60 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e  * routine. Balan
32e70 63 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  cing routines ar
32e80 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e  e:.**.**   balan
32e90 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20  ce_quick().**   
32ea0 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
32eb0 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f  .**   balance_no
32ec0 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61 74 69  nroot().*/.stati
32ed0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74  c int balance(Bt
32ee0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
32ef0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
32f00 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  _OK;.  const int
32f10 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42   nMin = pCur->pB
32f20 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2a 20  t->usableSize * 
32f30 32 20 2f 20 33 3b 0a 20 20 75 38 20 61 42 61 6c  2 / 3;.  u8 aBal
32f40 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 31  anceQuickSpace[1
32f50 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20  3];.  u8 *pFree 
32f60 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59  = 0;..  TESTONLY
32f70 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  ( int balance_qu
32f80 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29  ick_called = 0 )
32f90 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e  ;.  TESTONLY( in
32fa0 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  t balance_deeper
32fb0 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a  _called = 0 );..
32fc0 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69    do {.    int i
32fd0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
32fe0 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  ge;.    MemPage 
32ff0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
33000 70 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20  pPage[iPage];.. 
33010 20 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20     if( iPage==0 
33020 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
33030 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  ge->nOverflow ){
33040 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
33050 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
33060 20 62 2d 74 72 65 65 20 69 73 20 6f 76 65 72 66   b-tree is overf
33070 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ull. In this cas
33080 65 20 63 61 6c 6c 20 74 68 65 0a 20 20 20 20 20  e call the.     
33090 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65     ** balance_de
330a0 65 70 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  eper() function 
330b0 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
330c0 63 68 69 6c 64 20 66 6f 72 20 74 68 65 20 72 6f  child for the ro
330d0 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20  ot-page.        
330e0 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74 68 65 20  ** and copy the 
330f0 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
33100 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
33110 65 20 74 6f 20 69 74 2e 20 54 68 65 0a 20 20 20  e to it. The.   
33120 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74 65       ** next ite
33130 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
33140 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e  -loop will balan
33150 63 65 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  ce the child pag
33160 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20 0a 20  e..        */ . 
33170 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
33180 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63  balance_deeper_c
33190 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20  alled++)==0 );. 
331a0 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
331b0 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65  nce_deeper(pPage
331c0 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
331d0 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
331e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
331f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  {.          pCur
33200 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20 20 20  ->iPage = 1;.   
33210 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
33220 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  dx[0] = 0;.     
33230 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
33240 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [1] = 0;.       
33250 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
33260 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65  >apPage[1]->nOve
33270 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20 20 20  rflow );.       
33280 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
33290 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
332a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
332b0 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
332c0 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67  rflow==0 && pPag
332d0 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29  e->nFree<=nMin )
332e0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
332f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33300 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73 74 20  MemPage * const 
33310 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e  pParent = pCur->
33320 61 70 50 61 67 65 5b 69 50 61 67 65 2d 31 5d 3b  apPage[iPage-1];
33330 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  .      int const
33340 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69   iIdx = pCur->ai
33350 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a 20  Idx[iPage-1];.. 
33360 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33370 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72  3PagerWrite(pPar
33380 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
33390 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
333a0 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64 65  ITE_OK ){.#ifnde
333b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
333c0 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20 20 20  ICKBALANCE.     
333d0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
333e0 73 44 61 74 61 0a 20 20 20 20 20 20 20 20 20 26  sData.         &
333f0 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  & pPage->nOverfl
33400 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 26  ow==1.         &
33410 26 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  & pPage->aOvfl[0
33420 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43  ].idx==pPage->nC
33430 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20  ell.         && 
33440 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31  pParent->pgno!=1
33450 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
33460 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64  rent->nCell==iId
33470 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  x.        ){.   
33480 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 62         /* Call b
33490 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 74  alance_quick() t
334a0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 73  o create a new s
334b0 69 62 6c 69 6e 67 20 6f 66 20 70 50 61 67 65 20  ibling of pPage 
334c0 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  on which.       
334d0 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74     ** to store t
334e0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
334f0 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  . balance_quick(
33500 29 20 69 6e 73 65 72 74 73 20 61 20 6e 65 77 20  ) inserts a new 
33510 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a  cell.          *
33520 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2c 20  * into pParent, 
33530 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65 20  which may cause 
33540 70 50 61 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  pParent overflow
33550 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20 20 20  . If this.      
33560 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20      ** happens, 
33570 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72 61 74  the next interat
33580 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
33590 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  op will balance 
335a0 70 50 61 72 65 6e 74 20 0a 20 20 20 20 20 20 20  pParent .       
335b0 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68 65 72     ** use either
335c0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
335d0 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f 64 65  () or balance_de
335e0 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20 74 68  eper(). Until th
335f0 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
33600 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f 76 65  happens, the ove
33610 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 73 74  rflow cell is st
33620 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42 61 6c  ored in the aBal
33630 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d  anceQuickSpace[]
33640 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
33650 66 66 65 72 2e 20 0a 20 20 20 20 20 20 20 20 20  ffer. .         
33660 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
33670 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
33680 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
33690 73 65 72 74 28 29 20 69 73 20 74 6f 20 63 68 65  sert() is to che
336a0 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61 0a 20  ck that only a. 
336b0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
336c0 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  le call to balan
336d0 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 61  ce_quick() is ma
336e0 64 65 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c  de for each call
336f0 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20 20   to this.       
33700 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
33710 49 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f 74  If this were not
33720 20 76 65 72 69 66 69 65 64 2c 20 61 20 73 75 62   verified, a sub
33730 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76 69 6e  tle bug involvin
33740 67 20 72 65 75 73 65 0a 20 20 20 20 20 20 20 20  g reuse.        
33750 20 20 2a 2a 20 6f 66 20 74 68 65 20 61 42 61 6c    ** of the aBal
33760 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d  anceQuickSpace[]
33770 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 2e   might sneak in.
33780 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
33790 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
337a0 28 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63  (balance_quick_c
337b0 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20  alled++)==0 );. 
337c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61           rc = ba
337d0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 72  lance_quick(pPar
337e0 65 6e 74 2c 20 70 50 61 67 65 2c 20 61 42 61 6c  ent, pPage, aBal
337f0 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 29 3b  anceQuickSpace);
33800 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
33810 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
33820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
33830 74 68 69 73 20 63 61 73 65 2c 20 63 61 6c 6c 20  this case, call 
33840 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
33850 29 20 74 6f 20 72 65 64 69 73 74 72 69 62 75 74  ) to redistribut
33860 65 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20  e cells.        
33870 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 70 50 61    ** between pPa
33880 67 65 20 61 6e 64 20 75 70 20 74 6f 20 32 20 6f  ge and up to 2 o
33890 66 20 69 74 73 20 73 69 62 6c 69 6e 67 20 70 61  f its sibling pa
338a0 67 65 73 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76  ges. This involv
338b0 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
338c0 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
338d0 6e 74 65 6e 74 73 20 6f 66 20 70 50 61 72 65 6e  ntents of pParen
338e0 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75  t, which may cau
338f0 73 65 20 70 50 61 72 65 6e 74 20 74 6f 0a 20 20  se pParent to.  
33900 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d          ** becom
33910 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e  e overfull or un
33920 64 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e 65 78  derfull. The nex
33930 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
33940 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20  he do-loop.     
33950 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 61 6c       ** will bal
33960 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
33970 70 61 67 65 20 74 6f 20 63 6f 72 72 65 63 74 20  page to correct 
33980 74 68 69 73 2e 0a 20 20 20 20 20 20 20 20 20 20  this..          
33990 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ** .          **
339a0 20 49 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   If the parent p
339b0 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72  age becomes over
339c0 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72 66 6c  full, the overfl
339d0 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c 6c 73  ow cell or cells
339e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72  .          ** ar
339f0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
33a00 70 53 70 61 63 65 20 62 75 66 66 65 72 20 61 6c  pSpace buffer al
33a10 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69 61 74  located immediat
33a20 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20 20 20  ely below. .    
33a30 20 20 20 20 20 20 2a 2a 20 41 20 73 75 62 73 65        ** A subse
33a40 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 20  quent iteration 
33a50 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77  of the do-loop w
33a60 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 20 74 68  ill deal with th
33a70 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 20 20  is by.          
33a80 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c 61 6e  ** calling balan
33a90 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28 62 61  ce_nonroot() (ba
33aa0 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 6d  lance_deeper() m
33ab0 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72  ay be called fir
33ac0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  st,.          **
33ad0 20 62 75 74 20 69 74 20 64 6f 65 73 6e 27 74 20   but it doesn't 
33ae0 64 65 61 6c 20 77 69 74 68 20 6f 76 65 72 66 6c  deal with overfl
33af0 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73 74 20  ow cells - just 
33b00 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f 20 61 0a  moves them to a.
33b10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 66            ** dif
33b20 66 65 72 65 6e 74 20 70 61 67 65 29 2e 20 4f 6e  ferent page). On
33b30 63 65 20 74 68 69 73 20 73 75 62 73 65 71 75 65  ce this subseque
33b40 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  nt call to balan
33b50 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20 20  ce_nonroot() .  
33b60 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 63          ** has c
33b70 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20 69 73 20  ompleted, it is 
33b80 73 61 66 65 20 74 6f 20 72 65 6c 65 61 73 65 20  safe to release 
33b90 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
33ba0 72 20 75 73 65 64 20 62 79 0a 20 20 20 20 20 20  r used by.      
33bb0 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 76 69      ** the previ
33bc0 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20 74 68 65  ous call, as the
33bd0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 64   overflow cell d
33be0 61 74 61 20 77 69 6c 6c 20 68 61 76 65 20 62 65  ata will have be
33bf0 65 6e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  en .          **
33c00 20 63 6f 70 69 65 64 20 65 69 74 68 65 72 20 69   copied either i
33c10 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
33c20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
33c30 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a  or into the new.
33c40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 53 70            ** pSp
33c50 61 63 65 20 62 75 66 66 65 72 20 70 61 73 73 65  ace buffer passe
33c60 64 20 74 6f 20 74 68 65 20 6c 61 74 74 65 72 20  d to the latter 
33c70 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f  call to balance_
33c80 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20 20 20  nonroot()..     
33c90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
33ca0 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 73    u8 *pSpace = s
33cb0 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
33cc0 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65  (pCur->pBt->page
33cd0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
33ce0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f   rc = balance_no
33cf0 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c 20 69  nroot(pParent, i
33d00 49 64 78 2c 20 70 53 70 61 63 65 2c 20 69 50 61  Idx, pSpace, iPa
33d10 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20 20 20  ge==1);.        
33d20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
33d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
33d40 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20 4e 55   pFree is not NU
33d50 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  LL, it points to
33d60 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
33d70 65 72 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  er used .       
33d80 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70 72 65       ** by a pre
33d90 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62 61  vious call to ba
33da0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e  lance_nonroot().
33db0 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 61 72   Its contents ar
33dc0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
33dd0 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69 74 68   now stored eith
33de0 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74 61 62  er on real datab
33df0 61 73 65 20 70 61 67 65 73 20 6f 72 20 77 69 74  ase pages or wit
33e00 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20  hin the .       
33e10 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53 70 61       ** new pSpa
33e20 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20 69 74  ce buffer, so it
33e30 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20 66   may be safely f
33e40 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20  reed here. */.  
33e50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
33e60 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29  3PageFree(pFree)
33e70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
33e80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
33e90 70 53 70 61 63 65 20 62 75 66 66 65 72 20 77 69  pSpace buffer wi
33ea0 6c 6c 20 62 65 20 66 72 65 65 64 20 61 66 74 65  ll be freed afte
33eb0 72 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  r the next call 
33ec0 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
33ed0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
33ee0 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66 6f 72  ), or just befor
33ef0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
33f00 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68 65 76  returns, whichev
33f10 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
33f20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a 2f 0a  comes first. */.
33f30 20 20 20 20 20 20 20 20 20 20 70 46 72 65 65 20            pFree 
33f40 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20  = pSpace;.      
33f50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
33f60 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66     pPage->nOverf
33f70 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  low = 0;..      
33f80 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 74 65 72  /* The next iter
33f90 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
33fa0 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20 74 68  loop balances th
33fb0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 2a  e parent page. *
33fc0 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
33fd0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
33fe0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
33ff0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
34000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34010 3b 0a 0a 20 20 69 66 28 20 70 46 72 65 65 20 29  ;..  if( pFree )
34020 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
34030 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20  eFree(pFree);.  
34040 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
34050 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  .../*.** Insert 
34060 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
34070 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68  o the BTree.  Th
34080 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62  e key is given b
34090 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a  y (pKey,nKey).**
340a0 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73   and the data is
340b0 20 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61   given by (pData
340c0 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75  ,nData).  The cu
340d0 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c  rsor is used onl
340e0 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77  y to.** define w
340f0 68 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65  hat table the re
34100 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69  cord should be i
34110 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54  nserted into.  T
34120 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
34130 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
34140 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69   a random locati
34150 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e  on..**.** For an
34160 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f   INTKEY table, o
34170 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c  nly the nKey val
34180 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73  ue of the key is
34190 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a   used.  pKey is.
341a0 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72  ** ignored.  For
341b0 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c   a ZERODATA tabl
341c0 65 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64  e, the pData and
341d0 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20   nData are both 
341e0 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
341f0 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74  f the seekResult
34200 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
34210 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73  n-zero, then a s
34220 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74  uccessful call t
34230 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70 61 63  o.** MovetoUnpac
34240 6b 65 64 28 29 20 74 6f 20 73 65 65 6b 20 63 75  ked() to seek cu
34250 72 73 6f 72 20 70 43 75 72 20 74 6f 20 28 70 4b  rsor pCur to (pK
34260 65 79 2c 20 6e 4b 65 79 29 20 68 61 73 20 61 6c  ey, nKey) has al
34270 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65  ready.** been pe
34280 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65 73  rformed. seekRes
34290 75 6c 74 20 69 73 20 74 68 65 20 73 65 61 72 63  ult is the searc
342a0 68 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65  h result returne
342b0 64 20 28 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a  d (a negative.**
342c0 20 6e 75 6d 62 65 72 20 69 66 20 70 43 75 72 20   number if pCur 
342d0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 6e 74  points at an ent
342e0 72 79 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  ry that is small
342f0 65 72 20 74 68 61 6e 20 28 70 4b 65 79 2c 20 6e  er than (pKey, n
34300 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f  Key), or.** a po
34310 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
34320 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
34330 6e 20 65 74 72 79 20 74 68 61 74 20 69 73 20 6c  n etry that is l
34340 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20 28  arger than .** (
34350 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a  pKey, nKey)). .*
34360 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b  *.** If the seek
34370 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72  Result parameter
34380 20 69 73 20 30 2c 20 74 68 65 6e 20 63 75 72 73   is 0, then curs
34390 6f 72 20 70 43 75 72 20 6d 61 79 20 70 6f 69 6e  or pCur may poin
343a0 74 20 74 6f 20 61 6e 79 20 0a 2a 2a 20 65 6e 74  t to any .** ent
343b0 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74 72  ry or to no entr
343c0 79 20 61 74 20 61 6c 6c 2e 20 49 6e 20 74 68 69  y at all. In thi
343d0 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63  s case this func
343e0 74 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 65 6b  tion has to seek
343f0 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 62  .** the cursor b
34400 65 66 6f 72 65 20 74 68 65 20 6e 65 77 20 6b 65  efore the new ke
34410 79 20 63 61 6e 20 62 65 20 69 6e 73 65 72 74 65  y can be inserte
34420 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
34430 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20  3BtreeInsert(.  
34440 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
34450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34460 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
34470 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20  to the table of 
34480 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20  this cursor */. 
34490 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
344a0 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
344b0 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68  /* The key of th
344c0 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
344d0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
344e0 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20  ata, int nData, 
344f0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20   /* The data of 
34500 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
34510 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
34520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34530 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
34540 65 78 74 72 61 20 30 20 62 79 74 65 73 20 74 6f  extra 0 bytes to
34550 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20   append to data 
34560 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42  */.  int appendB
34570 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ias,            
34580 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
34590 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e  his is likely an
345a0 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74   append */.  int
345b0 20 73 65 65 6b 52 65 73 75 6c 74 20 20 20 20 20   seekResult     
345c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
345d0 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 4d  esult of prior M
345e0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
345f0 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  call */.){.  int
34600 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20 3d   rc;.  int loc =
34610 20 73 65 65 6b 52 65 73 75 6c 74 3b 0a 20 20 69   seekResult;.  i
34620 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20  nt szNew;.  int 
34630 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
34640 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a  pPage;.  Btree *
34650 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
34660 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
34670 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e  t = p->pBt;.  un
34680 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64  signed char *old
34690 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Cell;.  unsigned
346a0 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d   char *newCell =
346b0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
346c0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
346d0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
346e0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
346f0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
34700 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
34710 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
34720 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
34730 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 61 73  ->wrFlag );.  as
34740 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
34750 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
34760 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
34770 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21   pCur->pKeyInfo!
34780 3d 30 2c 20 32 29 20 29 3b 0a 0a 20 20 2f 2a 20  =0, 2) );..  /* 
34790 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
347a0 73 65 72 74 20 69 6e 74 6f 20 61 20 74 61 62 6c  sert into a tabl
347b0 65 20 62 2d 74 72 65 65 2c 20 69 6e 76 61 6c 69  e b-tree, invali
347c0 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f  date any incrblo
347d0 62 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20  b .  ** cursors 
347e0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20  open on the row 
347f0 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 28  being replaced (
34800 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 69 73  assuming this is
34810 20 61 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20   a replace.  ** 
34820 6f 70 65 72 61 74 69 6f 6e 20 2d 20 69 66 20 69  operation - if i
34830 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 66 6f  t is not, the fo
34840 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 2d  llowing is a no-
34850 6f 70 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  op).  */.  if( p
34860 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
34870 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   ){.    invalida
34880 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
34890 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  s(p, pCur->pgnoR
348a0 6f 6f 74 2c 20 6e 4b 65 79 2c 20 30 29 3b 0a 20  oot, nKey, 0);. 
348b0 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   }..  if( pCur->
348c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
348d0 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
348e0 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCur->skip;. 
348f0 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
34900 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
34910 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
34920 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61   open on this ta
34930 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
34940 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
34950 65 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 4d  e call to btreeM
34960 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69 73  oveto() below is
34970 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20 20   a no-op. For.  
34980 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  ** example, when
34990 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61 20   inserting data 
349a0 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74  into a table wit
349b0 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64  h auto-generated
349c0 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b 65   integer.  ** ke
349d0 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61 79  ys, the VDBE lay
349e0 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74  er invokes sqlit
349f0 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 74 6f  e3BtreeLast() to
34a00 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   figure out the 
34a10 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b 65  .  ** integer ke
34a20 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68 65  y to use. It the
34a30 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  n calls this fun
34a40 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c 6c  ction to actuall
34a50 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20 20  y insert the .  
34a60 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  ** data into the
34a70 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e 20   intkey B-Tree. 
34a80 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 74 72  In this case btr
34a90 65 65 4d 6f 76 65 74 6f 28 29 20 72 65 63 6f 67  eeMoveto() recog
34aa0 6e 69 7a 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  nizes.  ** that 
34ab0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
34ac0 72 65 61 64 79 20 77 68 65 72 65 20 69 74 20 6e  ready where it n
34ad0 65 65 64 73 20 74 6f 20 62 65 20 61 6e 64 20 72  eeds to be and r
34ae0 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 0a 20  eturns without. 
34af0 20 2a 2a 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f   ** doing any wo
34b00 72 6b 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 77  rk. To avoid thw
34b10 61 72 74 69 6e 67 20 74 68 65 73 65 20 6f 70 74  arting these opt
34b20 69 6d 69 7a 61 74 69 6f 6e 73 2c 20 69 74 20 69  imizations, it i
34b30 73 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20 2a 2a  s important.  **
34b40 20 6e 6f 74 20 74 6f 20 63 6c 65 61 72 20 74 68   not to clear th
34b50 65 20 63 75 72 73 6f 72 20 68 65 72 65 2e 0a 20  e cursor here.. 
34b60 20 2a 2f 0a 20 20 69 66 28 0a 20 20 20 20 53 51   */.  if(.    SQ
34b70 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
34b80 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
34b90 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
34ba0 74 2c 20 70 43 75 72 29 29 20 7c 7c 20 28 21 6c  t, pCur)) || (!l
34bb0 6f 63 20 26 26 0a 20 20 20 20 53 51 4c 49 54 45  oc &&.    SQLITE
34bc0 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65  _OK!=(rc = btree
34bd0 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65  Moveto(pCur, pKe
34be0 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42  y, nKey, appendB
34bf0 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 29  ias, &loc)).  ))
34c00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
34c10 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
34c20 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
34c30 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 43  SOR_VALID || (pC
34c40 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
34c50 4f 52 5f 49 4e 56 41 4c 49 44 20 26 26 20 6c 6f  OR_INVALID && lo
34c60 63 29 20 29 3b 0a 0a 20 20 70 50 61 67 65 20 3d  c) );..  pPage =
34c70 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
34c80 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
34c90 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
34ca0 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29  Key || nKey>=0 )
34cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34cc0 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67  e->leaf || !pPag
34cd0 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 54  e->intKey );.  T
34ce0 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74  RACE(("INSERT: t
34cf0 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c  able=%d nkey=%ll
34d00 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d  d ndata=%d page=
34d10 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
34d20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
34d30 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c  ot, nKey, nData,
34d40 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20   pPage->pgno,.  
34d50 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f          loc==0 ?
34d60 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22   "overwrite" : "
34d70 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20  new entry"));.  
34d80 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
34d90 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63  sInit );.  alloc
34da0 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
34db0 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70  );.  newCell = p
34dc0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  Bt->pTmpSpace;. 
34dd0 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20   if( newCell==0 
34de0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
34df0 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69  NOMEM;.  rc = fi
34e00 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20  llInCell(pPage, 
34e10 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e  newCell, pKey, n
34e20 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  Key, pData, nDat
34e30 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77  a, nZero, &szNew
34e40 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
34e50 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
34e60 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d   assert( szNew==
34e70 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
34e80 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20  e, newCell) );. 
34e90 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d   assert( szNew<=
34ea0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
34eb0 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70 43 75  ) );.  idx = pCu
34ec0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
34ed0 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f 63  Page];.  if( loc
34ee0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 31 36 20 73  ==0 ){.    u16 s
34ef0 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74  zOld;.    assert
34f00 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ( idx<pPage->nCe
34f10 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ll );.    rc = s
34f20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34f30 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
34f40 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
34f50 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69        goto end_i
34f60 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  nsert;.    }.   
34f70 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43   oldCell = findC
34f80 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b  ell(pPage, idx);
34f90 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
34fa0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d  >leaf ){.      m
34fb0 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f  emcpy(newCell, o
34fc0 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20  ldCell, 4);.    
34fd0 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65  }.    szOld = ce
34fe0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
34ff0 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72   oldCell);.    r
35000 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
35010 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
35020 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
35030 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
35040 20 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70   rc = dropCell(p
35050 50 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64  Page, idx, szOld
35060 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
35070 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
35080 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65     goto end_inse
35090 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rt;.    }.  }els
350a0 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70  e if( loc<0 && p
350b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Page->nCell>0 ){
350c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
350d0 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  ge->leaf );.    
350e0 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
350f0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
35100 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
35110 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
35120 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  af );.  }.  rc =
35130 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
35140 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c  e, idx, newCell,
35150 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20   szNew, 0, 0);. 
35160 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
35170 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 2d  ITE_OK || pPage-
35180 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50 61 67  >nCell>0 || pPag
35190 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
351a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 72  ;..  /* If no er
351b0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
351c0 61 6e 64 20 70 50 61 67 65 20 68 61 73 20 61 6e  and pPage has an
351d0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
351e0 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29 20 0a  call balance() .
351f0 20 20 2a 2a 20 74 6f 20 72 65 64 69 73 74 72 69    ** to redistri
35200 62 75 74 65 20 74 68 65 20 63 65 6c 6c 73 20 77  bute the cells w
35210 69 74 68 69 6e 20 74 68 65 20 74 72 65 65 2e 20  ithin the tree. 
35220 53 69 6e 63 65 20 62 61 6c 61 6e 63 65 28 29 20  Since balance() 
35230 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68  may move.  ** th
35240 65 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f 20 74  e cursor, zero t
35250 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  he BtCursor.info
35260 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74 43 75 72  .nSize and BtCur
35270 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a 20 20  sor.validNKey.  
35280 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20  ** variables..  
35290 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f 75 73  **.  ** Previous
352a0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
352b0 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76 65 54  ite called moveT
352c0 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76 65 20  oRoot() to move 
352d0 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  the cursor.  ** 
352e0 62 61 63 6b 20 74 6f 20 74 68 65 20 72 6f 6f 74  back to the root
352f0 20 70 61 67 65 20 61 73 20 62 61 6c 61 6e 63 65   page as balance
35300 28 29 20 75 73 65 64 20 74 6f 20 69 6e 76 61 6c  () used to inval
35310 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  idate the conten
35320 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43 75 72  ts.  ** of BtCur
35330 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  sor.apPage[] and
35340 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 5b   BtCursor.aiIdx[
35350 5d 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 6f  ]. Instead of do
35360 69 6e 67 20 74 68 61 74 2c 0a 20 20 2a 2a 20 73  ing that,.  ** s
35370 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  et the cursor st
35380 61 74 65 20 74 6f 20 22 69 6e 76 61 6c 69 64 22  ate to "invalid"
35390 2e 20 54 68 69 73 20 6d 61 6b 65 73 20 63 6f 6d  . This makes com
353a0 6d 6f 6e 20 69 6e 73 65 72 74 20 6f 70 65 72 61  mon insert opera
353b0 74 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c 69 67 68  tions.  ** sligh
353c0 74 6c 79 20 66 61 73 74 65 72 2e 0a 20 20 2a 2a  tly faster..  **
353d0 0a 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61  .  ** There is a
353e0 20 73 75 62 74 6c 65 20 62 75 74 20 69 6d 70 6f   subtle but impo
353f0 72 74 61 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69  rtant optimizati
35400 6f 6e 20 68 65 72 65 20 74 6f 6f 2e 20 57 68 65  on here too. Whe
35410 6e 20 69 6e 73 65 72 74 69 6e 67 0a 20 20 2a 2a  n inserting.  **
35420 20 6d 75 6c 74 69 70 6c 65 20 72 65 63 6f 72 64   multiple record
35430 73 20 69 6e 74 6f 20 61 6e 20 69 6e 74 6b 65 79  s into an intkey
35440 20 62 2d 74 72 65 65 20 75 73 69 6e 67 20 61 20   b-tree using a 
35450 73 69 6e 67 6c 65 20 63 75 72 73 6f 72 20 28 61  single cursor (a
35460 73 20 63 61 6e 0a 20 20 2a 2a 20 68 61 70 70 65  s can.  ** happe
35470 6e 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  n while processi
35480 6e 67 20 61 6e 20 22 49 4e 53 45 52 54 20 49 4e  ng an "INSERT IN
35490 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 22 20 73  TO ... SELECT" s
354a0 74 61 74 65 6d 65 6e 74 29 2c 20 69 74 0a 20 20  tatement), it.  
354b0 2a 2a 20 69 73 20 61 64 76 61 6e 74 61 67 65 6f  ** is advantageo
354c0 75 73 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20  us to leave the 
354d0 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
354e0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
354f0 79 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 62 2d  y in.  ** the b-
35500 74 72 65 65 20 69 66 20 70 6f 73 73 69 62 6c 65  tree if possible
35510 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  . If the cursor 
35520 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
35530 20 74 6f 20 74 68 65 20 6c 61 73 74 0a 20 20 2a   to the last.  *
35540 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
35550 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 6e 65  able, and the ne
35560 78 74 20 72 6f 77 20 69 6e 73 65 72 74 65 64 20  xt row inserted 
35570 68 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6b  has an integer k
35580 65 79 0a 20 20 2a 2a 20 6c 61 72 67 65 72 20 74  ey.  ** larger t
35590 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
355a0 65 78 69 73 74 69 6e 67 20 6b 65 79 2c 20 69 74  existing key, it
355b0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
355c0 69 6e 73 65 72 74 20 74 68 65 0a 20 20 2a 2a 20  insert the.  ** 
355d0 72 6f 77 20 77 69 74 68 6f 75 74 20 73 65 65 6b  row without seek
355e0 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ing the cursor. 
355f0 54 68 69 73 20 63 61 6e 20 62 65 20 61 20 62 69  This can be a bi
35600 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f  g performance bo
35610 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72  ost..  */.  pCur
35620 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
35630 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
35640 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Key = 0;.  if( r
35650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
35660 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
35670 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c   ){.    rc = bal
35680 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20 20 20  ance(pCur);..   
35690 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73 75   /* Must make su
356a0 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  re nOverflow is 
356b0 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65 76  reset to zero ev
356c0 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e 63  en if the balanc
356d0 65 28 29 0a 20 20 20 20 2a 2a 20 66 61 69 6c 73  e().    ** fails
356e0 2e 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  . Internal data 
356f0 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70  structure corrup
35700 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
35710 20 6f 74 68 65 72 77 69 73 65 2e 20 0a 20 20 20   otherwise. .   
35720 20 2a 2a 20 41 6c 73 6f 2c 20 73 65 74 20 74 68   ** Also, set th
35730 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 74  e cursor state t
35740 6f 20 69 6e 76 61 6c 69 64 2e 20 54 68 69 73 20  o invalid. This 
35750 73 74 6f 70 73 20 73 61 76 65 43 75 72 73 6f 72  stops saveCursor
35760 50 6f 73 69 74 69 6f 6e 28 29 0a 20 20 20 20 2a  Position().    *
35770 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  * from trying to
35780 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   save the curren
35790 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  t position of th
357a0 65 20 63 75 72 73 6f 72 2e 20 20 2a 2f 0a 20 20  e cursor.  */.  
357b0 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
357c0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76  Cur->iPage]->nOv
357d0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
357e0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
357f0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
35800 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
35810 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
35820 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  iPage]->nOverflo
35830 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69 6e 73  w==0 );..end_ins
35840 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ert:.  return rc
35850 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
35860 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  e the entry that
35870 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
35880 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
35890 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
358a0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
358b0 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61 74   arbitrary locat
358c0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
358d0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 42  te3BtreeDelete(B
358e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
358f0 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
35900 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
35910 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
35920 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
35930 20 20 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20    .  int rc;    
35940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
35960 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
35970 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
35980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35990 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 64 65     /* Page to de
359a0 6c 65 74 65 20 63 65 6c 6c 20 66 72 6f 6d 20 2a  lete cell from *
359b0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
359c0 72 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  r *pCell;       
359d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
359e0 74 65 72 20 74 6f 20 63 65 6c 6c 20 74 6f 20 64  ter to cell to d
359f0 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  elete */.  int i
35a00 43 65 6c 6c 49 64 78 3b 20 20 20 20 20 20 20 20  CellIdx;        
35a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c  /* Index of cell
35a30 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
35a40 69 6e 74 20 69 43 65 6c 6c 44 65 70 74 68 3b 20  int iCellDepth; 
35a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a60 20 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f 66       /* Depth of
35a70 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e 67   node containing
35a80 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20 20 61 73   pCell */ ..  as
35a90 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
35aa0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
35ab0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
35ac0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
35ad0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
35ae0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
35af0 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72  dOnly );.  asser
35b00 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  t( pCur->wrFlag 
35b10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  );.  assert( has
35b20 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
35b30 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67  Lock(p, pCur->pg
35b40 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b  noRoot, pCur->pK
35b50 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b  eyInfo!=0, 2) );
35b60 0a 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52  .  assert( !hasR
35b70 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
35b80 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29 20  pCur->pgnoRoot) 
35b90 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
35ba0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
35bb0 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d 3e  ->iPage]>=pCur->
35bc0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
35bd0 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20 0a 20 20 20  ge]->nCell) .   
35be0 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65  || NEVER(pCur->e
35bf0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
35c00 4c 49 44 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  LID).  ){.    re
35c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
35c20 52 3b 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  R;  /* Something
35c30 20 68 61 73 20 67 6f 6e 65 20 61 77 72 79 2e 20   has gone awry. 
35c40 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  */.  }..  /* If 
35c50 74 68 69 73 20 69 73 20 61 20 64 65 6c 65 74 65  this is a delete
35c60 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 72 65   operation to re
35c70 6d 6f 76 65 20 61 20 72 6f 77 20 66 72 6f 6d 20  move a row from 
35c80 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 0a  a table b-tree,.
35c90 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 20    ** invalidate 
35ca0 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
35cb0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  sors open on the
35cc0 20 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65 74   row being delet
35cd0 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43  ed.  */.  if( pC
35ce0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  ur->pKeyInfo==0 
35cf0 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
35d00 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
35d10 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  (p, pCur->pgnoRo
35d20 6f 74 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ot, pCur->info.n
35d30 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  Key, 0);.  }..  
35d40 69 43 65 6c 6c 44 65 70 74 68 20 3d 20 70 43 75  iCellDepth = pCu
35d50 72 2d 3e 69 50 61 67 65 3b 0a 20 20 69 43 65 6c  r->iPage;.  iCel
35d60 6c 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49  lIdx = pCur->aiI
35d70 64 78 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a  dx[iCellDepth];.
35d80 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
35d90 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70 74  apPage[iCellDept
35da0 68 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69  h];.  pCell = fi
35db0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
35dc0 65 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f 2a 20 49  ellIdx);..  /* I
35dd0 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61  f the page conta
35de0 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20  ining the entry 
35df0 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74  to delete is not
35e00 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 6d 6f   a leaf page, mo
35e10 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  ve.  ** the curs
35e20 6f 72 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73  or to the larges
35e30 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
35e40 72 65 65 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ree that is smal
35e50 6c 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 74 68  ler than.  ** th
35e60 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 64 65  e entry being de
35e70 6c 65 74 65 64 2e 20 54 68 69 73 20 63 65 6c 6c  leted. This cell
35e80 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 20 74 68   will replace th
35e90 65 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  e cell being del
35ea0 65 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74  eted.  ** from t
35eb0 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
35ec0 2e 20 54 68 65 20 27 70 72 65 76 69 6f 75 73 27  . The 'previous'
35ed0 20 65 6e 74 72 79 20 69 73 20 75 73 65 64 20 66   entry is used f
35ee0 6f 72 20 74 68 69 73 20 69 6e 73 74 65 61 64 0a  or this instead.
35ef0 20 20 2a 2a 20 6f 66 20 74 68 65 20 27 6e 65 78    ** of the 'nex
35f00 74 27 20 65 6e 74 72 79 2c 20 61 73 20 74 68 65  t' entry, as the
35f10 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
35f20 69 73 20 61 6c 77 61 79 73 20 61 20 70 61 72 74  is always a part
35f30 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62   of the.  ** sub
35f40 2d 74 72 65 65 20 68 65 61 64 65 64 20 62 79 20  -tree headed by 
35f50 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 6f  the child page o
35f60 66 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67  f the cell being
35f70 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20 6d   deleted. This m
35f80 61 6b 65 73 0a 20 20 2a 2a 20 62 61 6c 61 6e 63  akes.  ** balanc
35f90 69 6e 67 20 74 68 65 20 74 72 65 65 20 66 6f 6c  ing the tree fol
35fa0 6c 6f 77 69 6e 67 20 74 68 65 20 64 65 6c 65 74  lowing the delet
35fb0 65 20 6f 70 65 72 61 74 69 6f 6e 20 65 61 73 69  e operation easi
35fc0 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  er.  */.  if( !p
35fd0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
35fe0 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20    int notUsed;. 
35ff0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
36000 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  !=(rc = sqlite3B
36010 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
36020 72 2c 20 26 6e 6f 74 55 73 65 64 29 29 20 29 7b  r, &notUsed)) ){
36030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
36040 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
36050 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
36060 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65  ions of any othe
36070 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  r cursors open o
36080 6e 20 74 68 69 73 20 74 61 62 6c 65 20 62 65 66  n this table bef
36090 6f 72 65 0a 20 20 2a 2a 20 6d 61 6b 69 6e 67 20  ore.  ** making 
360a0 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  any modification
360b0 73 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 67 65  s. Make the page
360c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
360d0 65 6e 74 72 79 20 74 6f 20 62 65 20 0a 20 20 2a  entry to be .  *
360e0 2a 20 64 65 6c 65 74 65 64 20 77 72 69 74 61 62  * deleted writab
360f0 6c 65 2e 20 54 68 65 6e 20 66 72 65 65 20 61 6e  le. Then free an
36100 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
36110 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
36120 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 74 72 79   the .  ** entry
36130 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 72 65 6d   and finally rem
36140 6f 76 65 20 74 68 65 20 63 65 6c 6c 20 69 74 73  ove the cell its
36150 65 6c 66 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  elf from within 
36160 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  the page.  */.  
36170 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
36180 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
36190 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
361a0 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 0a  gnoRoot, pCur)).
361b0 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
361c0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
361d0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
361e0 70 44 62 50 61 67 65 29 29 0a 20 20 20 7c 7c 20  pDbPage)).   || 
361f0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
36200 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
36210 2c 20 70 43 65 6c 6c 29 29 0a 20 20 20 7c 7c 20  , pCell)).   || 
36220 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
36230 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
36240 20 69 43 65 6c 6c 49 64 78 2c 20 63 65 6c 6c 53   iCellIdx, cellS
36250 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
36260 65 6c 6c 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  ell))).  ){.    
36270 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
36280 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
36290 20 64 65 6c 65 74 65 64 20 77 61 73 20 6e 6f 74   deleted was not
362a0 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 6c 65   located on a le
362b0 61 66 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  af page, then th
362c0 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 69 73  e cursor.  ** is
362d0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
362e0 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 72 67 65  ing to the large
362f0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
36300 73 75 62 2d 74 72 65 65 20 68 65 61 64 65 64 0a  sub-tree headed.
36310 20 20 2a 2a 20 62 79 20 74 68 65 20 63 68 69 6c    ** by the chil
36320 64 2d 70 61 67 65 20 6f 66 20 74 68 65 20 63 65  d-page of the ce
36330 6c 6c 20 74 68 61 74 20 77 61 73 20 6a 75 73 74  ll that was just
36340 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 6e   deleted from an
36350 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e   internal.  ** n
36360 6f 64 65 2e 20 54 68 65 20 63 65 6c 6c 20 66 72  ode. The cell fr
36370 6f 6d 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  om the leaf node
36380 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f 76   needs to be mov
36390 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
363a0 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65 20 74 6f 20  al.  ** node to 
363b0 72 65 70 6c 61 63 65 20 74 68 65 20 64 65 6c 65  replace the dele
363c0 74 65 64 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20  ted cell.  */.  
363d0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
363e0 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
363f0 2a 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e 61  *pLeaf = pCur->a
36400 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
36410 65 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c  e];.    int nCel
36420 6c 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 20 3d 20  l;.    Pgno n = 
36430 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 43 65  pCur->apPage[iCe
36440 6c 6c 44 65 70 74 68 2b 31 5d 2d 3e 70 67 6e 6f  llDepth+1]->pgno
36450 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
36460 68 61 72 20 2a 70 54 6d 70 3b 0a 0a 20 20 20 20  har *pTmp;..    
36470 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
36480 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e  (pLeaf, pLeaf->n
36490 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 6e 43 65  Cell-1);.    nCe
364a0 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
364b0 28 70 4c 65 61 66 2c 20 70 43 65 6c 6c 29 3b 0a  (pLeaf, pCell);.
364c0 20 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43      assert( MX_C
364d0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 6e  ELL_SIZE(pBt)>=n
364e0 43 65 6c 6c 20 29 3b 0a 0a 20 20 20 20 61 6c 6c  Cell );..    all
364f0 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
36500 42 74 29 3b 0a 20 20 20 20 70 54 6d 70 20 3d 20  Bt);.    pTmp = 
36510 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  pBt->pTmpSpace;.
36520 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
36530 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
36540 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 65 61  3PagerWrite(pLea
36550 66 2d 3e 70 44 62 50 61 67 65 29 29 20 0a 20 20  f->pDbPage)) .  
36560 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
36570 3d 28 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c  =(rc = insertCel
36580 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64  l(pPage, iCellId
36590 78 2c 20 70 43 65 6c 6c 2d 34 2c 20 6e 43 65 6c  x, pCell-4, nCel
365a0 6c 2b 34 2c 20 70 54 6d 70 2c 20 6e 29 29 0a 20  l+4, pTmp, n)). 
365b0 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b      || SQLITE_OK
365c0 21 3d 28 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c  !=(rc = dropCell
365d0 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e  (pLeaf, pLeaf->n
365e0 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c 6c 29 29 0a  Cell-1, nCell)).
365f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
36600 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
36610 7d 0a 0a 20 20 2f 2a 20 42 61 6c 61 6e 63 65 20  }..  /* Balance 
36620 74 68 65 20 74 72 65 65 2e 20 49 66 20 74 68 65  the tree. If the
36630 20 65 6e 74 72 79 20 64 65 6c 65 74 65 64 20 77   entry deleted w
36640 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  as located on a 
36650 6c 65 61 66 20 70 61 67 65 2c 0a 20 20 2a 2a 20  leaf page,.  ** 
36660 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
36670 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  still points to 
36680 74 68 61 74 20 70 61 67 65 2e 20 49 6e 20 74 68  that page. In th
36690 69 73 20 63 61 73 65 20 74 68 65 20 66 69 72 73  is case the firs
366a0 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  t.  ** call to b
366b0 61 6c 61 6e 63 65 28 29 20 72 65 70 61 69 72 73  alance() repairs
366c0 20 74 68 65 20 74 72 65 65 2c 20 61 6e 64 20 74   the tree, and t
366d0 68 65 20 69 66 28 2e 2e 2e 29 20 63 6f 6e 64 69  he if(...) condi
366e0 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 6e 65 76  tion is.  ** nev
366f0 65 72 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20 20  er true..  **.  
36700 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
36710 20 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74   the entry delet
36720 65 64 20 77 61 73 20 6f 6e 20 61 6e 20 69 6e 74  ed was on an int
36730 65 72 6e 61 6c 20 6e 6f 64 65 20 70 61 67 65 2c  ernal node page,
36740 20 74 68 65 6e 0a 20 20 2a 2a 20 70 43 75 72 20   then.  ** pCur 
36750 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  is pointing to t
36760 68 65 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  he leaf page fro
36770 6d 20 77 68 69 63 68 20 61 20 63 65 6c 6c 20 77  m which a cell w
36780 61 73 20 72 65 6d 6f 76 65 64 20 74 6f 0a 20 20  as removed to.  
36790 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 65 20 63  ** replace the c
367a0 65 6c 6c 20 64 65 6c 65 74 65 64 20 66 72 6f 6d  ell deleted from
367b0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
367c0 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67  de. This is slig
367d0 68 74 6c 79 0a 20 20 2a 2a 20 74 72 69 63 6b 79  htly.  ** tricky
367e0 20 61 73 20 74 68 65 20 6c 65 61 66 20 6e 6f 64   as the leaf nod
367f0 65 20 6d 61 79 20 62 65 20 75 6e 64 65 72 66 75  e may be underfu
36800 6c 6c 2c 20 61 6e 64 20 74 68 65 20 69 6e 74 65  ll, and the inte
36810 72 6e 61 6c 20 6e 6f 64 65 20 6d 61 79 0a 20 20  rnal node may.  
36820 2a 2a 20 62 65 20 65 69 74 68 65 72 20 75 6e 64  ** be either und
36830 65 72 20 6f 72 20 6f 76 65 72 66 75 6c 6c 2e 20  er or overfull. 
36840 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 75 6e  In this case run
36850 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 61   the balancing a
36860 6c 67 6f 72 69 74 68 6d 0a 20 20 2a 2a 20 6f 6e  lgorithm.  ** on
36870 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 66   the leaf node f
36880 69 72 73 74 2e 20 49 66 20 74 68 65 20 62 61 6c  irst. If the bal
36890 61 6e 63 65 20 70 72 6f 63 65 65 64 73 20 66 61  ance proceeds fa
368a0 72 20 65 6e 6f 75 67 68 20 75 70 20 74 68 65 0a  r enough up the.
368b0 20 20 2a 2a 20 74 72 65 65 20 74 68 61 74 20 77    ** tree that w
368c0 65 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68  e can be sure th
368d0 61 74 20 61 6e 79 20 70 72 6f 62 6c 65 6d 20 69  at any problem i
368e0 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  n the internal n
368f0 6f 64 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65  ode has.  ** bee
36900 6e 20 63 6f 72 72 65 63 74 65 64 2c 20 73 6f 20  n corrected, so 
36910 62 65 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65  be it. Otherwise
36920 2c 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  , after balancin
36930 67 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 2c  g the leaf node,
36940 0a 20 20 2a 2a 20 77 61 6c 6b 20 74 68 65 20 63  .  ** walk the c
36950 75 72 73 6f 72 20 75 70 20 74 68 65 20 74 72 65  ursor up the tre
36960 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  e to the interna
36970 6c 20 6e 6f 64 65 20 61 6e 64 20 62 61 6c 61 6e  l node and balan
36980 63 65 20 69 74 20 61 73 20 0a 20 20 2a 2a 20 77  ce it as .  ** w
36990 65 6c 6c 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ell.  */.  rc = 
369a0 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 20  balance(pCur);. 
369b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
369c0 4f 4b 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  OK && pCur->iPag
369d0 65 3e 69 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a  e>iCellDepth ){.
369e0 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
369f0 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74  >iPage>iCellDept
36a00 68 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  h ){.      relea
36a10 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
36a20 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
36a30 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  -]);.    }.    r
36a40 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
36a50 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
36a60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36a70 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43     moveToRoot(pC
36a80 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ur);.  }.  retur
36a90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
36aa0 72 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65  reate a new BTre
36ab0 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20  e table.  Write 
36ac0 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68  into *piTable th
36ad0 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72  e page.** number
36ae0 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61   for the root pa
36af0 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  ge of the new ta
36b00 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ble..**.** The t
36b10 79 70 65 20 6f 66 20 74 79 70 65 20 69 73 20 64  ype of type is d
36b20 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
36b30 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
36b40 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  .  Only the.** f
36b50 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20  ollowing values 
36b60 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63 75 72  of flags are cur
36b70 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20  rently in use.  
36b80 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72  Other values for
36b90 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20  .** flags might 
36ba0 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20  not work:.**.** 
36bb0 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59      BTREE_INTKEY
36bc0 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20  |BTREE_LEAFDATA 
36bd0 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
36be0 20 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77   tables with row
36bf0 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42  id keys.**     B
36c00 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20  TREE_ZERODATA   
36c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55                 U
36c20 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69  sed for SQL indi
36c30 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ces.*/.static in
36c40 74 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62  t btreeCreateTab
36c50 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
36c60 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66   *piTable, int f
36c70 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65  lags){.  BtShare
36c80 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
36c90 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
36ca0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f  t;.  Pgno pgnoRo
36cb0 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ot;.  int rc;.. 
36cc0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36cd0 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
36ce0 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
36cf0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
36d00 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
36d10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42  );.  assert( !pB
36d20 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a  t->readOnly );..
36d30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
36d40 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
36d50 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
36d60 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
36d70 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
36d80 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
36d90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
36da0 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28  .  }.#else.  if(
36db0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
36dc0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
36dd0 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d  oMove;      /* M
36de0 6f 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20  ove a page here 
36df0 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72  to make room for
36e00 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a   the root-page *
36e10 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
36e20 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65  PageMove; /* The
36e30 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
36e40 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65  . */..    /* Cre
36e50 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  ating a new tabl
36e60 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72  e may probably r
36e70 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
36e80 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
36e90 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b  se.    ** to mak
36ea0 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e  e room for the n
36eb0 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70  ew tables root p
36ec0 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69  age. In case thi
36ed0 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20  s page turns.   
36ee0 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e   ** out to be an
36ef0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
36f00 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66  delete all overf
36f10 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63  low page-map cac
36f20 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20  hes.    ** held 
36f30 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  by open cursors.
36f40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61  .    */.    inva
36f50 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
36f60 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20  wCache(pBt);..  
36f70 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61    /* Read the va
36f80 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66  lue of meta[3] f
36f90 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
36fa0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
36fb0 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  ere the.    ** r
36fc0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
36fd0 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  new table should
36fe0 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20   go. meta[3] is 
36ff0 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
37000 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65  -page.    ** cre
37010 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20  ated so far, so 
37020 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  the new root-pag
37030 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29  e is (meta[3]+1)
37040 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
37050 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
37060 28 70 2c 20 42 54 52 45 45 5f 4c 41 52 47 45 53  (p, BTREE_LARGES
37070 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20 26 70 67  T_ROOT_PAGE, &pg
37080 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 70 67 6e  noRoot);.    pgn
37090 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  oRoot++;..    /*
370a0 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   The new root-pa
370b0 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c  ge may not be al
370c0 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69  located on a poi
370d0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f  nter-map page, o
370e0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e  r the.    ** PEN
370f0 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a  DING_BYTE page..
37100 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
37110 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d  ( pgnoRoot==PTRM
37120 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70  AP_PAGENO(pBt, p
37130 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20  gnoRoot) ||.    
37140 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45      pgnoRoot==PE
37150 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
37160 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67  pBt) ){.      pg
37170 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a  noRoot++;.    }.
37180 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
37190 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20  Root>=3 );..    
371a0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61  /* Allocate a pa
371b0 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68 61  ge. The page tha
371c0 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69  t currently resi
371d0 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  des at pgnoRoot 
371e0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d  will.    ** be m
371f0 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f  oved to the allo
37200 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65  cated page (unle
37210 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  ss the allocated
37220 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20   page happens.  
37230 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61    ** to reside a
37240 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20  t pgnoRoot)..   
37250 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   */.    rc = all
37260 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
37270 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20  Bt, &pPageMove, 
37280 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52  &pgnoMove, pgnoR
37290 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  oot, 1);.    if(
372a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
372b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
372c0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
372d0 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f  ( pgnoMove!=pgno
372e0 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Root ){.      /*
372f0 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65   pgnoRoot is the
37300 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20   page that will 
37310 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
37320 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20 20  root-page of.   
37330 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 61     ** the new ta
37340 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61 6e  ble (assuming an
37350 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f   error did not o
37360 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77 65  ccur). But we we
37370 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  re.      ** allo
37380 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20  cated pgnoMove. 
37390 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e 65  If required (i.e
373a0 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  . if it was not 
373b0 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
373c0 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67 20  ** by extending 
373d0 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20 63  the file), the c
373e0 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20 70  urrent page at p
373f0 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65  osition pgnoMove
37400 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72  .      ** is alr
37410 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a  eady journaled..
37420 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75        */.      u
37430 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50  8 eType;.      P
37440 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
37450 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
37460 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20  (pPageMove);..  
37470 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20      /* Move the 
37480 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 61  page currently a
37490 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67  t pgnoRoot to pg
374a0 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20  noMove. */.     
374b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
374c0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
374d0 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c  gnoRoot, &pRoot,
374e0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
374f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
37500 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
37510 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
37520 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
37530 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26  pBt, pgnoRoot, &
37540 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
37550 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
37560 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
37570 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  AGE || eType==PT
37580 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
37590 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
375a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
375b0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
375c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
375d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
375e0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
375f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
37600 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
37610 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
37620 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
37630 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
37640 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  t( eType!=PTRMAP
37650 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20  _FREEPAGE );.   
37660 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
37670 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c  Page(pBt, pRoot,
37680 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
37690 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a  , pgnoMove, 0);.
376a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
376b0 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20  e(pRoot);..     
376c0 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70   /* Obtain the p
376d0 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  age at pgnoRoot 
376e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  */.      if( rc!
376f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37700 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
37720 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
37730 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
37740 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
37750 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
37760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37770 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
37790 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
377a0 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
377b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
377c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
377d0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
377e0 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
377f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
37810 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  se{.      pRoot 
37820 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20  = pPageMove;.   
37830 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   } ..    /* Upda
37840 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
37850 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61  ap and meta-data
37860 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f   with the new ro
37870 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
37880 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  */.    rc = ptrm
37890 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52  apPut(pBt, pgnoR
378a0 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  oot, PTRMAP_ROOT
378b0 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
378c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
378d0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
378e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
378f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
37900 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
37910 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70  dateMeta(p, 4, p
37920 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  gnoRoot);.    if
37930 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
37940 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
37950 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
37960 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  c;.    }..  }els
37970 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  e{.    rc = allo
37980 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
37990 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
379a0 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Root, 1, 0);.   
379b0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
379c0 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
379d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
379e0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
379f0 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
37a00 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  ) );.  zeroPage(
37a10 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50  pRoot, flags | P
37a20 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69  TF_LEAF);.  sqli
37a30 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 52  te3PagerUnref(pR
37a40 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
37a50 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74   *piTable = (int
37a60 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74  )pgnoRoot;.  ret
37a70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
37a80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
37a90 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72  eCreateTable(Btr
37aa0 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61  ee *p, int *piTa
37ab0 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ble, int flags){
37ac0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
37ad0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
37ae0 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
37af0 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69  reateTable(p, pi
37b00 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Table, flags);. 
37b10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
37b20 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
37b30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  rc;.}../*.** Era
37b40 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  se the given dat
37b50 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20 61  abase page and a
37b60 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e  ll its children.
37b70 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
37b80 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
37b90 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
37ba0 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61 73  int clearDatabas
37bb0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
37bc0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
37bd0 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74    /* The BTree t
37be0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
37bf0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f   table */.  Pgno
37c00 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
37c10 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
37c20 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 69   to clear */.  i
37c30 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61 67 2c  nt freePageFlag,
37c40 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61       /* Dealloca
37c50 74 65 20 70 61 67 65 20 69 66 20 74 72 75 65 20  te page if true 
37c60 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61 6e  */.  int *pnChan
37c70 67 65 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ge.){.  MemPage 
37c80 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
37c90 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
37ca0 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
37cb0 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
37cc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
37cd0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
37ce0 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70   );.  if( pgno>p
37cf0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
37d00 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
37d10 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
37d20 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  BKPT;.  }..  rc 
37d30 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
37d40 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61  (pBt, pgno, &pPa
37d50 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
37d60 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
37d70 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f  sepage_out;.  fo
37d80 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
37d90 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
37da0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
37db0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
37dc0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
37dd0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
37de0 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
37df0 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
37e00 70 43 65 6c 6c 29 2c 20 31 2c 20 70 6e 43 68 61  pCell), 1, pnCha
37e10 6e 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nge);.      if( 
37e20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
37e30 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
37e40 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
37e50 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
37e60 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
37e70 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
37e80 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
37e90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
37ea0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
37eb0 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
37ec0 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  sePage(pBt, get4
37ed0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
37ee0 74 61 5b 38 5d 29 2c 20 31 2c 20 70 6e 43 68 61  ta[8]), 1, pnCha
37ef0 6e 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nge);.    if( rc
37f00 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
37f10 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
37f20 20 7d 65 6c 73 65 20 69 66 28 20 70 6e 43 68 61   }else if( pnCha
37f30 6e 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nge ){.    asser
37f40 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
37f50 20 29 3b 0a 20 20 20 20 2a 70 6e 43 68 61 6e 67   );.    *pnChang
37f60 65 20 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e += pPage->nCel
37f70 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65  l;.  }.  if( fre
37f80 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20  ePageFlag ){.   
37f90 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
37fa0 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Page);.  }else i
37fb0 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
37fc0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
37fd0 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29  ->pDbPage))==0 )
37fe0 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  {.    zeroPage(p
37ff0 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61  Page, pPage->aDa
38000 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46  ta[0] | PTF_LEAF
38010 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74  );.  }..cleardat
38020 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20  abasepage_out:. 
38030 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
38040 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
38050 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
38060 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  e all informatio
38070 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  n from a single 
38080 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
38090 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69  abase.  iTable i
380a0 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  s.** the page nu
380b0 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74  mber of the root
380c0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
380d0 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
380e0 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74  ne returns,.** t
380f0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
38100 65 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c  empty, but still
38110 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54   exists..**.** T
38120 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
38130 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54   fail with SQLIT
38140 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72  E_LOCKED if ther
38150 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a  e are any open.*
38160 2a 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f  * read cursors o
38170 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70  n the table.  Op
38180 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  en write cursors
38190 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
381a0 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65  e.** root of the
381b0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
381c0 20 70 6e 43 68 61 6e 67 65 20 69 73 20 6e 6f 74   pnChange is not
381d0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 61 62 6c   NULL, then tabl
381e0 65 20 69 54 61 62 6c 65 20 6d 75 73 74 20 62 65  e iTable must be
381f0 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65   an intkey table
38200 2e 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72  . The.** integer
38210 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 20 74   value pointed t
38220 6f 20 62 79 20 70 6e 43 68 61 6e 67 65 20 69 73  o by pnChange is
38230 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20   incremented by 
38240 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
38250 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
38260 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
38270 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
38280 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
38290 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a  nt iTable, int *
382a0 70 6e 43 68 61 6e 67 65 29 7b 0a 20 20 69 6e 74  pnChange){.  int
382b0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
382c0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
382d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
382e0 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
382f0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
38300 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a 20 20 2f  NS_WRITE );..  /
38310 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  * Invalidate all
38320 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72   incrblob cursor
38330 73 20 6f 70 65 6e 20 6f 6e 20 74 61 62 6c 65 20  s open on table 
38340 69 54 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67  iTable (assuming
38350 20 69 54 61 62 6c 65 0a 20 20 2a 2a 20 69 73 20   iTable.  ** is 
38360 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 20 74 61  the root of a ta
38370 62 6c 65 20 62 2d 74 72 65 65 20 2d 20 69 66 20  ble b-tree - if 
38380 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 66  it is not, the f
38390 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 69 73  ollowing call is
383a0 0a 20 20 2a 2a 20 61 20 6e 6f 2d 6f 70 29 2e 20  .  ** a no-op). 
383b0 20 2a 2f 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   */.  invalidate
383c0 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
383d0 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20 31 29  p, iTable, 0, 1)
383e0 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
383f0 4f 4b 3d 3d 28 72 63 20 3d 20 73 61 76 65 41 6c  OK==(rc = saveAl
38400 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 28 50  lCursors(pBt, (P
38410 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 29 29 20  gno)iTable, 0)) 
38420 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61  ){.    rc = clea
38430 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42  rDatabasePage(pB
38440 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c  t, (Pgno)iTable,
38450 20 30 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20   0, pnChange);. 
38460 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
38470 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
38480 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
38490 20 45 72 6