/ Hex Artifact Content
Login

Artifact ca942fd75c1b791bd3fdf647e283473acf63e97d2252077216cdc1d56cb3a25e:


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 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
3a80: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
3a90: 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  ENT./*.** The fo
3aa0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3ab0: 65 20 2d 20 42 74 72 65 65 50 74 72 6d 61 70 20  e - BtreePtrmap 
3ac0: 2d 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e 2d  - stores the in-
3ad0: 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 20 6d  memory pointer m
3ae0: 61 70 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 6e  ap.** used for n
3af0: 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70  ewly allocated p
3b00: 61 67 65 73 20 69 6e 20 43 4f 4e 43 55 52 52 45  ages in CONCURRE
3b10: 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  NT transactions.
3b20: 20 53 75 63 68 20 70 61 67 65 73 20 61 72 65 0a   Such pages are.
3b30: 2a 2a 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61  ** always alloca
3b40: 74 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75  ted in a contigu
3b50: 6f 75 73 20 62 6c 6f 63 6b 20 28 66 72 6f 6d 20  ous block (from 
3b60: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
3b70: 69 6c 65 29 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ile) starting.**
3b80: 20 77 69 74 68 20 70 61 67 65 20 42 74 72 65 65   with page Btree
3b90: 50 74 72 6d 61 70 2e 69 46 69 72 73 74 2e 0a 2a  Ptrmap.iFirst..*
3ba0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
3bb0: 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 52   RollbackEntry R
3bc0: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 3b 0a 74 79  ollbackEntry;.ty
3bd0: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 74 72  pedef struct Ptr
3be0: 6d 61 70 45 6e 74 72 79 20 50 74 72 6d 61 70 45  mapEntry PtrmapE
3bf0: 6e 74 72 79 3b 0a 73 74 72 75 63 74 20 50 74 72  ntry;.struct Ptr
3c00: 6d 61 70 45 6e 74 72 79 20 7b 0a 20 20 50 67 6e  mapEntry {.  Pgn
3c10: 6f 20 70 61 72 65 6e 74 3b 0a 20 20 75 38 20 65  o parent;.  u8 e
3c20: 54 79 70 65 3b 0a 7d 3b 0a 73 74 72 75 63 74 20  Type;.};.struct 
3c30: 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 7b 0a  RollbackEntry {.
3c40: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 50    Pgno pgno;.  P
3c50: 67 6e 6f 20 70 61 72 65 6e 74 3b 0a 20 20 75 38  gno parent;.  u8
3c60: 20 65 54 79 70 65 3b 0a 7d 3b 0a 73 74 72 75 63   eType;.};.struc
3c70: 74 20 42 74 72 65 65 50 74 72 6d 61 70 20 7b 0a  t BtreePtrmap {.
3c80: 20 20 50 67 6e 6f 20 69 46 69 72 73 74 3b 20 20    Pgno iFirst;  
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 20 20 2f 2a 20 46 69 72 73 74 20 6e 65 77 20 70    /* First new p
3cb0: 61 67 65 20 6e 75 6d 62 65 72 20 61 50 74 72 5b  age number aPtr[
3cc0: 30 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 50 74  0] */..  int nPt
3cd0: 72 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  rAlloc;         
3ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
3cf0: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 50  cated size of aP
3d00: 74 72 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  tr[] array */.  
3d10: 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 61 50 74  PtrmapEntry *aPt
3d20: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
3d30: 2f 2a 20 41 72 72 61 79 20 6f 66 20 70 61 72 65  /* Array of pare
3d40: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  nt page numbers 
3d50: 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 76 70 74 3b  */..  int nSvpt;
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73 69        /* Used si
3d80: 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d 20 61 72  ze of aSvpt[] ar
3d90: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 76  ray */.  int nSv
3da0: 70 74 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  ptAlloc;        
3db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
3dc0: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 53  cated size of aS
3dd0: 76 70 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 2a  vpt[] */.  int *
3de0: 61 53 76 70 74 3b 20 20 20 20 20 20 20 20 20 20  aSvpt;          
3df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
3e00: 72 73 74 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20  rst aRollback[] 
3e10: 65 6e 74 72 79 20 66 6f 72 20 73 61 76 65 70 6f  entry for savepo
3e20: 69 6e 74 20 69 20 2a 2f 0a 0a 20 20 69 6e 74 20  int i */..  int 
3e30: 6e 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  nRollback;      
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
3e50: 73 65 64 20 73 69 7a 65 20 6f 66 20 61 52 6f 6c  sed size of aRol
3e60: 6c 62 61 63 6b 5b 5d 20 61 72 72 61 79 20 2a 2f  lback[] array */
3e70: 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c 62 61 63 6b  .  int nRollback
3e80: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
3e90: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
3ea0: 73 69 7a 65 20 6f 66 20 61 52 6f 6c 6c 62 61 63  size of aRollbac
3eb0: 6b 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 52  k[] array */.  R
3ec0: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 2a 61 52  ollbackEntry *aR
3ed0: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 2f  ollback;       /
3ee0: 2a 20 41 72 72 61 79 20 6f 66 20 72 6f 6c 6c 62  * Array of rollb
3ef0: 61 63 6b 20 65 6e 74 72 69 65 73 20 2a 2f 0a 7d  ack entries */.}
3f00: 3b 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  ;../* !defined(S
3f10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
3f20: 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 49 66 20  RRENT).**.** If 
3f30: 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
3f40: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
3f50: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 42 74 72   or equal to Btr
3f60: 65 65 50 74 72 6d 61 70 2e 69 46 69 72 73 74 2c  eePtrmap.iFirst,
3f70: 20 0a 2a 2a 20 73 74 6f 72 65 20 61 6e 20 65 6e   .** store an en
3f80: 74 72 79 20 66 6f 72 20 69 74 20 69 6e 20 74 68  try for it in th
3f90: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 74  e pointer-map st
3fa0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
3fb0: 69 63 20 69 6e 74 20 62 74 72 65 65 50 74 72 6d  ic int btreePtrm
3fc0: 61 70 53 74 6f 72 65 28 0a 20 20 42 74 53 68 61  apStore(.  BtSha
3fd0: 72 65 64 20 2a 70 42 74 2c 0a 20 20 50 67 6e 6f  red *pBt,.  Pgno
3fe0: 20 70 67 6e 6f 2c 0a 20 20 75 38 20 65 54 79 70   pgno,.  u8 eTyp
3ff0: 65 2c 20 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e  e, .  Pgno paren
4000: 74 0a 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d  t.){.  BtreePtrm
4010: 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e  ap *pMap = pBt->
4020: 70 4d 61 70 3b 0a 20 20 69 66 28 20 70 67 6e 6f  pMap;.  if( pgno
4030: 3e 3d 70 4d 61 70 2d 3e 69 46 69 72 73 74 20 29  >=pMap->iFirst )
4040: 7b 0a 20 20 20 20 69 6e 74 20 69 45 6e 74 72 79  {.    int iEntry
4050: 20 3d 20 70 67 6e 6f 20 2d 20 70 4d 61 70 2d 3e   = pgno - pMap->
4060: 69 46 69 72 73 74 3b 0a 0a 20 20 20 20 2f 2a 20  iFirst;..    /* 
4070: 47 72 6f 77 20 74 68 65 20 61 50 74 72 5b 5d 20  Grow the aPtr[] 
4080: 61 72 72 61 79 20 61 73 20 72 65 71 75 69 72 65  array as require
4090: 64 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20  d */.    while( 
40a0: 69 45 6e 74 72 79 3e 3d 70 4d 61 70 2d 3e 6e 50  iEntry>=pMap->nP
40b0: 74 72 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  trAlloc ){.     
40c0: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70   int nNew = pMap
40d0: 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20 3f 20 70 4d  ->nPtrAlloc ? pM
40e0: 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 2a 32 20  ap->nPtrAlloc*2 
40f0: 3a 20 31 36 3b 0a 20 20 20 20 20 20 50 74 72 6d  : 16;.      Ptrm
4100: 61 70 45 6e 74 72 79 20 2a 61 4e 65 77 20 3d 20  apEntry *aNew = 
4110: 28 50 74 72 6d 61 70 45 6e 74 72 79 2a 29 73 71  (PtrmapEntry*)sq
4120: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
4130: 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61           pMap->a
4140: 50 74 72 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66  Ptr, nNew*sizeof
4150: 28 50 74 72 6d 61 70 45 6e 74 72 79 29 0a 20 20  (PtrmapEntry).  
4160: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
4170: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
4180: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4190: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
41a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
41b0: 74 20 6e 42 79 74 65 20 3d 20 28 6e 4e 65 77 2d  t nByte = (nNew-
41c0: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 29  pMap->nPtrAlloc)
41d0: 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45 6e  *sizeof(PtrmapEn
41e0: 74 72 79 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  try);.        me
41f0: 6d 73 65 74 28 26 61 4e 65 77 5b 70 4d 61 70 2d  mset(&aNew[pMap-
4200: 3e 6e 50 74 72 41 6c 6c 6f 63 5d 2c 20 30 2c 20  >nPtrAlloc], 0, 
4210: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
4220: 70 4d 61 70 2d 3e 61 50 74 72 20 3d 20 61 4e 65  pMap->aPtr = aNe
4230: 77 3b 0a 20 20 20 20 20 20 20 20 70 4d 61 70 2d  w;.        pMap-
4240: 3e 6e 50 74 72 41 6c 6c 6f 63 20 3d 20 6e 4e 65  >nPtrAlloc = nNe
4250: 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  w;.      }.    }
4260: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
4270: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 72 6f 6c  entry to the rol
4280: 6c 62 61 63 6b 20 6c 6f 67 20 69 66 20 72 65 71  lback log if req
4290: 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  uired */.    if(
42a0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 3e 30 20 26   pMap->nSvpt>0 &
42b0: 26 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e  & pMap->aPtr[iEn
42c0: 74 72 79 5d 2e 70 61 72 65 6e 74 20 29 7b 0a 20  try].parent ){. 
42d0: 20 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e       if( pMap->n
42e0: 52 6f 6c 6c 62 61 63 6b 3e 3d 70 4d 61 70 2d 3e  Rollback>=pMap->
42f0: 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 29  nRollbackAlloc )
4300: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4e  {.        int nN
4310: 65 77 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c  ew = pMap->nRoll
4320: 62 61 63 6b 20 3f 20 70 4d 61 70 2d 3e 6e 52 6f  back ? pMap->nRo
4330: 6c 6c 62 61 63 6b 2a 32 20 3a 20 31 36 3b 0a 20  llback*2 : 16;. 
4340: 20 20 20 20 20 20 20 52 6f 6c 6c 62 61 63 6b 45         RollbackE
4350: 6e 74 72 79 20 2a 61 4e 65 77 20 3d 20 28 52 6f  ntry *aNew = (Ro
4360: 6c 6c 62 61 63 6b 45 6e 74 72 79 2a 29 73 71 6c  llbackEntry*)sql
4370: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
4380: 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e            pMap->
4390: 61 52 6f 6c 6c 62 61 63 6b 2c 20 6e 4e 65 77 2a  aRollback, nNew*
43a0: 73 69 7a 65 6f 66 28 52 6f 6c 6c 62 61 63 6b 45  sizeof(RollbackE
43b0: 6e 74 72 79 29 0a 20 20 20 20 20 20 20 20 29 3b  ntry).        );
43c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65  .        if( aNe
43d0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
43e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
43f0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
4400: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
4410: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 20  pMap->aRollback 
4420: 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
4430: 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63    pMap->nRollbac
4440: 6b 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20  kAlloc = nNew;. 
4450: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4460: 0a 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52  ..      pMap->aR
4470: 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52  ollback[pMap->nR
4480: 6f 6c 6c 62 61 63 6b 5d 2e 70 67 6e 6f 20 3d 20  ollback].pgno = 
4490: 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70 4d 61 70  pgno;.      pMap
44a0: 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70  ->aRollback[pMap
44b0: 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e 70 61 72  ->nRollback].par
44c0: 65 6e 74 20 3d 20 70 4d 61 70 2d 3e 61 50 74 72  ent = pMap->aPtr
44d0: 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e 74 3b  [iEntry].parent;
44e0: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f  .      pMap->aRo
44f0: 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f  llback[pMap->nRo
4500: 6c 6c 62 61 63 6b 5d 2e 65 54 79 70 65 20 3d 20  llback].eType = 
4510: 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72  pMap->aPtr[iEntr
4520: 79 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 20 20  y].eType;.      
4530: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2b  pMap->nRollback+
4540: 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  +;.    }..    /*
4550: 20 55 70 64 61 74 65 20 74 68 65 20 61 50 74 72   Update the aPtr
4560: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
4570: 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72  pMap->aPtr[iEntr
4580: 79 5d 2e 70 61 72 65 6e 74 20 3d 20 70 61 72 65  y].parent = pare
4590: 6e 74 3b 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50  nt;.    pMap->aP
45a0: 74 72 5b 69 45 6e 74 72 79 5d 2e 65 54 79 70 65  tr[iEntry].eType
45b0: 20 3d 20 65 54 79 70 65 3b 0a 20 20 7d 0a 0a 20   = eType;.  }.. 
45c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
45d0: 4b 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65  K;.}../* !define
45e0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
45f0: 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20  NCURRENT).**.** 
4600: 4f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  Open savepoint i
4610: 53 61 76 65 70 6f 69 6e 74 2c 20 69 66 20 69 74  Savepoint, if it
4620: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
4630: 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  open..*/.static 
4640: 69 6e 74 20 62 74 72 65 65 50 74 72 6d 61 70 42  int btreePtrmapB
4650: 65 67 69 6e 28 42 74 53 68 61 72 65 64 20 2a 70  egin(BtShared *p
4660: 42 74 2c 20 69 6e 74 20 6e 53 76 70 74 29 7b 0a  Bt, int nSvpt){.
4670: 20 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70    BtreePtrmap *p
4680: 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b  Map = pBt->pMap;
4690: 0a 20 20 69 66 28 20 70 4d 61 70 20 26 26 20 6e  .  if( pMap && n
46a0: 53 76 70 74 3e 70 4d 61 70 2d 3e 6e 53 76 70 74  Svpt>pMap->nSvpt
46b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
46c0: 20 20 20 69 66 28 20 6e 53 76 70 74 3e 3d 70 4d     if( nSvpt>=pM
46d0: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 29  ap->nSvptAlloc )
46e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77  {.      int nNew
46f0: 20 3d 20 70 4d 61 70 2d 3e 6e 53 76 70 74 41 6c   = pMap->nSvptAl
4700: 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e 6e 53 76 70  loc ? pMap->nSvp
4710: 74 41 6c 6c 6f 63 2a 32 20 3a 20 31 36 3b 0a 20  tAlloc*2 : 16;. 
4720: 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d       int *aNew =
4730: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
4740: 28 70 4d 61 70 2d 3e 61 53 76 70 74 2c 20 73 69  (pMap->aSvpt, si
4750: 7a 65 6f 66 28 69 6e 74 29 20 2a 20 6e 4e 65 77  zeof(int) * nNew
4760: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65  );.      if( aNe
4770: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
4780: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
4790: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
47a0: 7b 0a 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e  {.        pMap->
47b0: 61 53 76 70 74 20 3d 20 61 4e 65 77 3b 0a 20 20  aSvpt = aNew;.  
47c0: 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 53 76 70        pMap->nSvp
47d0: 74 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20  tAlloc = nNew;. 
47e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
47f0: 20 20 66 6f 72 28 69 3d 70 4d 61 70 2d 3e 6e 53    for(i=pMap->nS
4800: 76 70 74 3b 20 69 3c 6e 53 76 70 74 3b 20 69 2b  vpt; i<nSvpt; i+
4810: 2b 29 7b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e  +){.      pMap->
4820: 61 53 76 70 74 5b 69 5d 20 3d 20 70 4d 61 70 2d  aSvpt[i] = pMap-
4830: 3e 6e 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20  >nRollback;.    
4840: 7d 0a 20 20 20 20 70 4d 61 70 2d 3e 6e 53 76 70  }.    pMap->nSvp
4850: 74 20 3d 20 6e 53 76 70 74 3b 0a 20 20 7d 0a 0a  t = nSvpt;.  }..
4860: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4870: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e  OK;.}../* !defin
4880: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
4890: 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a  ONCURRENT).**.**
48a0: 20 52 6f 6c 6c 62 61 63 6b 20 28 69 66 20 6f 70   Rollback (if op
48b0: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
48c0: 42 41 43 4b 29 20 6f 72 20 72 65 6c 65 61 73 65  BACK) or release
48d0: 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50 4f 49   (if op==SAVEPOI
48e0: 4e 54 5f 52 45 4c 45 41 53 45 29 0a 2a 2a 20 73  NT_RELEASE).** s
48f0: 61 76 65 70 6f 69 6e 74 20 69 53 76 70 74 2e 0a  avepoint iSvpt..
4900: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4910: 74 72 65 65 50 74 72 6d 61 70 45 6e 64 28 42 74  treePtrmapEnd(Bt
4920: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74  Shared *pBt, int
4930: 20 6f 70 2c 20 69 6e 74 20 69 53 76 70 74 29 7b   op, int iSvpt){
4940: 0a 20 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a  .  BtreePtrmap *
4950: 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d 61 70  pMap = pBt->pMap
4960: 3b 0a 20 20 69 66 28 20 70 4d 61 70 20 29 7b 0a  ;.  if( pMap ){.
4970: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
4980: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
4990: 43 4b 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  CK || op==SAVEPO
49a0: 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 3b 0a 20  INT_RELEASE );. 
49b0: 20 20 20 61 73 73 65 72 74 28 20 69 53 76 70 74     assert( iSvpt
49c0: 3e 3d 30 20 7c 7c 20 28 69 53 76 70 74 3d 3d 2d  >=0 || (iSvpt==-
49d0: 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
49e0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
49f0: 20 20 20 20 69 66 28 20 69 53 76 70 74 3c 30 20      if( iSvpt<0 
4a00: 29 7b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e  ){.      pMap->n
4a10: 53 76 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Svpt = 0;.      
4a20: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20  pMap->nRollback 
4a30: 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  = 0;.      memse
4a40: 74 28 70 4d 61 70 2d 3e 61 50 74 72 2c 20 30 2c  t(pMap->aPtr, 0,
4a50: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 2a 20   sizeof(Pgno) * 
4a60: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 29  pMap->nPtrAlloc)
4a70: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4a80: 69 53 76 70 74 3c 70 4d 61 70 2d 3e 6e 53 76 70  iSvpt<pMap->nSvp
4a90: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  t ){.      if( o
4aa0: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
4ab0: 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
4ac0: 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
4ad0: 20 66 6f 72 28 69 69 3d 70 4d 61 70 2d 3e 6e 52   for(ii=pMap->nR
4ae0: 6f 6c 6c 62 61 63 6b 2d 31 3b 20 69 69 3e 3d 70  ollback-1; ii>=p
4af0: 4d 61 70 2d 3e 61 53 76 70 74 5b 69 53 76 70 74  Map->aSvpt[iSvpt
4b00: 5d 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  ]; ii--){.      
4b10: 20 20 20 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72      RollbackEntr
4b20: 79 20 2a 70 20 3d 20 26 70 4d 61 70 2d 3e 61 52  y *p = &pMap->aR
4b30: 6f 6c 6c 62 61 63 6b 5b 69 69 5d 3b 0a 20 20 20  ollback[ii];.   
4b40: 20 20 20 20 20 20 20 50 74 72 6d 61 70 45 6e 74         PtrmapEnt
4b50: 72 79 20 2a 70 45 6e 74 72 79 20 3d 20 26 70 4d  ry *pEntry = &pM
4b60: 61 70 2d 3e 61 50 74 72 5b 70 2d 3e 70 67 6e 6f  ap->aPtr[p->pgno
4b70: 20 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 5d   - pMap->iFirst]
4b80: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 6e 74  ;.          pEnt
4b90: 72 79 2d 3e 70 61 72 65 6e 74 20 3d 20 70 2d 3e  ry->parent = p->
4ba0: 70 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  parent;.        
4bb0: 20 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 20    pEntry->eType 
4bc0: 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20  = p->eType;.    
4bd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4be0: 20 20 20 20 70 4d 61 70 2d 3e 6e 53 76 70 74 20      pMap->nSvpt 
4bf0: 3d 20 69 53 76 70 74 20 2b 20 28 6f 70 3d 3d 53  = iSvpt + (op==S
4c00: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
4c10: 4b 29 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e  K);.      pMap->
4c20: 6e 52 6f 6c 6c 62 61 63 6b 20 3d 20 70 4d 61 70  nRollback = pMap
4c30: 2d 3e 61 53 76 70 74 5b 69 53 76 70 74 5d 3b 0a  ->aSvpt[iSvpt];.
4c40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20      }.  }.}../* 
4c50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4c60: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29  OMIT_CONCURRENT)
4c70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
4c80: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
4c90: 66 74 65 72 20 61 6e 20 43 4f 4e 43 55 52 52 45  fter an CONCURRE
4ca0: 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  NT transaction i
4cb0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 0a  s opened on the.
4cc0: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 49 74 20  ** database. It 
4cd0: 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 42 74  allocates the Bt
4ce0: 72 65 65 50 74 72 6d 61 70 20 73 74 72 75 63 74  reePtrmap struct
4cf0: 75 72 65 20 75 73 65 64 20 74 6f 20 74 72 61 63  ure used to trac
4d00: 6b 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f  k pointers.** to
4d10: 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 73   allocated pages
4d20: 20 61 6e 64 20 7a 65 72 6f 65 73 20 74 68 65 20   and zeroes the 
4d30: 6e 46 72 65 65 2f 69 54 72 75 6e 6b 20 66 69 65  nFree/iTrunk fie
4d40: 6c 64 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  lds in the datab
4d50: 61 73 65 20 0a 2a 2a 20 68 65 61 64 65 72 20 6f  ase .** header o
4d60: 6e 20 70 61 67 65 20 31 2e 0a 2a 2f 0a 73 74 61  n page 1..*/.sta
4d70: 74 69 63 20 69 6e 74 20 62 74 72 65 65 50 74 72  tic int btreePtr
4d80: 6d 61 70 41 6c 6c 6f 63 61 74 65 28 42 74 53 68  mapAllocate(BtSh
4d90: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
4da0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
4db0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 4d 61  ;.  if( pBt->pMa
4dc0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 42 74 72 65  p==0 ){.    Btre
4dd0: 65 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20  ePtrmap *pMap = 
4de0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
4df0: 69 7a 65 6f 66 28 42 74 72 65 65 50 74 72 6d 61  izeof(BtreePtrma
4e00: 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 61  p));.    if( pMa
4e10: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  p==0 ){.      rc
4e20: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4e30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4e40: 20 20 6d 65 6d 73 65 74 28 26 70 42 74 2d 3e 70    memset(&pBt->p
4e50: 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
4e60: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 33 32 29  , 0, sizeof(u32)
4e70: 2a 32 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  *2);.      memse
4e80: 74 28 70 4d 61 70 2c 20 30 2c 20 73 69 7a 65 6f  t(pMap, 0, sizeo
4e90: 66 28 42 74 72 65 65 50 74 72 6d 61 70 29 29 3b  f(BtreePtrmap));
4ea0: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 69 46 69  .      pMap->iFi
4eb0: 72 73 74 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65  rst = pBt->nPage
4ec0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d   + 1;.      pBt-
4ed0: 3e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20  >pMap = pMap;.  
4ee0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4ef0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69   rc;.}../* !defi
4f00: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4f10: 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a  CONCURRENT).**.*
4f20: 2a 20 46 72 65 65 20 61 6e 79 20 42 74 72 65 65  * Free any Btree
4f30: 50 74 72 6d 61 70 20 73 74 72 75 63 74 75 72 65  Ptrmap structure
4f40: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 6e   allocated by an
4f50: 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
4f60: 0a 2a 2a 20 62 74 72 65 65 50 74 72 6d 61 70 41  .** btreePtrmapA
4f70: 6c 6c 6f 63 61 74 65 28 29 2e 0a 2a 2f 0a 73 74  llocate()..*/.st
4f80: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
4f90: 74 72 6d 61 70 44 65 6c 65 74 65 28 42 74 53 68  trmapDelete(BtSh
4fa0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
4fb0: 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70 20  reePtrmap *pMap 
4fc0: 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69  = pBt->pMap;.  i
4fd0: 66 28 20 70 4d 61 70 20 29 7b 0a 20 20 20 20 73  f( pMap ){.    s
4fe0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 70  qlite3_free(pMap
4ff0: 2d 3e 61 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20  ->aRollback);.  
5000: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5010: 4d 61 70 2d 3e 61 50 74 72 29 3b 0a 20 20 20 20  Map->aPtr);.    
5020: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
5030: 70 2d 3e 61 53 76 70 74 29 3b 0a 20 20 20 20 73  p->aSvpt);.    s
5040: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 70  qlite3_free(pMap
5050: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4d 61 70  );.    pBt->pMap
5060: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73   = 0;.  }.}.#els
5070: 65 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  e  /* SQLITE_OMI
5080: 54 5f 43 4f 4e 43 55 52 52 45 4e 54 20 2a 2f 0a  T_CONCURRENT */.
5090: 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74  # define btreePt
50a0: 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28 78 29 20  rmapAllocate(x) 
50b0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69  SQLITE_OK.# defi
50c0: 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70 44 65  ne btreePtrmapDe
50d0: 6c 65 74 65 28 78 29 20 0a 23 20 64 65 66 69 6e  lete(x) .# defin
50e0: 65 20 62 74 72 65 65 50 74 72 6d 61 70 42 65 67  e btreePtrmapBeg
50f0: 69 6e 28 78 2c 79 29 20 20 53 51 4c 49 54 45 5f  in(x,y)  SQLITE_
5100: 4f 4b 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65  OK.# define btre
5110: 65 50 74 72 6d 61 70 45 6e 64 28 78 2c 79 2c 7a  ePtrmapEnd(x,y,z
5120: 29 20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ) .#endif /* SQL
5130: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
5140: 45 4e 54 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  ENT */..static v
5150: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
5160: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b  MemPage *pPage);
5170: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66    /* Forward ref
5180: 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  erence */../*.**
5190: 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  *** This routine
51a0: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
51b0: 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79  of assert() only
51c0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69   ****.**.** Veri
51d0: 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  fy that the curs
51e0: 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74  or holds the mut
51f0: 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72  ex on its BtShar
5200: 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ed.*/.#ifdef SQL
5210: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
5220: 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73   int cursorHolds
5230: 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a  Mutex(BtCursor *
5240: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
5250: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5260: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  p->pBt->mutex);.
5270: 7d 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61  }../* Verify tha
5280: 74 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  t the cursor and
5290: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 61 67   the BtShared ag
52a0: 72 65 65 20 61 62 6f 75 74 20 77 68 61 74 20 69  ree about what i
52b0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  s the current.**
52c0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74   database connet
52d0: 69 6f 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70  ion. This is imp
52e0: 6f 72 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64  ortant in shared
52f0: 2d 63 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20  -cache mode. If 
5300: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
5310: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e   connection poin
5320: 74 65 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d  ters get out-of-
5330: 73 79 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73  sync, it is poss
5340: 69 62 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65  ible for routine
5350: 73 20 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49  s like.** btreeI
5360: 6e 69 74 50 61 67 65 28 29 20 74 6f 20 72 65 66  nitPage() to ref
5370: 65 72 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20  erence an stale 
5380: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74  connection point
5390: 65 72 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  er that referenc
53a0: 65 73 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63  es a.** a connec
53b0: 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c  tion that has al
53c0: 72 65 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54  ready closed.  T
53d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
53e0: 73 65 64 20 69 6e 73 69 64 65 20 61 73 73 65 72  sed inside asser
53f0: 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
5400: 73 20 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74  s only and for t
5410: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f  he purpose of do
5420: 75 62 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68  uble-checking th
5430: 61 74 20 74 68 65 20 62 74 72 65 65 20 63 6f 64  at the btree cod
5440: 65 0a 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74  e.** does keep t
5450: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
5460: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20  ection pointers 
5470: 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73  up-to-date..*/.s
5480: 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72  tatic int cursor
5490: 4f 77 6e 73 42 74 53 68 61 72 65 64 28 42 74 43  OwnsBtShared(BtC
54a0: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73  ursor *p){.  ass
54b0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
54c0: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65  Mutex(p) );.  re
54d0: 74 75 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d  turn (p->pBtree-
54e0: 3e 64 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29  >db==p->pBt->db)
54f0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
5500: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
5510: 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20   overflow cache 
5520: 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 61  of the cursor pa
5530: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
5540: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f  t argument..** o
5550: 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  n the shared btr
5560: 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74  ee structure pBt
5570: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76  ..*/.#define inv
5580: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
5590: 61 63 68 65 28 70 43 75 72 29 20 28 70 43 75 72  ache(pCur) (pCur
55a0: 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42  ->curFlags &= ~B
55b0: 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a  TCF_ValidOvfl)..
55c0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
55d0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
55e0: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
55f0: 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  r all cursors op
5600: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ened.** on the s
5610: 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75  hared btree stru
5620: 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74  cture pBt..*/.st
5630: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
5640: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
5650: 61 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70  ache(BtShared *p
5660: 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  Bt){.  BtCursor 
5670: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
5680: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5690: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
56a0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
56b0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
56c0: 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69  ext){.    invali
56d0: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
56e0: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  e(p);.  }.}..#if
56f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5700: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
5710: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
5720: 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
5730: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
5740: 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65  tents of a table
5750: 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74  .** to invalidat
5760: 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63  e any incrblob c
5770: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
5780: 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  open on the.** r
5790: 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  ow or one of the
57a0: 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69   rows being modi
57b0: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  fied..**.** If a
57c0: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
57d0: 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68  able is true, th
57e0: 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  en the entire co
57f0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
5800: 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20   table is about 
5810: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49  to be deleted. I
5820: 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61  n this case inva
5830: 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62  lidate all incrb
5840: 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f  lob.** cursors o
5850: 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77  pen on any row w
5860: 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ithin the table 
5870: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70  with root-page p
5880: 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f  gnoRoot..**.** O
5890: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72 67  therwise, if arg
58a0: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
58b0: 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  le is false, the
58c0: 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a  n the row with.*
58d0: 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20  * rowid iRow is 
58e0: 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f  being replaced o
58f0: 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  r deleted. In th
5900: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
5910: 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65  te.** only those
5920: 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72   incrblob cursor
5930: 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73  s open on that s
5940: 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a  pecific row..*/.
5950: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
5960: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
5970: 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a  rsors(.  Btree *
5980: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
5990: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
59a0: 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
59b0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  /.  Pgno pgnoRoo
59c0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t,          /* T
59d0: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69  he table that mi
59e0: 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20  ght be changing 
59f0: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5a10: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
5a20: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
5a30: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
5a40: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
5a50: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
5a60: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
5a70: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
5a80: 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70  rsor *p;.  if( p
5a90: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
5aa0: 6f 62 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72  obCur==0 ) retur
5ab0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  n;.  assert( sql
5ac0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
5ad0: 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20  tex(pBtree) );. 
5ae0: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
5af0: 62 6c 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66  blobCur = 0;.  f
5b00: 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
5b10: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
5b20: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
5b30: 66 28 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  f( (p->curFlags 
5b40: 26 20 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29  & BTCF_Incrblob)
5b50: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
5b60: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
5b70: 43 75 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Cur = 1;.      i
5b80: 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  f( p->pgnoRoot==
5b90: 70 67 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43  pgnoRoot && (isC
5ba0: 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e  learTable || p->
5bb0: 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29  info.nKey==iRow)
5bc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
5bd0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
5be0: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a  NVALID;.      }.
5bf0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
5c00: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
5c10: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
5c20: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
5c30: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
5c40: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
5c50: 72 73 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23  rsors(w,x,y,z).#
5c60: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5c70: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
5c80: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
5c90: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
5ca0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
5cb0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
5cc0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
5cd0: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
5ce0: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
5cf0: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
5d00: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
5d10: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
5d20: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
5d30: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
5d40: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
5d50: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
5d60: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
5d70: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
5d80: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
5d90: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
5da0: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
5db0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
5dc0: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
5dd0: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
5de0: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
5df0: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
5e00: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
5e10: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
5e20: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
5e30: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
5e40: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
5e50: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
5e60: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
5e70: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
5e80: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
5e90: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
5ea0: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
5eb0: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
5ec0: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
5ed0: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
5ee0: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
5ef0: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
5f00: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
5f10: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
5f20: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
5f30: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
5f40: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
5f50: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
5f60: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
5f70: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
5f80: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
5f90: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
5fa0: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
5fb0: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
5fc0: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
5fd0: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
5fe0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
5ff0: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
6000: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
6010: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
6020: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
6030: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
6040: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
6050: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
6060: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
6070: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
6080: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
6090: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
60a0: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
60b0: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
60c0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
60d0: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
60e0: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
60f0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
6100: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
6110: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
6120: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
6130: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
6140: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
6150: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
6160: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
6170: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
6180: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
6190: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
61a0: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
61b0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
61c0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
61d0: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
61e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
61f0: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
6200: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
6210: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
6220: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
6230: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
6240: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
6250: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
6260: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
6270: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
6280: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
6290: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
62a0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
62b0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
62c0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
62d0: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74   2 above is omit
62e0: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
62f0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
6300: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
6310: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
6320: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
6330: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
6340: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
6350: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
6360: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
6370: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
6380: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
6390: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
63a0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
63b0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
63c0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
63d0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
63e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
63f0: 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a  <=pBt->nPage );.
6400: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
6410: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
6420: 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e  tvecCreate(pBt->
6430: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
6440: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
6450: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
6460: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
6470: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  T;.    }.  }.  i
6480: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6490: 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65   && pgno<=sqlite
64a0: 33 42 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d  3BitvecSize(pBt-
64b0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b  >pHasContent) ){
64c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
64d0: 33 42 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e  3BitvecSet(pBt->
64e0: 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e  pHasContent, pgn
64f0: 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
6500: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75   rc;.}../*.** Qu
6510: 65 72 79 20 74 68 65 20 42 74 53 68 61 72 65 64  ery the BtShared
6520: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63  .pHasContent vec
6530: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tor..**.** This 
6540: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
6550: 65 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c  ed when a free-l
6560: 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ist leaf page is
6570: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
6580: 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66  e.** free-list f
6590: 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72 65 74  or reuse. It ret
65a0: 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74  urns false if it
65b0: 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 74 72   is safe to retr
65c0: 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  ieve the.** page
65d0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
65e0: 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
65f0: 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
6600: 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72   set. True other
6610: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
6620: 69 6e 74 20 62 74 72 65 65 47 65 74 48 61 73 43  int btreeGetHasC
6630: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
6640: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
6650: 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20  {.  Bitvec *p = 
6660: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
6670: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26  ;.  return (p &&
6680: 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69   (pgno>sqlite3Bi
6690: 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73  tvecSize(p) || s
66a0: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
66b0: 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a  (p, pgno)));.}..
66c0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73  /*.** Clear (des
66d0: 74 72 6f 79 29 20 74 68 65 20 42 74 53 68 61 72  troy) the BtShar
66e0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
66f0: 69 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75  itvec. This shou
6700: 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64  ld be.** invoked
6710: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
6720: 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74 65  on of each write
6730: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f  -transaction..*/
6740: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
6750: 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
6760: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
6770: 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  {.  sqlite3Bitve
6780: 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48  cDestroy(pBt->pH
6790: 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42  asContent);.  pB
67a0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d  t->pHasContent =
67b0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c   0;.}../*.** Rel
67c0: 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  ease all of the 
67d0: 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66  apPage[] pages f
67e0: 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a  or a cursor..*/.
67f0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
6800: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
6810: 72 50 61 67 65 73 28 42 74 43 75 72 73 6f 72 20  rPages(BtCursor 
6820: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b  *pCur){.  int i;
6830: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70  .  for(i=0; i<=p
6840: 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
6850: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
6860: 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
6870: 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ]);.    pCur->ap
6880: 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d  Page[i] = 0;.  }
6890: 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
68a0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   -1;.}../*.** Th
68b0: 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20  e cursor passed 
68c0: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
68d0: 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  ment must point 
68e0: 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
68f0: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
6900: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
6910: 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61   (i.e. have eSta
6920: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
6930: 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
6940: 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20 63 75  ion saves the cu
6950: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79  rrent cursor key
6960: 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43   in variables pC
6970: 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20  ur->nKey and.** 
6980: 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49  pCur->pKey. SQLI
6990: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
69a0: 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
69b0: 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
69c0: 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  or .** code othe
69d0: 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rwise..**.** If 
69e0: 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70  the cursor is op
69f0: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20  en on an intkey 
6a00: 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  table, then the 
6a10: 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28  integer key.** (
6a20: 74 68 65 20 72 6f 77 69 64 29 20 69 73 20 73 74  the rowid) is st
6a30: 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b  ored in pCur->nK
6a40: 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65  ey and pCur->pKe
6a50: 79 20 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f  y is left set to
6a60: 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65  .** NULL. If the
6a70: 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20   cursor is open 
6a80: 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  on a non-intkey 
6a90: 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72  table, then pCur
6aa0: 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65  ->pKey is .** se
6ab0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
6ac0: 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20  malloced buffer 
6ad0: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
6ae0: 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
6af0: 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e  ing .** the key.
6b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
6b10: 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43  aveCursorKey(BtC
6b20: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
6b30: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
6b40: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55  OK;.  assert( CU
6b50: 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
6b60: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
6b70: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
6b80: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
6b90: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
6ba0: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
6bb0: 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
6bc0: 79 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79  y ){.    /* Only
6bd0: 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 72 65   the rowid is re
6be0: 71 75 69 72 65 64 20 66 6f 72 20 61 20 74 61 62  quired for a tab
6bf0: 6c 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20  le btree */.    
6c00: 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c  pCur->nKey = sql
6c10: 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72  ite3BtreeInteger
6c20: 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  Key(pCur);.  }el
6c30: 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61  se{.    /* For a
6c40: 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73  n index btree, s
6c50: 61 76 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ave the complete
6c60: 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   key content */.
6c70: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a      void *pKey;.
6c80: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
6c90: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
6ca0: 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a  loadSize(pCur);.
6cb0: 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
6cc0: 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e  e3Malloc( pCur->
6cd0: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20  nKey );.    if( 
6ce0: 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  pKey ){.      rc
6cf0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
6d00: 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
6d10: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
6d20: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
6d30: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6d40: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
6d50: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
6d60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6d70: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6d80: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
6d90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6da0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
6db0: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
6dc0: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75  }.  assert( !pCu
6dd0: 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20  r->curIntKey || 
6de0: 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  !pCur->pKey );. 
6df0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6e00: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
6e10: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
6e20: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
6e30: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
6e40: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
6e50: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
6e60: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
6e70: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
6e80: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
6e90: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
6ea0: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
6eb0: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
6ec0: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
6ed0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
6ee0: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
6ef0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
6f00: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
6f10: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6f20: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
6f30: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
6f40: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
6f50: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
6f60: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b  ate || CURSOR_SK
6f70: 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
6f80: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
6f90: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
6fa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
6fb0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
6fc0: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
6fd0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6fe0: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
6ff0: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
7000: 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
7010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
7020: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
7030: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76  .  }..  rc = sav
7040: 65 43 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29  eCursorKey(pCur)
7050: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
7060: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72  TE_OK ){.    btr
7070: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
7080: 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20  orPages(pCur);. 
7090: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
70a0: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
70b0: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75  SEEK;.  }..  pCu
70c0: 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
70d0: 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
70e0: 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
70f0: 54 43 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72  TCF_AtLast);.  r
7100: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
7110: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
7120: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
7130: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
7140: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
7150: 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f  t(BtCursor*,Pgno
7160: 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a  ,BtCursor*);../*
7170: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
7180: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
7190: 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45  rsors (except pE
71a0: 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20  xcept) that are 
71b0: 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74  open on.** the t
71c0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
71d0: 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76  age iRoot.  "Sav
71e0: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70  ing the cursor p
71f0: 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74  osition" means t
7200: 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74  hat.** the locat
7210: 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65  ion in the btree
7220: 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69   is remembered i
7230: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
7240: 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d  t it can be.** m
7250: 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  oved back to the
7260: 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72   same spot after
7270: 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62   the btree has b
7280: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
7290: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
72a0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
72b0: 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63  fore cursor pExc
72c0: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
72d0: 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62  odify the.** tab
72e0: 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  le, for example 
72f0: 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  in BtreeDelete()
7300: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
7310: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  )..**.** If ther
7320: 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
7330: 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  e cursors on the
7340: 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65   same btree, the
7350: 6e 20 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63  n all such .** c
7360: 75 72 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61  ursors should ha
7370: 76 65 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75  ve their BTCF_Mu
7380: 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
7390: 20 20 54 68 65 20 62 74 72 65 65 43 75 72 73 6f    The btreeCurso
73a0: 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65  r().** routine e
73b0: 6e 66 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c  nforces that rul
73c0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
73d0: 20 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62   only needs to b
73e0: 65 20 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74  e called in.** t
73f0: 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65  he uncommon case
7400: 20 77 68 65 6e 20 70 45 78 70 65 63 74 20 68 61   when pExpect ha
7410: 73 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  s the BTCF_Multi
7420: 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ple flag set..**
7430: 0a 2a 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d  .** If pExpect!=
7440: 4e 55 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f  NULL and if no o
7450: 74 68 65 72 20 63 75 72 73 6f 72 73 20 61 72 65  ther cursors are
7460: 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61   found on the sa
7470: 6d 65 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a  me root-page,.**
7480: 20 74 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d   then the BTCF_M
7490: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20  ultiple flag on 
74a0: 70 45 78 70 65 63 74 20 69 73 20 63 6c 65 61 72  pExpect is clear
74b0: 65 64 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f  ed, to avoid ano
74c0: 74 68 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73  ther.** pointles
74d0: 73 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  s call to this r
74e0: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d  outine..**.** Im
74f0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74  plementation not
7500: 65 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e:  This routine
7510: 20 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74   merely checks t
7520: 6f 20 73 65 65 20 69 66 20 61 6e 79 20 63 75 72  o see if any cur
7530: 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20  sors.** need to 
7540: 62 65 20 73 61 76 65 64 2e 20 20 49 74 20 63 61  be saved.  It ca
7550: 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43  lls out to saveC
7560: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69  ursorsOnList() i
7570: 6e 20 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a  n the (unusual).
7580: 2a 2a 20 65 76 65 6e 74 20 74 68 61 74 20 63 75  ** event that cu
7590: 72 73 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65  rsors are in nee
75a0: 64 20 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64  d to being saved
75b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
75c0: 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42  saveAllCursors(B
75d0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
75e0: 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73  no iRoot, BtCurs
75f0: 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20  or *pExcept){.  
7600: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
7610: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7620: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
7630: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
7640: 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c  t( pExcept==0 ||
7650: 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70   pExcept->pBt==p
7660: 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  Bt );.  for(p=pB
7670: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
7680: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
7690: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
76a0: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
76b0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
76c0: 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  t) ) break;.  }.
76d0: 20 20 69 66 28 20 70 20 29 20 72 65 74 75 72 6e    if( p ) return
76e0: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
76f0: 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78  st(p, iRoot, pEx
7700: 63 65 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78  cept);.  if( pEx
7710: 63 65 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e  cept ) pExcept->
7720: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
7730: 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65  F_Multiple;.  re
7740: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7750: 7d 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65  }../* This helpe
7760: 72 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76  r routine to sav
7770: 65 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73  eAllCursors does
7780: 20 74 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b   the actual work
7790: 20 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68   of saving.** th
77a0: 65 20 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64  e cursors if and
77b0: 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69   when a cursor i
77c0: 73 20 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74  s found that act
77d0: 75 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73  ually requires s
77e0: 61 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f  aving..** The co
77f0: 6d 6d 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61  mmon case is tha
7800: 74 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65  t no cursors nee
7810: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73  d to be saved, s
7820: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
7830: 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20  s.** broken out 
7840: 66 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20  from its caller 
7850: 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
7860: 73 61 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74  sary stack point
7870: 65 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a  er movement..*/.
7880: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
7890: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43  E_NOINLINE saveC
78a0: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20  ursorsOnList(.  
78b0: 42 74 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20  BtCursor *p,    
78c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73       /* The firs
78d0: 74 20 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65  t cursor that ne
78e0: 65 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20  eds saving */.  
78f0: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20  Pgno iRoot,     
7900: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76       /* Only sav
7910: 65 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68  e cursor with th
7920: 69 73 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61  is iRoot. Save a
7930: 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20  ll if zero */.  
7940: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
7950: 74 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  t    /* Do not s
7960: 61 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ave this cursor 
7970: 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20  */.){.  do{.    
7980: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
7990: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
79a0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
79b0: 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  t) ){.      if( 
79c0: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
79d0: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
79e0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
79f0: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
7a00: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
7a10: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
7a20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c  .        if( SQL
7a30: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
7a40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
7a50: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
7a60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7a70: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69    testcase( p->i
7a80: 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Page>0 );.      
7a90: 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c    btreeReleaseAl
7aa0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b  lCursorPages(p);
7ab0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7ac0: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
7ad0: 0a 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a  .  }while( p );.
7ae0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7af0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  OK;.}../*.** Cle
7b00: 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ar the current c
7b10: 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
7b20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
7b30: 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
7b40: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
7b50: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
7b60: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
7b70: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ) );.  sqlite3_f
7b80: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
7b90: 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20  .  pCur->pKey = 
7ba0: 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  0;.  pCur->eStat
7bb0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
7bc0: 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20  ID;.}../*.** In 
7bd0: 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  this version of 
7be0: 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65  BtreeMoveto, pKe
7bf0: 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e  y is a packed in
7c00: 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75  dex record.** su
7c10: 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74  ch as is generat
7c20: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
7c30: 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20  eRecord opcode. 
7c40: 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72   Unpack the.** r
7c50: 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63  ecord and then c
7c60: 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55  all BtreeMovetoU
7c70: 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20  npacked() to do 
7c80: 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61  the work..*/.sta
7c90: 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76  tic int btreeMov
7ca0: 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20  eto(.  BtCursor 
7cb0: 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75  *pCur,     /* Cu
7cc0: 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  rsor open on the
7cd0: 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61   btree to be sea
7ce0: 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  rched */.  const
7cf0: 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f   void *pKey,   /
7d00: 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20  * Packed key if 
7d10: 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20  the btree is an 
7d20: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e  index */.  i64 n
7d30: 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
7d40: 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  * Integer key fo
7d50: 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20  r tables.  Size 
7d60: 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69  of pKey for indi
7d70: 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  ces */.  int bia
7d80: 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
7d90: 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74  Bias search to t
7da0: 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
7db0: 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
7dc0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
7dd0: 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
7de0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
7df0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7e00: 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63       /* Status c
7e10: 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ode */.  Unpacke
7e20: 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
7e30: 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ;   /* Unpacked 
7e40: 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 0a 20 20  index key */..  
7e50: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
7e60: 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69  assert( nKey==(i
7e70: 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a  64)(int)nKey );.
7e80: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71      pIdxKey = sq
7e90: 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
7ea0: 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 43 75  packedRecord(pCu
7eb0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  r->pKeyInfo);.  
7ec0: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
7ed0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
7ee0: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
7ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
7f00: 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70  rdUnpack(pCur->p
7f10: 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b  KeyInfo, (int)nK
7f20: 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65  ey, pKey, pIdxKe
7f30: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  y);.    if( pIdx
7f40: 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29  Key->nField==0 )
7f50: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
7f60: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7f70: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
7f80: 65 74 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a  eto_done;.    }.
7f90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
7fa0: 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xKey = 0;.  }.  
7fb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
7fc0: 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
7fd0: 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e  pCur, pIdxKey, n
7fe0: 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29  Key, bias, pRes)
7ff0: 3b 0a 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20  ;.moveto_done:. 
8000: 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a   if( pIdxKey ){.
8010: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8020: 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  e(pCur->pKeyInfo
8030: 2d 3e 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a  ->db, pIdxKey);.
8040: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
8050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
8060: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
8070: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
8080: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
8090: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
80a0: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
80b0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
80c0: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
80d0: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
80e0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
80f0: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
8100: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
8110: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
8120: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
8130: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
8140: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
8150: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
8160: 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72  ion() call after
8170: 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75   each .** saveCu
8180: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a  rsorPosition()..
8190: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
81a0: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
81b0: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
81c0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
81d0: 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65  rc;.  int skipNe
81e0: 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  xt;.  assert( cu
81f0: 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
8200: 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
8210: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
8220: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
8230: 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
8240: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
8250: 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
8260: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
8270: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75  pNext;.  }.  pCu
8280: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
8290: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63  OR_INVALID;.  rc
82a0: 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70   = btreeMoveto(p
82b0: 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c  Cur, pCur->pKey,
82c0: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20   pCur->nKey, 0, 
82d0: 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66  &skipNext);.  if
82e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
82f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
8300: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
8310: 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  .    pCur->pKey 
8320: 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
8330: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
8340: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
8350: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
8360: 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20  SOR_INVALID );. 
8370: 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
8380: 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20  t |= skipNext;. 
8390: 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
83a0: 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65  pNext && pCur->e
83b0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
83c0: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75  LID ){.      pCu
83d0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
83e0: 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20  OR_SKIPNEXT;.   
83f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8400: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
8410: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
8420: 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e  tion(p) \.  (p->
8430: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
8440: 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20  EQUIRESEEK ? \. 
8450: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73          btreeRes
8460: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
8470: 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20  on(p) : \.      
8480: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f     SQLITE_OK)../
8490: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77  *.** Determine w
84a0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
84b0: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
84c0: 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69   from the positi
84d0: 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77  on where.** it w
84e0: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20  as last placed, 
84f0: 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61  or has been inva
8500: 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20  lidated for any 
8510: 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a  other reason..**
8520: 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76   Cursors can mov
8530: 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74  e when the row t
8540: 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67  hey are pointing
8550: 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f   at is deleted o
8560: 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72  ut.** from under
8570: 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70   them, for examp
8580: 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68  le.  Cursor migh
8590: 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61  t also move if a
85a0: 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62   btree.** is reb
85b0: 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  alanced..**.** C
85c0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
85d0: 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ine with a NULL 
85e0: 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72  cursor pointer r
85f0: 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a  eturns false..**
8600: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70 61  .** Use the sepa
8610: 72 61 74 65 20 73 71 6c 69 74 65 33 42 74 72 65  rate sqlite3Btre
8620: 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29  eCursorRestore()
8630: 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74   routine to rest
8640: 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  ore a cursor.** 
8650: 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74  back to where it
8660: 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66 20   ought to be if 
8670: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
8680: 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e  urns true..*/.in
8690: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
86a0: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
86b0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
86c0: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74  return pCur->eSt
86d0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
86e0: 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  D;.}../*.** This
86f0: 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65   routine restore
8700: 73 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20  s a cursor back 
8710: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
8720: 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69  position after i
8730: 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f  t.** has been mo
8740: 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73  ved by some outs
8750: 69 64 65 20 61 63 74 69 76 69 74 79 20 28 73 75  ide activity (su
8760: 63 68 20 61 73 20 61 20 62 74 72 65 65 20 72 65  ch as a btree re
8770: 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20  balance or.** a 
8780: 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20  row having been 
8790: 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
87a0: 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
87b0: 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  r).  .**.** On s
87c0: 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69  uccess, the *pDi
87d0: 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d  fferentRow param
87e0: 65 74 65 72 20 69 73 20 66 61 6c 73 65 20 69 66  eter is false if
87f0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   the cursor is l
8800: 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  eft.** pointing 
8810: 61 74 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  at exactly the s
8820: 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66  ame row.  *pDiff
8830: 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72  erntRow is the r
8840: 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  ow the cursor.**
8850: 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f   was pointing to
8860: 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65   has been delete
8870: 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63  d, forcing the c
8880: 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
8890: 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79  o some.** nearby
88a0: 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   row..**.** This
88b0: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
88c0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66  only be called f
88d0: 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
88e0: 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a   just returned.*
88f0: 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69  * TRUE from sqli
8900: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
8910: 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74  sMoved()..*/.int
8920: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
8930: 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75 72  sorRestore(BtCur
8940: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
8950: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a  pDifferentRow){.
8960: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
8970: 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a  ert( pCur!=0 );.
8980: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
8990: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
89a0: 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72  ALID );.  rc = r
89b0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
89c0: 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
89d0: 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69  ( rc ){.    *pDi
89e0: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
89f0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8a00: 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65   }.  if( pCur->e
8a10: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
8a20: 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66  LID ){.    *pDif
8a30: 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20  ferentRow = 1;. 
8a40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
8a50: 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
8a60: 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44  xt==0 );.    *pD
8a70: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b  ifferentRow = 0;
8a80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
8a90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64  LITE_OK;.}..#ifd
8aa0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
8ab0: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a  _CURSOR_HINTS./*
8ac0: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74  .** Provide hint
8ad0: 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e  s to the cursor.
8ae0: 20 20 54 68 65 20 70 61 72 74 69 63 75 6c 61 72    The particular
8af0: 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64   hint given (and
8b00: 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64   the type.** and
8b10: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76   number of the v
8b20: 61 72 61 72 67 73 20 70 61 72 61 6d 65 74 65 72  arargs parameter
8b30: 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  s) is determined
8b40: 20 62 79 20 74 68 65 20 65 48 69 6e 74 54 79 70   by the eHintTyp
8b50: 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20  e.** parameter. 
8b60: 20 53 65 65 20 74 68 65 20 64 65 66 69 6e 69 74   See the definit
8b70: 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45  ions of the BTRE
8b80: 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20  E_HINT_* macros 
8b90: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
8ba0: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
8bb0: 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75  eCursorHint(BtCu
8bc0: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
8bd0: 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b  eHintType, ...){
8be0: 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20  .  /* Used only 
8bf0: 62 79 20 73 79 73 74 65 6d 20 74 68 61 74 20 73  by system that s
8c00: 75 62 73 74 69 74 75 74 65 20 74 68 65 69 72 20  ubstitute their 
8c10: 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69  own storage engi
8c20: 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ne */.}.#endif..
8c30: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c  /*.** Provide fl
8c40: 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20  ag hints to the 
8c50: 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20  cursor..*/.void 
8c60: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
8c70: 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75  orHintFlags(BtCu
8c80: 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69  rsor *pCur, unsi
8c90: 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72  gned x){.  asser
8ca0: 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b  t( x==BTREE_SEEK
8cb0: 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f  _EQ || x==BTREE_
8cc0: 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30  BULKLOAD || x==0
8cd0: 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74   );.  pCur->hint
8ce0: 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  s = x;.}...#ifnd
8cf0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
8d00: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
8d10: 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d  Given a page num
8d20: 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72  ber of a regular
8d30: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
8d40: 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a  return the page.
8d50: 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
8d60: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  e pointer-map pa
8d70: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
8d80: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
8d90: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65  he.** input page
8da0: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52   number..**.** R
8db0: 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76  eturn 0 (not a v
8dc0: 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20 70  alid page) for p
8dd0: 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65  gno==1 since the
8de0: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e  re is.** no poin
8df0: 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74  ter map associat
8e00: 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e 20  ed with page 1. 
8e10: 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63   The integrity_c
8e20: 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65  heck logic.** re
8e30: 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72 6d  quires that ptrm
8e40: 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31  apPageno(*,1)!=1
8e50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
8e60: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74   ptrmapPageno(Bt
8e70: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
8e80: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e  o pgno){.  int n
8e90: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
8ea0: 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c  .  Pgno iPtrMap,
8eb0: 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20   ret;.  assert( 
8ec0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
8ed0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
8ee0: 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29  ;.  if( pgno<2 )
8ef0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61   return 0;.  nPa
8f00: 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20  gesPerMapPage = 
8f10: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
8f20: 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70  /5)+1;.  iPtrMap
8f30: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
8f40: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
8f50: 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e  ret = (iPtrMap*n
8f60: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29  PagesPerMapPage)
8f70: 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74   + 2; .  if( ret
8f80: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
8f90: 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
8fa0: 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ret++;.  }.  ret
8fb0: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
8fc0: 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79  * Write an entry
8fd0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
8fe0: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
8ff0: 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65  s routine update
9000: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
9010: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
9020: 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a   number 'key'.**
9030: 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73   so that it maps
9040: 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27   to type 'eType'
9050: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
9060: 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a   number 'pgno'..
9070: 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73  **.** If *pRC is
9080: 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a   initially non-z
9090: 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f  ero (non-SQLITE_
90a0: 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f  OK) then this ro
90b0: 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f  utine is.** a no
90c0: 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  -op.  If an erro
90d0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70  r occurs, the ap
90e0: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
90f0: 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a  code is written.
9100: 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f  ** into *pRC..*/
9110: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
9120: 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20  mapPut(BtShared 
9130: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
9140: 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70  u8 eType, Pgno p
9150: 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29  arent, int *pRC)
9160: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
9170: 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69  age;  /* The poi
9180: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
9190: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
91a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
91b0: 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a  ter map data */.
91c0: 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20    Pgno iPtrmap; 
91d0: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
91e0: 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  er map page numb
91f0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  er */.  int offs
9200: 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  et;       /* Off
9210: 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  set in pointer m
9220: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ap page */.  int
9230: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f   rc;           /
9240: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
9250: 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20  om subfunctions 
9260: 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
9270: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
9280: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9290: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
92a0: 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d  x) );.  /* The m
92b0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61  aster-journal pa
92c0: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6e 65 76  ge number is nev
92d0: 65 72 20 61 64 64 65 64 20 74 6f 20 61 20 70 6f  er added to a po
92e0: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 2a  inter-map page *
92f0: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
9300: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
9310: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
9320: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 23 69  AGE(pBt)) );..#i
9330: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9340: 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69  T_CONCURRENT.  i
9350: 66 28 20 70 42 74 2d 3e 70 4d 61 70 20 29 7b 0a  f( pBt->pMap ){.
9360: 20 20 20 20 2a 70 52 43 20 3d 20 62 74 72 65 65      *pRC = btree
9370: 50 74 72 6d 61 70 53 74 6f 72 65 28 70 42 74 2c  PtrmapStore(pBt,
9380: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
9390: 65 6e 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ent);.    return
93a0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
93b0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
93c0: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
93d0: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a   key==0 ){.    *
93e0: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
93f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
9400: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74  eturn;.  }.  iPt
9410: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
9420: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
9430: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
9440: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
9450: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
9460: 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  bPage, 0);.  if(
9470: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9480: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
9490: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
94a0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
94b0: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
94c0: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
94d0: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
94e0: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
94f0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9500: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
9510: 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  it;.  }.  assert
9520: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
9530: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
9540: 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  -5 );.  pPtrmap 
9550: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
9560: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
9570: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
9580: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
9590: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
95a0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
95b0: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
95c0: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
95d0: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
95e0: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
95f0: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
9600: 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73      *pRC= rc = s
9610: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
9620: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
9630: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9640: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
9650: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
9660: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
9670: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
9680: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
9690: 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70     }.  }..ptrmap
96a0: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
96b0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
96c0: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
96d0: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
96e0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
96f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9700: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
9710: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
9720: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
9730: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
9740: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
9750: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
9760: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
9770: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
9780: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
9790: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
97a0: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
97b0: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
97c0: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
97d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
97e0: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
97f0: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
9800: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
9810: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
9820: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
9830: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
9840: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
9850: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
9860: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
9870: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
9880: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
9890: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
98a0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
98b0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
98c0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
98d0: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
98e0: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
98f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
9900: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9910: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
9920: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
9930: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
9940: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
9950: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
9960: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
9970: 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20   &pDbPage, 0);. 
9980: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
9990: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
99a0: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
99b0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
99c0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
99d0: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
99e0: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
99f0: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
9a00: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
9a10: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
9a20: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
9a30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9a40: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9a50: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
9a60: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
9a70: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
9a80: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
9a90: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
9aa0: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
9ab0: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
9ac0: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
9ad0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
9ae0: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
9af0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
9b00: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
9b10: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
9b20: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
9b30: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9b40: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  PT;.  return SQL
9b50: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
9b60: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
9b70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
9b80: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
9b90: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
9ba0: 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69  ,y,z,rc).  #defi
9bb0: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
9bc0: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
9bd0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
9be0: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c  PutOvflPtr(x, y,
9bf0: 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   rc).#endif../*.
9c00: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
9c10: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
9c20: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
9c30: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
9c40: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
9c50: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
9c60: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
9c70: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
9c80: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
9c90: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
9ca0: 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73  *.** findCellPas
9cb0: 74 50 74 72 28 29 20 64 6f 65 73 20 74 68 65 20  tPtr() does the 
9cc0: 73 61 6d 65 20 65 78 63 65 70 74 20 69 74 20 73  same except it s
9cd0: 6b 69 70 73 20 70 61 73 74 20 74 68 65 20 69 6e  kips past the in
9ce0: 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20  itial.** 4-byte 
9cf0: 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f  child pointer fo
9d00: 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20  und on interior 
9d10: 70 61 67 65 73 2c 20 69 66 20 74 68 65 72 65 20  pages, if there 
9d20: 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  is one..**.** Th
9d30: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
9d40: 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20   only for pages 
9d50: 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74  that do not cont
9d60: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
9d70: 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66  ls..*/.#define f
9d80: 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20  indCell(P,I) \. 
9d90: 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28   ((P)->aData + (
9da0: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
9db0: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
9dc0: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
9dd0: 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65  *(I)]))).#define
9de0: 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
9df0: 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e  (P,I) \.  ((P)->
9e00: 61 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29  aDataOfst + ((P)
9e10: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
9e20: 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50  2byteAligned(&(P
9e30: 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49  )->aCellIdx[2*(I
9e40: 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  )]))).../*.** Th
9e50: 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69  is is common tai
9e60: 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  l processing for
9e70: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9e80: 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65  tr() and.** btre
9e90: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
9ea0: 65 78 28 29 20 66 6f 72 20 74 68 65 20 63 61 73  ex() for the cas
9eb0: 65 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20  e when the cell 
9ec0: 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74  does not fit ent
9ed0: 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69  irely.** on a si
9ee0: 6e 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65  ngle B-tree page
9ef0: 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72  .  Make necessar
9f00: 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f  y adjustments to
9f10: 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a   the CellInfo.**
9f20: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
9f30: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
9f40: 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65  NLINE void btree
9f50: 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53  ParseCellAdjustS
9f60: 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a  izeForOverflow(.
9f70: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
9f80: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
9f90: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
9fa0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
9fb0: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
9fc0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
9fd0: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
9fe0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
9ff0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
a000: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
a010: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f  ucture */.){.  /
a020: 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64  * If the payload
a030: 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f   will not fit co
a040: 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20  mpletely on the 
a050: 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68  local page, we h
a060: 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69  ave.  ** to deci
a070: 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  de how much to s
a080: 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64  tore locally and
a090: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69   how much to spi
a0a0: 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65  ll onto.  ** ove
a0b0: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
a0c0: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
a0d0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
a0e0: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
a0f0: 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65   ** space on ove
a100: 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c  rflow pages whil
a110: 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d  e keeping the am
a120: 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74  ount of local st
a130: 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65  orage.  ** in be
a140: 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61  tween minLocal a
a150: 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a  nd maxLocal..  *
a160: 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20  *.  ** Warning: 
a170: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
a180: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
a190: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
a1a0: 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61  d in any.  ** wa
a1b0: 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  y will result in
a1c0: 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
a1d0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20   file format..  
a1e0: 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61  */.  int minLoca
a1f0: 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61  l;  /* Minimum a
a200: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
a210: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
a220: 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b  .  int maxLocal;
a230: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
a240: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
a250: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
a260: 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20   int surplus;   
a270: 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c  /* Overflow payl
a280: 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  oad available fo
a290: 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20  r local storage 
a2a0: 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d  */..  minLocal =
a2b0: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
a2c0: 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ;.  maxLocal = p
a2d0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  Page->maxLocal;.
a2e0: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
a2f0: 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e  ocal + (pInfo->n
a300: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
a310: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
a320: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a  >usableSize-4);.
a330: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
a340: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b  lus==maxLocal );
a350: 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72  .  testcase( sur
a360: 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31  plus==maxLocal+1
a370: 20 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75   );.  if( surplu
a380: 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b  s <= maxLocal ){
a390: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
a3a0: 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75  al = (u16)surplu
a3b0: 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
a3c0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
a3d0: 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  (u16)minLocal;. 
a3e0: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a   }.  pInfo->nSiz
a3f0: 65 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f  e = (u16)(&pInfo
a400: 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f  ->pPayload[pInfo
a410: 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c  ->nLocal] - pCel
a420: 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l) + 4;.}../*.**
a430: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
a440: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c  outines are impl
a450: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
a460: 68 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73  he MemPage.xPars
a470: 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f  eCell().** metho
a480: 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61  d..**.** Parse a
a490: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c   cell content bl
a4a0: 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20  ock and fill in 
a4b0: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72  the CellInfo str
a4c0: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74  ucture..**.** bt
a4d0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
a4e0: 29 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61  )        =>   ta
a4f0: 62 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e  ble btree leaf n
a500: 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72  odes.** btreePar
a510: 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28  seCellNoPayload(
a520: 29 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74  )  =>   table bt
a530: 72 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ree internal nod
a540: 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  es.** btreeParse
a550: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20  CellPtrIndex()  
a560: 20 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65   =>   index btre
a570: 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68  e nodes.**.** Th
a580: 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72  ere is also a wr
a590: 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62  apper function b
a5a0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
a5b0: 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a  that works for.*
a5c0: 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79  * all MemPage ty
a5d0: 70 65 73 20 61 6e 64 20 74 68 61 74 20 72 65 66  pes and that ref
a5e0: 65 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c  erences the cell
a5f0: 20 62 79 20 69 6e 64 65 78 20 72 61 74 68 65 72   by index rather
a600: 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e   than.** by poin
a610: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
a620: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
a630: 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a  llPtrNoPayload(.
a640: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
a650: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
a660: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
a670: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
a680: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
a690: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
a6a0: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
a6b0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
a6c0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
a6d0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
a6e0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61  ucture */.){.  a
a6f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
a700: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
a710: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
a720: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a730: 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73  >leaf==0 );.  as
a740: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
a750: 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a  ldPtrSize==4 );.
a760: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
a770: 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41  EBUG.  UNUSED_PA
a780: 52 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a  RAMETER(pPage);.
a790: 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e  #endif.  pInfo->
a7a0: 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56  nSize = 4 + getV
a7b0: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c  arint(&pCell[4],
a7c0: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
a7d0: 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  Key);.  pInfo->n
a7e0: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70  Payload = 0;.  p
a7f0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30  Info->nLocal = 0
a800: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
a810: 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  oad = 0;.  retur
a820: 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  n;.}.static void
a830: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
a840: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
a850: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
a860: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
a870: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
a880: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
a890: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
a8a0: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
a8b0: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
a8c0: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
a8d0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
a8e0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
a8f0: 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20  .  u8 *pIter;   
a900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
a910: 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  r scanning throu
a920: 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33  gh pCell */.  u3
a930: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
a940: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a950: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
a960: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36   payload */.  u6
a970: 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20  4 iKey;         
a980: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
a990: 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a  ed Key value */.
a9a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a9b0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
a9c0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
a9d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
a9e0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
a9f0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
aa00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
aa10: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b  e->intKeyLeaf );
aa20: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
aa30: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d  ->childPtrSize==
aa40: 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70  0 );.  pIter = p
aa50: 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  Cell;..  /* The 
aa60: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
aa70: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
aa80: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
aa90: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
aaa0: 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e  arint32(pIter, n
aab0: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20  Payload);.  **. 
aac0: 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20   ** The code is 
aad0: 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64  inlined to avoid
aae0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
aaf0: 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61  ..  */.  nPayloa
ab00: 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  d = *pIter;.  if
ab10: 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30  ( nPayload>=0x80
ab20: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
ab30: 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20   = &pIter[8];.  
ab40: 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78    nPayload &= 0x
ab50: 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  7f;.    do{.    
ab60: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50    nPayload = (nP
ab70: 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b  ayload<<7) | (*+
ab80: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
ab90: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49      }while( (*pI
aba0: 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49  ter)>=0x80 && pI
abb0: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
abc0: 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a    pIter++;..  /*
abd0: 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20   The next block 
abe0: 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76  of code is equiv
abf0: 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20  alent to:.  **. 
ac00: 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d   **     pIter +=
ac10: 20 67 65 74 56 61 72 69 6e 74 28 70 49 74 65 72   getVarint(pIter
ac20: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
ac30: 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  nKey);.  **.  **
ac40: 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c   The code is inl
ac50: 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20  ined to avoid a 
ac60: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20  function call.. 
ac70: 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49   */.  iKey = *pI
ac80: 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e  ter;.  if( iKey>
ac90: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20  =0x80 ){.    u8 
aca0: 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37  *pEnd = &pIter[7
acb0: 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30  ];.    iKey &= 0
acc0: 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31  x7f;.    while(1
acd0: 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20  ){.      iKey = 
ace0: 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b  (iKey<<7) | (*++
acf0: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
ad00: 20 20 20 20 20 69 66 28 20 28 2a 70 49 74 65 72       if( (*pIter
ad10: 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a  )<0x80 ) break;.
ad20: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 3e        if( pIter>
ad30: 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  =pEnd ){.       
ad40: 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38   iKey = (iKey<<8
ad50: 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20  ) | *++pIter;.  
ad60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ad70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
ad80: 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e   pIter++;..  pIn
ad90: 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34  fo->nKey = *(i64
ada0: 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f  *)&iKey;.  pInfo
adb0: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
adc0: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
add0: 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72  pPayload = pIter
ade0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
adf0: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
ae00: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
ae10: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
ae20: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
ae30: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79  +1 );.  if( nPay
ae40: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
ae50: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  Local ){.    /* 
ae60: 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73  This is the (eas
ae70: 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  y) common case w
ae80: 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  here the entire 
ae90: 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20  payload fits.   
aea0: 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c   ** on the local
aeb0: 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66   page.  No overf
aec0: 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e  low is required.
aed0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66  .    */.    pInf
aee0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c  o->nSize = nPayl
aef0: 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65  oad + (u16)(pIte
af00: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  r - pCell);.    
af10: 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  if( pInfo->nSize
af20: 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  <4 ) pInfo->nSiz
af30: 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f  e = 4;.    pInfo
af40: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
af50: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73  nPayload;.  }els
af60: 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  e{.    btreePars
af70: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
af80: 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65  orOverflow(pPage
af90: 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
afa0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
afb0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
afc0: 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d  lPtrIndex(.  Mem
afd0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
afe0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
aff0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
b000: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
b010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b020: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
b030: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
b040: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
b050: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
b060: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
b070: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
b080: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
b090: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
b0a0: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
b0b0: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
b0c0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
b0d0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
b0e0: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
b0f0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
b100: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b110: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b120: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
b130: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
b140: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
b150: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
b160: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
b170: 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d  ==0 );.  pIter =
b180: 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e   pCell + pPage->
b190: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
b1a0: 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65  nPayload = *pIte
b1b0: 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  r;.  if( nPayloa
b1c0: 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  d>=0x80 ){.    u
b1d0: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
b1e0: 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  [8];.    nPayloa
b1f0: 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  d &= 0x7f;.    d
b200: 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  o{.      nPayloa
b210: 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37  d = (nPayload<<7
b220: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
b230: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
b240: 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38  e( *(pIter)>=0x8
b250: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
b260: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
b270: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20  ;.  pInfo->nKey 
b280: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
b290: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
b2a0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
b2b0: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49  o->pPayload = pI
b2c0: 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ter;.  testcase(
b2d0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
b2e0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
b2f0: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
b300: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
b310: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
b320: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
b330: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
b340: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
b350: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
b360: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
b370: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
b380: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
b390: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
b3a0: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
b3b0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
b3c0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50  Info->nSize = nP
b3d0: 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70  ayload + (u16)(p
b3e0: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
b3f0: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53     if( pInfo->nS
b400: 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  ize<4 ) pInfo->n
b410: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
b420: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
b430: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d  16)nPayload;.  }
b440: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
b450: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
b460: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
b470: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
b480: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
b490: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
b4a0: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
b4b0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
b4c0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
b4d0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
b4e0: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
b4f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b500: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
b510: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
b520: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
b530: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
b540: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
b550: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67  ure */.){.  pPag
b560: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
b570: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
b580: 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e  age, iCell), pIn
b590: 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  fo);.}../*.** Th
b5a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
b5b0: 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65  ines are impleme
b5c0: 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
b5d0: 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a  MemPage.xCellSiz
b5e0: 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  e.** method..**.
b5f0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  ** Compute the t
b600: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
b610: 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c  ytes that a Cell
b620: 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65   needs in the ce
b630: 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20  ll.** data area 
b640: 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67  of the btree-pag
b650: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e  e.  The return n
b660: 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74  umber includes t
b670: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
b680: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c  header and the l
b690: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75  ocal payload, bu
b6a0: 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c  t not any overfl
b6b0: 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68  ow page or.** th
b6c0: 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
b6d0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
b6e0: 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65  ..**.** cellSize
b6f0: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20  PtrNoPayload()  
b700: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74    =>   table int
b710: 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63  ernal nodes.** c
b720: 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20  ellSizePtr()    
b730: 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c           =>   al
b740: 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20  l index nodes & 
b750: 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73  table leaf nodes
b760: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63  .*/.static u16 c
b770: 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61  ellSizePtr(MemPa
b780: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
b790: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
b7a0: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61  er = pCell + pPa
b7b0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
b7c0: 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
b7d0: 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70   over bytes of p
b7e0: 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45  Cell */.  u8 *pE
b7f0: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66     /* End mark f
b820: 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20  or a varint */. 
b830: 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20   u32 nSize;     
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
b860: 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  e value to retur
b870: 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  n */..#ifdef SQL
b880: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
b890: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
b8a0: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
b8b0: 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  on should always
b8c0: 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a   be the same as.
b8d0: 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e    ** the (CellIn
b8e0: 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20  fo.nSize) value 
b8f0: 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61  found by doing a
b900: 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74   full parse of t
b910: 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66  he.  ** cell. If
b920: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73   SQLITE_DEBUG is
b930: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
b940: 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74  ert() at the bot
b950: 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  tom of.  ** this
b960: 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69   function verifi
b970: 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76  es that this inv
b980: 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69  ariant is not vi
b990: 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c  olated. */.  Cel
b9a0: 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b  lInfo debuginfo;
b9b0: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
b9c0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
b9d0: 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a  l, &debuginfo);.
b9e0: 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20  #endif..  nSize 
b9f0: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
ba00: 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20  nSize>=0x80 ){. 
ba10: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
ba20: 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26  [8];.    nSize &
ba30: 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a  = 0x7f;.    do{.
ba40: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e        nSize = (n
ba50: 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  Size<<7) | (*++p
ba60: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
ba70: 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65    }while( *(pIte
ba80: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
ba90: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
baa0: 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70  pIter++;.  if( p
bab0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
bac0: 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77      /* pIter now
bad0: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36   points at the 6
bae0: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65  4-bit integer ke
baf0: 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61  y value, a varia
bb00: 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20  ble length .    
bb10: 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20  ** integer. The 
bb20: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
bb30: 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70  moves pIter to p
bb40: 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73  oint at the firs
bb50: 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61  t byte.    ** pa
bb60: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
bb70: 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a  e key value. */.
bb80: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
bb90: 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  r[9];.    while(
bba0: 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30   (*pIter++)&0x80
bbb0: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
bbc0: 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  ;.  }.  testcase
bbd0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
bbe0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
bbf0: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
bc00: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
bc10: 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c   );.  if( nSize<
bc20: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
bc30: 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d   ){.    nSize +=
bc40: 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70   (u32)(pIter - p
bc50: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e  Cell);.    if( n
bc60: 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d  Size<4 ) nSize =
bc70: 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   4;.  }else{.   
bc80: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20   int minLocal = 
bc90: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
bca0: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e  .    nSize = min
bcb0: 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d  Local + (nSize -
bcc0: 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50   minLocal) % (pP
bcd0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
bce0: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
bcf0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
bd00: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
bd10: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
bd20: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
bd30: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20  axLocal+1 );.   
bd40: 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65   if( nSize>pPage
bd50: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
bd60: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
bd70: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
bd80: 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31  nSize += 4 + (u1
bd90: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
bda0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
bdb0: 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66   nSize==debuginf
bdc0: 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55  o.nSize || CORRU
bdd0: 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72  PT_DB );.  retur
bde0: 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a  n (u16)nSize;.}.
bdf0: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
be00: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  izePtrNoPayload(
be10: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
be20: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38  u8 *pCell){.  u8
be30: 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20   *pIter = pCell 
be40: 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  + 4; /* For loop
be50: 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f  ing over bytes o
be60: 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  f pCell */.  u8 
be70: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
be80: 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20      /* End mark 
be90: 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a  for a varint */.
bea0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
beb0: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
bec0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
bed0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
bee0: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
bef0: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
bf00: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
bf10: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
bf20: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
bf30: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
bf40: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
bf50: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
bf60: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
bf70: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
bf80: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
bf90: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
bfa0: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
bfb0: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
bfc0: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
bfd0: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
bfe0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
bff0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
c000: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65  ebuginfo);.#else
c010: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
c020: 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64  TER(pPage);.#end
c030: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
c040: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
c050: 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d  e==4 );.  pEnd =
c060: 20 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68   pIter + 9;.  wh
c070: 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26  ile( (*pIter++)&
c080: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
c090: 6e 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nd );.  assert( 
c0a0: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d  debuginfo.nSize=
c0b0: 3d 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70  =(u16)(pIter - p
c0c0: 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54  Cell) || CORRUPT
c0d0: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
c0e0: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
c0f0: 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  ell);.}...#ifdef
c100: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
c110: 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20   This variation 
c120: 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29  on cellSizePtr()
c130: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
c140: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
c150: 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20  ements.** only. 
c160: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
c170: 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a  llSize(MemPage *
c180: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
c190: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
c1a0: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
c1b0: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
c1c0: 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23  ge, iCell));.}.#
c1d0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
c1e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
c1f0: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
c200: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
c210: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
c220: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
c230: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
c240: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
c250: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
c260: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
c270: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
c280: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
c290: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
c2a0: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
c2b0: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
c2c0: 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29  pCell, int *pRC)
c2d0: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
c2e0: 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  o;.  if( *pRC ) 
c2f0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
c300: 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( pCell!=0 );.  
c310: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
c320: 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
c330: 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
c340: 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e  fo.nLocal<info.n
c350: 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50  Payload ){.    P
c360: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
c370: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
c380: 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70  nSize-4]);.    p
c390: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
c3a0: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
c3b0: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
c3c0: 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a  ge->pgno, pRC);.
c3d0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
c3e0: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
c3f0: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
c400: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6f  This routine reo
c410: 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20 77  rganizes cells w
c420: 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ithin the.** pag
c430: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
c440: 61 72 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f 63  are no free-bloc
c450: 6b 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 62  ks on the free-b
c460: 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  lock list..**.**
c470: 20 50 61 72 61 6d 65 74 65 72 20 6e 4d 61 78 46   Parameter nMaxF
c480: 72 61 67 20 69 73 20 74 68 65 20 6d 61 78 69 6d  rag is the maxim
c490: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 61  um amount of fra
c4a0: 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20 74 68  gmented space th
c4b0: 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72 65  at may be.** pre
c4c0: 73 65 6e 74 20 69 6e 20 74 68 65 20 70 61 67 65  sent in the page
c4d0: 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   after this rout
c4e0: 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  ine returns..**.
c4f0: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
c500: 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51  R-44582-60138 SQ
c510: 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69  Lite may from ti
c520: 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67  me to time reorg
c530: 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65  anize a.** b-tre
c540: 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74  e page so that t
c550: 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65  here are no free
c560: 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65  blocks or fragme
c570: 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a  nt bytes, all.**
c580: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72   unused bytes ar
c590: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
c5a0: 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73  he unallocated s
c5b0: 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64  pace region, and
c5c0: 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72   all.** cells ar
c5d0: 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79  e packed tightly
c5e0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
c5f0: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
c600: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
c610: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
c620: 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46 72  Page, int nMaxFr
c630: 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ag){.  int i;   
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c650: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
c660: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
c670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c680: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
c690: 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  the i-th cell */
c6a0: 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c6c0: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70   Offset to the p
c6d0: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
c6e0: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
c6f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
c700: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
c710: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
c720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
c730: 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  Number of usable
c740: 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65   bytes on a page
c750: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
c760: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
c770: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
c780: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
c790: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62  rray */.  int cb
c7a0: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
c7b0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
c7c0: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
c7d0: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
c7e0: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
c7f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c800: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
c810: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  e page */.  unsi
c820: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
c830: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
c840: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73  ge data */.  uns
c850: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
c860: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  ;       /* Temp 
c870: 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f  area for cell co
c880: 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ntent */.  unsig
c890: 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20  ned char *src;  
c8a0: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
c8b0: 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  of content */.  
c8c0: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
c8d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
c8e0: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
c8f0: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
c900: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
c910: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
c920: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
c930: 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ndex */..  asser
c940: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
c950: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
c960: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c970: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
c980: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
c990: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t( pPage->pBt->u
c9a0: 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c  sableSize <= SQL
c9b0: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
c9c0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
c9d0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
c9e0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
c9f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ca00: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
ca10: 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20  utex) );.  temp 
ca20: 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74  = 0;.  src = dat
ca30: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
ca40: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
ca50: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
ca60: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
ca70: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
ca80: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
ca90: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
caa0: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
cab0: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b  &data[hdr+3]) );
cac0: 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20  .  iCellFirst = 
cad0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
cae0: 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69  Cell;.  usableSi
caf0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
cb00: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20  >usableSize;..  
cb10: 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61  /* This block ha
cb20: 6e 64 6c 65 73 20 70 61 67 65 73 20 77 69 74 68  ndles pages with
cb30: 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 66 72   two or fewer fr
cb40: 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d  ee blocks and nM
cb50: 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20 66  axFrag.  ** or f
cb60: 65 77 65 72 20 66 72 61 67 6d 65 6e 74 65 64 20  ewer fragmented 
cb70: 62 79 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63  bytes. In this c
cb80: 61 73 65 20 69 74 20 69 73 20 66 61 73 74 65 72  ase it is faster
cb90: 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20 2a   to move the.  *
cba0: 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20 62  * two (or one) b
cbb0: 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20 75  locks of cells u
cbc0: 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20 61  sing memmove() a
cbd0: 6e 64 20 61 64 64 20 74 68 65 20 72 65 71 75 69  nd add the requi
cbe0: 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74 73  red.  ** offsets
cbf0: 20 74 6f 20 65 61 63 68 20 70 6f 69 6e 74 65 72   to each pointer
cc00: 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69   in the cell-poi
cc10: 6e 74 65 72 20 61 72 72 61 79 20 74 68 61 6e 20  nter array than 
cc20: 69 74 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20 72  it is to .  ** r
cc30: 65 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 65  econstruct the e
cc40: 6e 74 69 72 65 20 70 61 67 65 2e 20 20 2a 2f 0a  ntire page.  */.
cc50: 20 20 69 66 28 20 28 69 6e 74 29 64 61 74 61 5b    if( (int)data[
cc60: 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61 67  hdr+7]<=nMaxFrag
cc70: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 72 65   ){.    int iFre
cc80: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
cc90: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
cca0: 69 66 28 20 69 46 72 65 65 20 29 7b 0a 20 20 20  if( iFree ){.   
ccb0: 20 20 20 69 6e 74 20 69 46 72 65 65 32 20 3d 20     int iFree2 = 
ccc0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
ccd0: 46 72 65 65 5d 29 3b 0a 0a 20 20 20 20 20 20 2f  Free]);..      /
cce0: 2a 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29  * pageFindSlot()
ccf0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 76 65 72   has already ver
cd00: 69 66 69 65 64 20 74 68 61 74 20 66 72 65 65 20  ified that free 
cd10: 62 6c 6f 63 6b 73 20 61 72 65 20 73 6f 72 74 65  blocks are sorte
cd20: 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f 72  d.      ** in or
cd30: 64 65 72 20 6f 66 20 6f 66 66 73 65 74 20 77 69  der of offset wi
cd40: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2c 20 61  thin the page, a
cd50: 6e 64 20 74 68 61 74 20 6e 6f 20 62 6c 6f 63 6b  nd that no block
cd60: 20 65 78 74 65 6e 64 73 0a 20 20 20 20 20 20 2a   extends.      *
cd70: 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
cd80: 66 20 74 68 65 20 70 61 67 65 2e 20 50 72 6f 76  f the page. Prov
cd90: 69 64 65 64 20 74 68 65 20 74 77 6f 20 66 72 65  ided the two fre
cda0: 65 20 73 6c 6f 74 73 20 64 6f 20 6e 6f 74 20 0a  e slots do not .
cdb0: 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 6c 61 70        ** overlap
cdc0: 2c 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65  , this guarantee
cdd0: 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6d 6f  s that the memmo
cde0: 76 65 28 29 20 63 61 6c 6c 73 20 62 65 6c 6f 77  ve() calls below
cdf0: 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 20 20   will not.      
ce00: 2a 2a 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ** overwrite the
ce10: 20 75 73 61 62 6c 65 53 69 7a 65 20 62 79 74 65   usableSize byte
ce20: 20 62 75 66 66 65 72 2c 20 65 76 65 6e 20 69 66   buffer, even if
ce30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
ce40: 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63  ge.      ** is c
ce50: 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 20 20  orrupt.  */.    
ce60: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 32    assert( iFree2
ce70: 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 3e 69 46  ==0 || iFree2>iF
ce80: 72 65 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ree );.      ass
ce90: 65 72 74 28 20 69 46 72 65 65 2b 67 65 74 32 62  ert( iFree+get2b
cea0: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  yte(&data[iFree+
ceb0: 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a  2]) <= usableSiz
cec0: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
ced0: 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20  t( iFree2==0 || 
cee0: 69 46 72 65 65 32 2b 67 65 74 32 62 79 74 65 28  iFree2+get2byte(
cef0: 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29  &data[iFree2+2])
cf00: 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29   <= usableSize )
cf10: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
cf20: 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b  iFree2 || (data[
cf30: 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61  iFree2]==0 && da
cf40: 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29  ta[iFree2+1]==0)
cf50: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
cf60: 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c  pEnd = &data[cel
cf70: 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a  lOffset + nCell*
cf80: 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a  2];.        u8 *
cf90: 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69  pAddr;.        i
cfa0: 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20  nt sz2 = 0;.    
cfb0: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74      int sz = get
cfc0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
cfd0: 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  e+2]);.        i
cfe0: 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  nt top = get2byt
cff0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
d000: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72  .        if( iFr
d010: 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ee2 ){.         
d020: 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e 69 46   if( iFree+sz>iF
d030: 72 65 65 32 20 29 20 72 65 74 75 72 6e 20 53 51  ree2 ) return SQ
d040: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d050: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 32  T;.          sz2
d060: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
d070: 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a 20 20  a[iFree2+2]);.  
d080: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d090: 69 46 72 65 65 2b 73 7a 2b 73 7a 32 2b 69 46 72  iFree+sz+sz2+iFr
d0a0: 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29 20 3c  ee2-(iFree+sz) <
d0b0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
d0c0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76            memmov
d0d0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a  e(&data[iFree+sz
d0e0: 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72  +sz2], &data[iFr
d0f0: 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28  ee+sz], iFree2-(
d100: 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20  iFree+sz));.    
d110: 20 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b        sz += sz2;
d120: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d130: 20 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a     cbrk = top+sz
d140: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d150: 28 20 63 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f  ( cbrk+(iFree-to
d160: 70 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65  p) <= usableSize
d170: 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d   );.        memm
d180: 6f 76 65 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  ove(&data[cbrk],
d190: 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72   &data[top], iFr
d1a0: 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20 20 20  ee-top);.       
d1b0: 20 66 6f 72 28 70 41 64 64 72 3d 26 64 61 74 61   for(pAddr=&data
d1c0: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41  [cellOffset]; pA
d1d0: 64 64 72 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b  ddr<pEnd; pAddr+
d1e0: 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  =2){.          p
d1f0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
d200: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dr);.          i
d210: 66 28 20 70 63 3c 69 46 72 65 65 20 29 7b 20 70  f( pc<iFree ){ p
d220: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70  ut2byte(pAddr, p
d230: 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20  c+sz); }.       
d240: 20 20 20 65 6c 73 65 20 69 66 28 20 70 63 3c 69     else if( pc<i
d250: 46 72 65 65 32 20 29 7b 20 70 75 74 32 62 79 74  Free2 ){ put2byt
d260: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 32 29  e(pAddr, pc+sz2)
d270: 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ; }.        }.  
d280: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 66 72 61        goto defra
d290: 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20  gment_out;.     
d2a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
d2b0: 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a  cbrk = usableSiz
d2c0: 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  e;.  iCellLast =
d2d0: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
d2e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
d2f0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
d300: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
d310: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
d320: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
d330: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
d340: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
d350: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
d360: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73  (pAddr);.    tes
d370: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
d380: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
d390: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
d3a0: 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54  Last );.    /* T
d3b0: 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  hese conditions 
d3c0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
d3d0: 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74  n verified in bt
d3e0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20  reeInitPage().  
d3f0: 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63    ** if PRAGMA c
d400: 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f  ell_size_check=O
d410: 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  N..    */.    if
d420: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
d430: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
d440: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
d450: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d460: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
d470: 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c  ssert( pc>=iCell
d480: 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65  First && pc<=iCe
d490: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69  llLast );.    si
d4a0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c  ze = pPage->xCel
d4b0: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73 72  lSize(pPage, &sr
d4c0: 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  c[pc]);.    cbrk
d4d0: 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66   -= size;.    if
d4e0: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
d4f0: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
d500: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
d510: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d520: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
d530: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
d540: 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65  brk+size<=usable
d550: 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43  Size && cbrk>=iC
d560: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
d570: 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73  testcase( cbrk+s
d580: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
d590: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
d5a0: 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65   pc+size==usable
d5b0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32  Size );.    put2
d5c0: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
d5d0: 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d  );.    if( temp=
d5e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
d5f0: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62 72  x;.      if( cbr
d600: 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65  k==pc ) continue
d610: 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73  ;.      temp = s
d620: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
d630: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
d640: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
d650: 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
d660: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
d670: 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78    memcpy(&temp[x
d680: 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62  ], &data[x], (cb
d690: 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20  rk+size) - x);. 
d6a0: 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b       src = temp;
d6b0: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
d6c0: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
d6d0: 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a  src[pc], size);.
d6e0: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 2b 37    }.  data[hdr+7
d6f0: 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72 61 67 6d  ] = 0;.. defragm
d700: 65 6e 74 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64  ent_out:.  if( d
d710: 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72 6b 2d  ata[hdr+7]+cbrk-
d720: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
d730: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
d740: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d750: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
d760: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
d770: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
d780: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
d790: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
d7a0: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
d7b0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
d7c0: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61   0;.  memset(&da
d7d0: 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20  ta[iCellFirst], 
d7e0: 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  0, cbrk-iCellFir
d7f0: 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  st);.  assert( s
d800: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
d810: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
d820: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
d830: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d840: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
d850: 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70  e free-list on p
d860: 61 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63  age pPg for spac
d870: 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c  e to store a cel
d880: 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e  l nByte bytes in
d890: 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65  .** size. If one
d8a0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72   can be found, r
d8b0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
d8c0: 74 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64  to the space and
d8d0: 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72   remove it.** fr
d8e0: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
d8f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  ..**.** If no su
d900: 69 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e  itable space can
d910: 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65   be found on the
d920: 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75   free-list, retu
d930: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
d940: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
d950: 20 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69   detect corrupti
d960: 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20  on within pPg.  
d970: 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  If corruption is
d980: 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65  .** detected the
d990: 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  n *pRc is set to
d9a0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
d9b0: 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  and NULL is retu
d9c0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74  rned..**.** Slot
d9d0: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69  s on the free li
d9e0: 73 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77  st that are betw
d9f0: 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65  een 1 and 3 byte
da00: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42  s larger than nB
da10: 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69  yte.** will be i
da20: 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67  gnored if adding
da30: 20 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65   the extra space
da40: 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74   to the fragment
da50: 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63  ation count.** c
da60: 61 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65  auses the fragme
da70: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f  ntation count to
da80: 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73   exceed 60..*/.s
da90: 74 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69  tatic u8 *pageFi
daa0: 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a  ndSlot(MemPage *
dab0: 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  pPg, int nByte, 
dac0: 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e  int *pRc){.  con
dad0: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67  st int hdr = pPg
dae0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
daf0: 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
db00: 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20  = pPg->aData;.  
db10: 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20  int iAddr = hdr 
db20: 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20  + 1;.  int pc = 
db30: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
db40: 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78  iAddr]);.  int x
db50: 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  ;.  int usableSi
db60: 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
db70: 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73  sableSize;..  as
db80: 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20  sert( pc>0 );.  
db90: 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65  do{.    int size
dba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
dbb0: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  Size of the free
dbc0: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20   slot */.    /* 
dbd0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
dbe0: 36 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62  6866-39125 Freeb
dbf0: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73  locks are always
dc00: 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72   connected in or
dc10: 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e  der of.    ** in
dc20: 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e  creasing offset.
dc30: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75   */.    if( pc>u
dc40: 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70  sableSize-4 || p
dc50: 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20  c<iAddr+4 ){.   
dc60: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
dc70: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
dc80: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
dc90: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
dca0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30  ENCE-OF: R-22710
dcb0: 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64  -53328 The third
dcc0: 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65   and fourth byte
dcd0: 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a  s of each.    **
dce0: 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20   freeblock form 
dcf0: 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  a big-endian int
dd00: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
dd10: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72  e size of the fr
dd20: 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69  eeblock.    ** i
dd30: 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69  n bytes, includi
dd40: 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65  ng the 4-byte he
dd50: 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a  ader. */.    siz
dd60: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  e = get2byte(&aD
dd70: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
dd80: 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20  if( (x = size - 
dd90: 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20  nByte)>=0 ){.   
dda0: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
ddb0: 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  4 );.      testc
ddc0: 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20  ase( x==3 );.   
ddd0: 20 20 20 69 66 28 20 70 63 20 3c 20 70 50 67 2d     if( pc < pPg-
dde0: 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50  >cellOffset+2*pP
ddf0: 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65  g->nCell || size
de00: 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65  +pc > usableSize
de10: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63   ){.        *pRc
de20: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
de30: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
de40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
de50: 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b  }else if( x<4 ){
de60: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
de70: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38  ENCE-OF: R-11498
de80: 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c  -58022 In a well
de90: 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70  -formed b-tree p
dea0: 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20  age, the total. 
deb0: 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
dec0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61   of bytes in fra
ded0: 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65  gments may not e
dee0: 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20  xceed 60. */.   
def0: 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68       if( aData[h
df00: 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72  dr+7]>57 ) retur
df10: 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  n 0;..        /*
df20: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74   Remove the slot
df30: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
df40: 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20  ist. Update the 
df50: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
df60: 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20    ** fragmented 
df70: 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65  bytes within the
df80: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
df90: 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
dfa0: 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70  iAddr], &aData[p
dfb0: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
dfc0: 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20  aData[hdr+7] += 
dfd0: 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c  (u8)x;.      }el
dfe0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
dff0: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
e000: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
e010: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
e020: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
e030: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
e040: 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79   portion used by
e050: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
e060: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
e070: 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
e080: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
e090: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
e0a0: 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a  &aData[pc + x];.
e0b0: 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20      }.    iAddr 
e0c0: 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67  = pc;.    pc = g
e0d0: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
e0e0: 63 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70  c]);.  }while( p
e0f0: 63 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30  c );..  return 0
e100: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
e110: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
e120: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
e130: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
e140: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
e150: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
e160: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
e170: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
e180: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
e190: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
e1a0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
e1b0: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
e1c0: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
e1d0: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
e1e0: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
e1f0: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
e200: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
e210: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
e220: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
e230: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
e240: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
e250: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
e260: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
e270: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
e280: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
e290: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
e2a0: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
e2b0: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
e2c0: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
e2d0: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
e2e0: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
e2f0: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
e300: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
e310: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
e320: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
e330: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
e340: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
e350: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
e360: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
e370: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
e380: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
e390: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
e3a0: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
e3b0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
e3c0: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
e3d0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
e3e0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
e3f0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
e400: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
e410: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
e420: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
e430: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
e440: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
e450: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
e460: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Data */.  int to
e470: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e490: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
e4a0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
e4b0: 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  a */.  int rc = 
e4c0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
e4e0: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
e4f0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b  de */.  int gap;
e500: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
e510: 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74   byte of gap bet
e520: 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65  ween cell pointe
e530: 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74  rs and cell cont
e540: 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  ent */.  .  asse
e550: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
e560: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
e570: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
e580: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
e590: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
e5a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
e5b0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
e5c0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
e5d0: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
e5e0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
e5f0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
e600: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
e610: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
e620: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
e630: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
e640: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20    assert( nByte 
e650: 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70  < (int)(pPage->p
e660: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38  Bt->usableSize-8
e670: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
e680: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
e690: 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  t == hdr + 12 - 
e6a0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
e6b0: 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e  .  gap = pPage->
e6c0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
e6d0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
e6e0: 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33  ssert( gap<=6553
e6f0: 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  6 );.  /* EVIDEN
e700: 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30  CE-OF: R-29356-0
e710: 32 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61  2391 If the data
e720: 62 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33  base uses a 6553
e730: 36 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65  6-byte page size
e740: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
e750: 73 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20  served space is 
e760: 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20  zero (the usual 
e770: 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76  value for reserv
e780: 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74  ed space).  ** t
e790: 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  hen the cell con
e7a0: 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61  tent offset of a
e7b0: 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e  n empty page wan
e7c0: 74 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a  ts to be 65536..
e7d0: 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68    ** However, th
e7e0: 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f  at integer is to
e7f0: 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74  o large to be st
e800: 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65  ored in a 2-byte
e810: 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69   unsigned.  ** i
e820: 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c  nteger, so a val
e830: 75 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20  ue of 0 is used 
e840: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f  in its place. */
e850: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
e860: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
e870: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d  .  assert( top<=
e880: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
e890: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f  >usableSize ); /
e8a0: 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74  * Prevent by get
e8b0: 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f  AndInitPage() */
e8c0: 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29  .  if( gap>top )
e8d0: 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30  {.    if( top==0
e8e0: 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   && pPage->pBt->
e8f0: 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33  usableSize==6553
e900: 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d  6 ){.      top =
e910: 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73   65536;.    }els
e920: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
e930: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
e940: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
e950: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
e960: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65   enough space be
e970: 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f  tween gap and to
e980: 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63  p for one more c
e990: 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ell pointer.  **
e9a0: 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66   array entry off
e9b0: 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20  set, and if the 
e9c0: 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20  freelist is not 
e9d0: 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72  empty, then sear
e9e0: 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65  ch the.  ** free
e9f0: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
ea00: 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67   a free slot big
ea10: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
ea20: 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  fy the request..
ea30: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
ea40: 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20   gap+2==top );. 
ea50: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31   testcase( gap+1
ea60: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
ea70: 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b  ase( gap==top );
ea80: 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72  .  if( (data[hdr
ea90: 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b  +2] || data[hdr+
eaa0: 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f  1]) && gap+2<=to
eab0: 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70  p ){.    u8 *pSp
eac0: 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c  ace = pageFindSl
ead0: 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c  ot(pPage, nByte,
eae0: 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70   &rc);.    if( p
eaf0: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61  Space ){.      a
eb00: 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64  ssert( pSpace>=d
eb10: 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d  ata && (pSpace -
eb20: 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a   data)<65536 );.
eb30: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69        *pIdx = (i
eb40: 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74  nt)(pSpace - dat
eb50: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
eb60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
eb70: 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a  }else if( rc ){.
eb80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
eb90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
eba0: 20 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75   The request cou
ebb0: 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c  ld not be fulfil
ebc0: 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65  led using a free
ebd0: 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63  list slot.  Chec
ebe0: 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  k.  ** to see if
ebf0: 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e   defragmentation
ec00: 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
ec10: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
ec20: 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70  gap+2+nByte==top
ec30: 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b   );.  if( gap+2+
ec40: 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20  nByte>top ){.   
ec50: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ec60: 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55  nCell>0 || CORRU
ec70: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20  PT_DB );.    rc 
ec80: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
ec90: 28 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c 20 70  (pPage, MIN(4, p
eca0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 32  Page->nFree - (2
ecb0: 2b 6e 42 79 74 65 29 29 29 3b 0a 20 20 20 20 69  +nByte)));.    i
ecc0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
ecd0: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
ece0: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
ecf0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
ed00: 61 73 73 65 72 74 28 20 67 61 70 2b 32 2b 6e 42  assert( gap+2+nB
ed10: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
ed20: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
ed30: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
ed40: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
ed50: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
ed60: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
ed70: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
ed80: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
ed90: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
eda0: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
edb0: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
edc0: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
edd0: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
ede0: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
edf0: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
ee00: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
ee10: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
ee20: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
ee30: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
ee40: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
ee50: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
ee60: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
ee70: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
ee80: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
ee90: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
eea0: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
eeb0: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74  op+nByte <= (int
eec0: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
eed0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49  bleSize );.  *pI
eee0: 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75  dx = top;.  retu
eef0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ef00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
ef10: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  section of the p
ef20: 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74  Page->aData to t
ef30: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20  he freelist..** 
ef40: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
ef50: 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62  f the new free b
ef60: 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61  lock is pPage->a
ef70: 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20  Data[iStart].** 
ef80: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
ef90: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69  the block is iSi
efa0: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
efb0: 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f  Adjacent freeblo
efc0: 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65  cks are coalesce
efd0: 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  d..**.** Note th
efe0: 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  at even though t
eff0: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
f000: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
f010: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
f020: 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e  ,.** that routin
f030: 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63  e will not detec
f040: 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  t overlap betwee
f050: 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  n cells or freeb
f060: 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64  locks.  Nor.** d
f070: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65  oes it detect ce
f080: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
f090: 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20  s that encrouch 
f0a0: 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65  into the reserve
f0b0: 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68  d bytes.** at th
f0c0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
f0d0: 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69  e.  So do additi
f0e0: 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  onal corruption 
f0f0: 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68  checks inside th
f100: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e  is.** routine an
f110: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
f120: 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70  CORRUPT if any p
f130: 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
f140: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
f150: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
f160: 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69  ge *pPage, u16 i
f170: 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65  Start, u16 iSize
f180: 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20  ){.  u16 iPtr;  
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
f1b0: 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20  dress of ptr to 
f1c0: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
f1d0: 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b  /.  u16 iFreeBlk
f1e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f1f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
f200: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
f210: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
f220: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f240: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65        /* Page he
f250: 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72  ader size.  0 or
f260: 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72   100 */.  u8 nFr
f270: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
f280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f290: 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20  /* Reduction in 
f2a0: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  fragmentation */
f2b0: 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65  .  u16 iOrigSize
f2c0: 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   = iSize;       
f2d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
f2e0: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53  inal value of iS
f2f0: 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61  ize */.  u32 iLa
f300: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
f310: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f  >usableSize-4; /
f320: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
f330: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
f340: 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e  set */.  u32 iEn
f350: 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69  d = iStart + iSi
f360: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
f370: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
f380: 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66  t the iStart buf
f390: 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  fer */.  unsigne
f3a0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
f3b0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f  Page->aData;   /
f3c0: 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a  * Page content *
f3d0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
f3e0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
f3f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
f400: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
f410: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
f420: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
f430: 52 55 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72  RUPT_DB || iStar
f440: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
f450: 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69  set+6+pPage->chi
f460: 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61  ldPtrSize );.  a
f470: 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
f480: 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61  B || iEnd <= pPa
f490: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
f4a0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
f4b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f4c0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
f4d0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
f4e0: 72 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20  rt( iSize>=4 ); 
f4f0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
f500: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
f510: 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
f520: 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20  =iLast );..  /* 
f530: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
f540: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
f550: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
f560: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
f570: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65    ** option is e
f580: 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20  nabled */.  if( 
f590: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46  pPage->pBt->btsF
f5a0: 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
f5b0: 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
f5c0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74  memset(&data[iSt
f5d0: 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b  art], 0, iSize);
f5e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
f5f0: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
f600: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
f610: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46  ending order.  F
f620: 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70  ind the .  ** sp
f630: 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77  ot on the list w
f640: 68 65 72 65 20 69 53 74 61 72 74 20 73 68 6f 75  here iStart shou
f650: 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  ld be inserted..
f660: 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61    */.  hdr = pPa
f670: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
f680: 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b   iPtr = hdr + 1;
f690: 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50 74 72  .  if( data[iPtr
f6a0: 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69  +1]==0 && data[i
f6b0: 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Ptr]==0 ){.    i
f6c0: 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a  FreeBlk = 0;  /*
f6d0: 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68   Shortcut for th
f6e0: 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 20  e case when the 
f6f0: 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
f700: 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  y */.  }else{.  
f710: 20 20 77 68 69 6c 65 28 20 28 69 46 72 65 65 42    while( (iFreeB
f720: 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
f730: 61 74 61 5b 69 50 74 72 5d 29 29 3c 69 53 74 61  ata[iPtr]))<iSta
f740: 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rt ){.      if( 
f750: 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20  iFreeBlk<iPtr+4 
f760: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
f770: 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20 62 72 65  FreeBlk==0 ) bre
f780: 61 6b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ak;.        retu
f790: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f7a0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
f7b0: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
f7c0: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
f7d0: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c   if( iFreeBlk>iL
f7e0: 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ast ) return SQL
f7f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
f800: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  ;.    assert( iF
f810: 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69  reeBlk>iPtr || i
f820: 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20  FreeBlk==0 );.  
f830: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
f840: 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20  point:.    **   
f850: 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72   iFreeBlk:   Fir
f860: 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74  st freeblock aft
f870: 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65  er iStart, or ze
f880: 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a  ro if none.    *
f890: 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20  *    iPtr:      
f8a0: 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
f8b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72  a pointer to iFr
f8c0: 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20  eeBlk.    **.   
f8d0: 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   ** Check to see
f8e0: 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f   if iFreeBlk sho
f8f0: 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64  uld be coalesced
f900: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
f910: 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a   iStart..    */.
f920: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
f930: 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65   && iEnd+3>=iFre
f940: 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46  eBlk ){.      nF
f950: 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d  rag = iFreeBlk -
f960: 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28   iEnd;.      if(
f970: 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29   iEnd>iFreeBlk )
f980: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
f990: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
f9a0: 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42     iEnd = iFreeB
f9b0: 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  lk + get2byte(&d
f9c0: 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29  ata[iFreeBlk+2])
f9d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
f9e0: 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
f9f0: 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74 75  sableSize ) retu
fa00: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
fa10: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 53  T_BKPT;.      iS
fa20: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74  ize = iEnd - iSt
fa30: 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65  art;.      iFree
fa40: 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
fa50: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b  data[iFreeBlk]);
fa60: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
fa70: 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74   If iPtr is anot
fa80: 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74  her freeblock (t
fa90: 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20  hat is, if iPtr 
faa0: 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c  is not the freel
fab0: 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ist.    ** point
fac0: 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68  er in the page h
fad0: 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63  eader) then chec
fae0: 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61  k to see if iSta
faf0: 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20  rt should be.   
fb00: 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   ** coalesced on
fb10: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50  to the end of iP
fb20: 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  tr..    */.    i
fb30: 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b  f( iPtr>hdr+1 ){
fb40: 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45  .      int iPtrE
fb50: 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32  nd = iPtr + get2
fb60: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b  byte(&data[iPtr+
fb70: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
fb80: 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74  PtrEnd+3>=iStart
fb90: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
fba0: 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29  iPtrEnd>iStart )
fbb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
fbc0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
fbd0: 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53       nFrag += iS
fbe0: 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a  tart - iPtrEnd;.
fbf0: 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20          iSize = 
fc00: 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20  iEnd - iPtr;.   
fc10: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50       iStart = iP
fc20: 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  tr;.      }.    
fc30: 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e  }.    if( nFrag>
fc40: 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65  data[hdr+7] ) re
fc50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
fc60: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61  UPT_BKPT;.    da
fc70: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72  ta[hdr+7] -= nFr
fc80: 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53  ag;.  }.  if( iS
fc90: 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26  tart==get2byte(&
fca0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a  data[hdr+5]) ){.
fcb0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66      /* The new f
fcc0: 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74  reeblock is at t
fcd0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
fce0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
fcf0: 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f   area,.    ** so
fd00: 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65   just extend the
fd10: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
fd20: 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63  ea rather than c
fd30: 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20  reate another.  
fd40: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e    ** freelist en
fd50: 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  try */.    if( i
fd60: 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74  Ptr!=hdr+1 ) ret
fd70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fd80: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74  PT_BKPT;.    put
fd90: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
fda0: 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  1], iFreeBlk);. 
fdb0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
fdc0: 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b  a[hdr+5], iEnd);
fdd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
fde0: 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
fdf0: 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74  freeblock into t
fe00: 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
fe10: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
fe20: 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29  a[iPtr], iStart)
fe30: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
fe40: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46  data[iStart], iF
fe50: 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74  reeBlk);.    put
fe60: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
fe70: 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20  rt+2], iSize);. 
fe80: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
fe90: 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a  e += iOrigSize;.
fea0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
feb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
fec0: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
fed0: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
fee0: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
fef0: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
ff00: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
ff10: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
ff20: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
ff30: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
ff40: 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
ff50: 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
ff60: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
ff70: 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
ff80: 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
ff90: 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
ffa0: 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
ffb0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
ffc0: 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
ffd0: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
ffe0: 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
fff0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
10000 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
10010 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
10020 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
10030 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
10040 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
10050 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
10060 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
10070 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
10080 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
10090 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
100a0 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
100b0 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
100c0 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
100d0 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
100e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
100f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10100 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
10110 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
10120 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
10130 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
10140 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
10150 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
10160 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
10170 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
10180 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
10190 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d  ->leaf;.  pPage-
101a0 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c  >xCellSize = cel
101b0 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20  lSizePtr;.  pBt 
101c0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
101d0 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
101e0 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
101f0 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
10200 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
10210 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38 20 41   R-07291-35328 A
10220 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30 78 30   value of 5 (0x0
10230 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  5) means the pag
10240 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69  e is an.    ** i
10250 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20 62 2d  nterior table b-
10260 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
10270 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
10280 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
10290 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a  EY)==5 );.    /*
102a0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
102b0 32 36 39 30 30 2d 30 39 31 37 36 20 41 20 76 61  26900-09176 A va
102c0 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30 64 29  lue of 13 (0x0d)
102d0 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
102e0 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66  is a.    ** leaf
102f0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61   table b-tree pa
10300 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
10310 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41  t( (PTF_LEAFDATA
10320 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  |PTF_INTKEY|PTF_
10330 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20  LEAF)==13 );.   
10340 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
10350 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
10360 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
10370 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
10380 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  af = 1;.      pP
10390 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
103a0 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
103b0 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Ptr;.    }else{.
103c0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
103d0 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
103e0 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53     pPage->xCellS
103f0 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
10400 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  rNoPayload;.    
10410 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
10420 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
10430 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
10440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
10450 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
10460 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
10470 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
10480 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
10490 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
104a0 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41  Byte==PTF_ZERODA
104b0 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  TA ){.    /* EVI
104c0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31  DENCE-OF: R-4331
104d0 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75 65 20  6-37308 A value 
104e0 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65 61 6e  of 2 (0x02) mean
104f0 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e  s the page is an
10500 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72  .    ** interior
10510 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61   index b-tree pa
10520 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
10530 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41  t( (PTF_ZERODATA
10540 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==2 );.    /* E
10550 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
10560 36 31 35 2d 34 32 38 32 38 20 41 20 76 61 6c 75  615-42828 A valu
10570 65 20 6f 66 20 31 30 20 28 30 78 30 61 29 20 6d  e of 10 (0x0a) m
10580 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
10590 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 69   a.    ** leaf i
105a0 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
105b0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
105c0 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50   (PTF_ZERODATA|P
105d0 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a  TF_LEAF)==10 );.
105e0 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
105f0 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
10600 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
10610 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
10620 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
10630 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
10640 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
10650 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
10660 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
10670 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
10680 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
10690 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
106a0 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
106b0 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
106c0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
106d0 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
106e0 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
106f0 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
10700 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
10710 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
10720 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
10730 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
10740 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
10750 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10760 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
10770 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
10780 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
10790 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
107a0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
107b0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
107c0 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
107d0 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
107e0 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
107f0 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
10800 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
10810 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
10820 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
10830 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
10840 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
10850 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
10860 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
10870 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
10880 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
10890 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
108a0 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
108b0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
108c0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
108d0 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
108e0 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
108f0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
10900 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10910 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d  pPage->pBt->db!=
10920 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
10930 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
10940 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
10950 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
10960 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
10970 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
10980 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
10990 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
109a0 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
109b0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
109c0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
109d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
109e0 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
109f0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
10a00 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
10a10 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  ) );..  if( !pPa
10a20 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
10a30 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
10a40 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
10a50 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
10a60 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
10a70 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68  ta[] */.    u8 h
10a80 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
10a90 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
10aa0 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
10ab0 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ader */.    u8 *
10ac0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
10ad0 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
10ae0 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42  ->aData */.    B
10af0 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
10b00 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
10b10 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
10b20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62   */.    int usab
10b30 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
10b40 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
10b50 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
10b60 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c  e */.    u16 cel
10b70 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f  lOffset;    /* O
10b80 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74  ffset from start
10b90 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73   of page to firs
10ba0 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
10bb0 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b  /.    int nFree;
10bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10bd0 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
10be0 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
10bf0 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20  /.    int top;  
10c00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
10c10 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
10c20 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
10c30 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
10c40 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
10c50 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
10c60 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
10c70 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ffset */.    int
10c80 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
10c90 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
10ca0 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
10cb0 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
10cc0 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
10cd0 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
10ce0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
10cf0 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
10d00 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a  e->aData;.    /*
10d10 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
10d20 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20  28594-02890 The 
10d30 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74  one-byte flag at
10d40 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61   offset 0 indica
10d50 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ting.    ** the 
10d60 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
10d70 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 63  . */.    if( dec
10d80 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
10d90 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
10da0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10db0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
10dc0 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
10dd0 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
10de0 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
10df0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
10e00 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
10e10 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
10e20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  );.    pPage->nO
10e30 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
10e40 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
10e50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
10e60 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66     pPage->cellOf
10e70 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
10e80 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50  t = hdr + 8 + pP
10e90 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
10ea0 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  e;.    pPage->aD
10eb0 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75  ataEnd = &data[u
10ec0 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20  sableSize];.    
10ed0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
10ee0 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
10ef0 65 74 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  et];.    pPage->
10f00 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
10f10 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
10f20 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20 45  rSize];.    /* E
10f30 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38  VIDENCE-OF: R-58
10f40 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74 77  015-48175 The tw
10f50 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
10f60 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69 67  t offset 5 desig
10f70 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  nates.    ** the
10f80 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
10f90 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
10fa0 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f   A zero value fo
10fb0 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69  r this integer i
10fc0 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72  s.    ** interpr
10fd0 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a  eted as 65536. *
10fe0 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  /.    top = get2
10ff0 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
11000 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f  a[hdr+5]);.    /
11010 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
11020 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68 65  -37002-32774 The
11030 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
11040 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67 69  r at offset 3 gi
11050 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  ves the.    ** n
11060 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
11070 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
11080 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
11090 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
110a0 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
110b0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
110c0 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
110d0 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
110e0 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
110f0 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
11100 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
11110 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
11120 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
11130 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
11140 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
11150 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
11160 4c 28 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a  L(pBt) );.    /*
11170 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11180 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61  24089-57979 If a
11190 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
111a0 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69  o cells (which i
111b0 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f  s only.    ** po
111c0 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f  ssible for a roo
111d0 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t page of a tabl
111e0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
111f0 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68  no rows) then th
11200 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20  e.    ** offset 
11210 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
11220 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71  ent area will eq
11230 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a  ual the page siz
11240 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20  e minus the.    
11250 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65  ** bytes of rese
11260 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20  rved space. */. 
11270 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
11280 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70  ->nCell>0 || top
11290 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  ==usableSize || 
112a0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20  CORRUPT_DB );.. 
112b0 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65     /* A malforme
112c0 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  d database page 
112d0 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74  might cause us t
112e0 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
112f0 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61  end.    ** of pa
11300 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ge when parsing 
11310 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a  a cell.  .    **
11320 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
11330 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
11340 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
11350 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
11360 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a  l extends.    **
11370 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
11380 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79   a page boundary
11390 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49   and causes SQLI
113a0 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65  TE_CORRUPT to be
113b0 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65   .    ** returne
113c0 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  d if it does..  
113d0 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69    */.    iCellFi
113e0 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
113f0 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
11400 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74  l;.    iCellLast
11410 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
11420 34 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  4;.    if( pBt->
11430 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
11440 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b  TE_CellSizeCk ){
11450 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
11460 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
11470 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20  x into the cell 
11480 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
11490 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20  .      int sz;  
114a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
114b0 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20   of a cell */.. 
114c0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
114d0 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73  >leaf ) iCellLas
114e0 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t--;.      for(i
114f0 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
11500 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
11510 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41    pc = get2byteA
11520 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c  ligned(&data[cel
11530 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20  lOffset+i*2]);. 
11540 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
11550 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
11560 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
11570 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
11580 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
11590 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
115a0 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
115b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
115c0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
115d0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
115e0 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20   }.        sz = 
115f0 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
11600 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
11610 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
11620 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
11630 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
11640 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
11650 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
11660 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11670 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
11680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11690 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
116a0 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
116b0 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20  lLast++;.    }  
116c0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
116d0 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
116e0 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
116f0 65 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  e.    ** EVIDENC
11700 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
11710 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
11720 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
11730 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
11740 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74     ** start of t
11750 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
11760 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
11770 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
11780 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a  ere are no.    *
11790 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f  * freeblocks. */
117a0 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
117b0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
117c0 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
117d0 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
117e0 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20    /* Init nFree 
117f0 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b  to non-freeblock
11800 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20   free space */. 
11810 20 20 20 69 66 28 20 70 63 3e 30 20 29 7b 0a 20     if( pc>0 ){. 
11820 20 20 20 20 20 75 33 32 20 6e 65 78 74 2c 20 73       u32 next, s
11830 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
11840 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a  c<iCellFirst ){.
11850 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
11860 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d  NCE-OF: R-55530-
11870 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d  52930 In a well-
11880 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
11890 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20  ge, there will. 
118a0 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
118b0 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
118c0 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65   cell before the
118d0 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
118e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
118f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11900 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
11910 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
11920 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
11930 20 20 20 20 69 66 28 20 70 63 3e 69 43 65 6c 6c      if( pc>iCell
11940 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
11950 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11960 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 2f 2a  CORRUPT_BKPT; /*
11970 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74   Freeblock off t
11980 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
11990 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ge */.        }.
119a0 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67          next = g
119b0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
119c0 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 69 7a 65  ]);.        size
119d0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
119e0 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
119f0 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
11a00 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  + size;.        
11a10 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a  if( next<=pc+siz
11a20 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e+3 ) break;.   
11a30 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a       pc = next;.
11a40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11a50 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20  ( next>0 ){.    
11a60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11a70 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
11a80 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e 6f   /* Freeblock no
11a90 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
11aa0 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  rder */.      }.
11ab0 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 69 7a        if( pc+siz
11ac0 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  e>(unsigned int)
11ad0 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
11ae0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
11af0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
11b00 3b 20 20 2f 2a 20 4c 61 73 74 20 66 72 65 65 62  ;  /* Last freeb
11b10 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70 61 73  lock extends pas
11b20 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20  t page end */.  
11b30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
11b40 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
11b50 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e  t, nFree contain
11b60 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
11b70 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
11b80 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  tart.    ** of t
11b90 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
11ba0 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75  area plus the nu
11bb0 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74  mber of free byt
11bc0 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  es within.    **
11bd0 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
11be0 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
11bf0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
11c00 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
11c10 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
11c20 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ge, then the pag
11c30 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
11c40 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20  ted. This check 
11c50 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76  also.    ** serv
11c60 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  es to verify tha
11c70 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  t the offset to 
11c80 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
11c90 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20   cell-content.  
11ca0 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72    ** area, accor
11cb0 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
11cc0 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69   header, lies wi
11cd0 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  thin the page.. 
11ce0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46     */.    if( nF
11cf0 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ree>usableSize )
11d00 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
11d10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
11d20 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70  PT; .    }.    p
11d30 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
11d40 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c  16)(nFree - iCel
11d50 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61  lFirst);.    pPa
11d60 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
11d70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
11d80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11d90 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
11da0 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
11db0 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
11dc0 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
11dd0 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
11de0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
11df0 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
11e00 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
11e10 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
11e20 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
11e30 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
11e40 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
11e50 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
11e60 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
11e70 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
11e80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
11e90 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
11ea0 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
11eb0 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
11ec0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
11ed0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
11ee0 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
11ef0 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
11f00 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
11f10 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
11f20 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
11f30 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
11f40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11f50 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
11f60 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
11f70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
11f80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11f90 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
11fa0 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
11fb0 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
11fc0 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d  _DELETE ){.    m
11fd0 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
11fe0 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
11ff0 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d  Size - hdr);.  }
12000 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28  .  data[hdr] = (
12010 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69  char)flags;.  fi
12020 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c  rst = hdr + ((fl
12030 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
12040 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65   ? 12 : 8);.  me
12050 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
12060 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61  ], 0, 4);.  data
12070 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70  [hdr+7] = 0;.  p
12080 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
12090 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  r+5], pBt->usabl
120a0 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  eSize);.  pPage-
120b0 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70  >nFree = (u16)(p
120c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
120d0 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64   first);.  decod
120e0 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c  eFlags(pPage, fl
120f0 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63  ags);.  pPage->c
12100 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73  ellOffset = firs
12110 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  t;.  pPage->aDat
12120 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74  aEnd = &data[pBt
12130 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  ->usableSize];. 
12140 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
12150 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b   = &data[first];
12160 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f  .  pPage->aDataO
12170 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67  fst = &data[pPag
12180 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  e->childPtrSize]
12190 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
121a0 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65  flow = 0;.  asse
121b0 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
121c0 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
121d0 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
121e0 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ;.  pPage->maskP
121f0 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
12200 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
12210 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
12220 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
12230 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
12240 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
12250 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
12260 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
12270 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
12280 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
12290 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
122a0 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
122b0 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
122c0 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
122d0 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
122e0 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
122f0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
12300 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
12310 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
12320 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  age);.  if( pgno
12330 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b  !=pPage->pgno ){
12340 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74  .    pPage->aDat
12350 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
12360 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
12370 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62  ;.    pPage->pDb
12380 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a  Page = pDbPage;.
12390 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d      pPage->pBt =
123a0 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d   pBt;.    pPage-
123b0 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
123c0 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
123d0 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31  et = pgno==1 ? 1
123e0 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73  00 : 0;.  }.  as
123f0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
12400 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ta==sqlite3Pager
12410 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
12420 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
12430 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge; .}../*.** Ge
12440 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
12450 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
12460 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
12470 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
12480 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
12490 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53  ts if needed.  S
124a0 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65  ee also: btreeGe
124b0 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a  tUnusedPage()..*
124c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45  *.** If the PAGE
124d0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
124e0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20  flag is set, it 
124f0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
12500 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f   not care.** abo
12510 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ut the content o
12520 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
12530 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20  is time.  So do 
12540 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69  not go to the di
12550 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74  sk.** to fetch t
12560 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73  he content.  Jus
12570 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f  t fill in the co
12580 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
12590 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20   for now..** If 
125a0 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65  in the future we
125b0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
125c0 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69  erWrite() on thi
125d0 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20  s page, that.** 
125e0 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74  means we have st
125f0 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63  arted to be conc
12600 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74  erned about cont
12610 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b  ent and the disk
12620 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20  .** read should 
12630 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f  occur at that po
12640 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
12650 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28  nt btreeGetPage(
12660 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12670 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
12680 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
12690 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
126a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
126b0 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
126c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
126d0 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
126e0 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
126f0 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
12700 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
12710 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
12720 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
12730 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
12740 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
12750 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
12760 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
12770 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
12780 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e  ags==PAGER_GET_N
12790 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67  OCONTENT || flag
127a0 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41  s==PAGER_GET_REA
127b0 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72  DONLY );.  asser
127c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
127d0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
127e0 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
127f0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
12800 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
12810 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
12820 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
12830 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
12840 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
12850 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
12860 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
12870 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pBt);.  return S
12880 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12890 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61  ** Retrieve a pa
128a0 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
128b0 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
128c0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
128d0 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79  s not.** already
128e0 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
128f0 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  che return NULL.
12900 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
12910 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
12920 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
12930 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
12940 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  ded..*/.static M
12950 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
12960 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64  eLookup(BtShared
12970 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
12980 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
12990 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
129a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
129b0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
129c0 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  ;.  pDbPage = sq
129d0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
129e0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
129f0 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
12a00 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
12a10 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
12a20 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
12a30 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20  no, pBt);.  }.  
12a40 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
12a50 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
12a60 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
12a70 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  se file in pages
12a80 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
12a90 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72  y kind of.** err
12aa0 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73  or, return ((uns
12ab0 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a  igned int)-1)..*
12ac0 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74  /.static Pgno bt
12ad0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53  reePagecount(BtS
12ae0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72  hared *pBt){.  r
12af0 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65  eturn pBt->nPage
12b00 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42  ;.}.u32 sqlite3B
12b10 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72  treeLastPage(Btr
12b20 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
12b30 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
12b40 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
12b50 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42   assert( ((p->pB
12b60 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30  t->nPage)&0x8000
12b70 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  000)==0 );.  ret
12b80 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75  urn btreePagecou
12b90 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f  nt(p->pBt);.}../
12ba0 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
12bb0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
12bc0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
12bd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21  ..**.** If pCur!
12be0 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  =0 then the page
12bf0 20 69 73 20 62 65 69 6e 67 20 66 65 74 63 68 65   is being fetche
12c00 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d  d as part of a m
12c10 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20  oveToChild().** 
12c20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69  call.  Do additi
12c30 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63  onal sanity chec
12c40 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
12c50 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
12c60 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74  * And if the fet
12c70 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72  ch fails, this r
12c80 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72  outine must decr
12c90 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67  ement pCur->iPag
12ca0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e..**.** The pag
12cb0 65 20 69 73 20 66 65 74 63 68 65 64 20 61 73 20  e is fetched as 
12cc0 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73  read-write unles
12cd0 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55  s pCur is not NU
12ce0 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72  LL and is.** a r
12cf0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e  ead-only cursor.
12d00 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
12d10 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
12d20 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64 65 66  *ppPage is undef
12d30 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
12d40 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
12d50 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
12d60 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
12d70 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
12d80 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
12d90 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
12da0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
12db0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
12dc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
12dd0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
12de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12df0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
12e00 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
12e10 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
12e20 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
12e30 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
12e40 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
12e50 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  re */.  BtCursor
12e60 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
12e70 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
12e80 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65  r to receive the
12e90 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a   page, or NULL *
12ea0 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c  /.  int bReadOnl
12eb0 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
12ec0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
12ed0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65  a read-only page
12ee0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
12ef0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
12f00 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
12f10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12f20 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
12f30 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
12f40 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43  0 || ppPage==&pC
12f50 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
12f60 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
12f70 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
12f80 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d  bReadOnly==pCur-
12f90 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 29  >curPagerFlags )
12fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
12fb0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61  ==0 || pCur->iPa
12fc0 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  ge>0 );..  if( p
12fd0 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
12fe0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  nt(pBt) ){.    r
12ff0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
13000 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
13010 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
13020 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63  _error;.  }.  rc
13030 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
13040 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
13050 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
13060 26 70 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f  &pDbPage, bReadO
13070 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29  nly);.  if( rc )
13080 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  {.    goto getAn
13090 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
130a0 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
130b0 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74   (MemPage*)sqlit
130c0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
130d0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
130e0 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
130f0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65  t==0 ){.    btre
13100 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
13110 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
13120 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  Bt);.    rc = bt
13130 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50  reeInitPage(*ppP
13140 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
13150 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13160 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
13170 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
13180 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
13190 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  Page_error;.    
131a0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
131b0 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d  (*ppPage)->pgno=
131c0 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
131d0 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44  t( (*ppPage)->aD
131e0 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  ata==sqlite3Page
131f0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
13200 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62  ) );..  /* If ob
13210 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20  taining a child 
13220 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f  page for a curso
13230 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69 66  r, we must verif
13240 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  y that the page 
13250 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62  is.  ** compatib
13260 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74  le with the root
13270 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20   page. */.  if( 
13280 70 43 75 72 20 26 26 20 28 28 2a 70 70 50 61 67  pCur && ((*ppPag
13290 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28  e)->nCell<1 || (
132a0 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79  *ppPage)->intKey
132b0 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  !=pCur->curIntKe
132c0 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  y) ){.    rc = S
132d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
132e0 50 54 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  PT;.    releaseP
132f0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
13300 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
13310 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
13320 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13330 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74  _OK;..getAndInit
13340 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66  Page_error:.  if
13350 28 20 70 43 75 72 20 29 20 70 43 75 72 2d 3e 69  ( pCur ) pCur->i
13360 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61  Page--;.  testca
13370 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20  se( pgno==0 );. 
13380 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
13390 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43   || rc==SQLITE_C
133a0 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75  ORRUPT );.  retu
133b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
133c0 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67  Release a MemPag
133d0 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  e.  This should 
133e0 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
133f0 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a  or each prior.**
13400 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65   call to btreeGe
13410 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
13420 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
13430 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65  eNotNull(MemPage
13440 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65   *pPage){.  asse
13450 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
13460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
13470 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
13480 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
13490 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
134a0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
134b0 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
134c0 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
134d0 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
134e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
134f0 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
13500 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
13510 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
13520 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13530 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
13540 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
13550 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
13560 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d  efNotNull(pPage-
13570 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61  >pDbPage);.}.sta
13580 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
13590 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
135a0 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
135b0 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e  e ) releasePageN
135c0 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d  otNull(pPage);.}
135d0 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75  ../*.** Get an u
135e0 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nused page..**.*
135f0 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
13600 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65 74 50  t like btreeGetP
13610 61 67 65 28 29 20 77 69 74 68 20 74 68 65 20 61  age() with the a
13620 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20  ddition:.**.**  
13630 20 2a 20 20 49 66 20 74 68 65 20 70 61 67 65 20   *  If the page 
13640 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73  is already in us
13650 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
13660 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69   purpose, immedi
13670 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65  ately.**      re
13680 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72 65 74  lease it and ret
13690 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 55  urn an SQLITE_CU
136a0 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20  RRUPT error..** 
136b0 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65 20 74    *  Make sure t
136c0 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67 20 69  he isInit flag i
136d0 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69  s clear.*/.stati
136e0 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 55 6e  c int btreeGetUn
136f0 75 73 65 64 50 61 67 65 28 0a 20 20 42 74 53 68  usedPage(.  BtSh
13700 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
13710 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
13720 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
13730 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13740 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
13750 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
13760 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
13770 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
13780 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
13790 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
137a0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
137b0 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
137c0 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
137d0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
137e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 62 74  ){.  int rc = bt
137f0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
13800 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
13810 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ags);.  if( rc==
13820 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13830 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
13840 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
13850 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
13860 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  )>1 ){.      rel
13870 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
13880 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  );.      *ppPage
13890 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
138a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
138b0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
138c0 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49    (*ppPage)->isI
138d0 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nit = 0;.  }else
138e0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
138f0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
13900 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75  rc;.}.../*.** Du
13910 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
13920 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
13930 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74  reloads informat
13940 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63  ion into the cac
13950 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  he.** so that th
13960 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  e cache is resto
13970 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
13980 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65  nal state at the
13990 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
139a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f   transaction, fo
139b0 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74  r each page rest
139c0 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  ored this routin
139d0 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
139e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
139f0 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74  needs to reset t
13a00 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65  he extra data se
13a10 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64  ction at the end
13a20 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
13a30 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
13a40 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e  e restored data.
13a50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13a60 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67  pageReinit(DbPag
13a70 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d  e *pData){.  Mem
13a80 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70  Page *pPage;.  p
13a90 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
13aa0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
13ab0 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
13ac0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13ad0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
13ae0 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20  t(pData)>0 );.  
13af0 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
13b00 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
13b10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13b20 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
13b30 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
13b40 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
13b50 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13b60 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
13b70 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20  t(pData)>1 ){.  
13b80 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67      /* pPage mig
13b90 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65  ht not be a btre
13ba0 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68  e page;  it migh
13bb0 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  t be an overflow
13bc0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f   page.      ** o
13bd0 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72  r ptrmap page or
13be0 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49   a free page.  I
13bf0 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74  n those cases, t
13c00 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
13c10 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74     ** call to bt
13c20 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69  reeInitPage() wi
13c30 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e  ll likely return
13c40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
13c50 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f  .      ** But no
13c60 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79   harm is done by
13c70 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69   this.  And it i
13c80 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74  s very important
13c90 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62   that.      ** b
13ca0 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62  treeInitPage() b
13cb0 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72  e called on ever
13cc0 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20  y btree page so 
13cd0 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a  we make.      **
13ce0 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76   the call for ev
13cf0 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f  ery page that co
13d00 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e  mes in for re-in
13d10 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  iting. */.      
13d20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
13d30 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
13d40 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
13d50 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
13d60 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
13d70 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
13d80 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
13d90 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  er(void *pArg){.
13da0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
13db0 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
13dc0 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
13dd0 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
13de0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13df0 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
13e00 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
13e10 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
13e20 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
13e30 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29  db->busyHandler)
13e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
13e50 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
13e60 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .** .** zFilenam
13e70 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
13e80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13e90 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d  le.  If zFilenam
13ea0 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65  e is NULL.** the
13eb0 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64  n an ephemeral d
13ec0 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
13ed0 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72  ed.  The ephemer
13ee0 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68  al database migh
13ef0 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76  t.** be exclusiv
13f00 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f  ely in memory, o
13f10 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61  r it might use a
13f20 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f   disk-based memo
13f30 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74  ry cache..** Eit
13f40 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68  her way, the eph
13f50 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
13f60 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
13f70 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a  cally deleted .*
13f80 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74  * when sqlite3Bt
13f90 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61  reeClose() is ca
13fa0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  lled..**.** If z
13fb0 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
13fc0 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69  mory:" then an i
13fd0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
13fe0 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
13ff0 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
14000 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20  cally destroyed 
14010 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
14020 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c  d..**.** The "fl
14030 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69  ags" parameter i
14040 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74  s a bitmask that
14050 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62   might contain b
14060 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45  its like.** BTRE
14070 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61  E_OMIT_JOURNAL a
14080 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f  nd/or BTREE_MEMO
14090 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  RY..**.** If the
140a0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
140b0 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74  eady opened in t
140c0 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
140d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
140e0 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61  nd we are in sha
140f0 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20  red cache mode, 
14100 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69  then the open wi
14110 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a  ll fail with an.
14120 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  ** SQLITE_CONSTR
14130 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20  AINT error.  We 
14140 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f  cannot allow two
14150 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65   or more BtShare
14160 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20  d.** objects in 
14170 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
14180 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e  e connection sin
14190 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c  ce doing so will
141a0 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62   lead.** to prob
141b0 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e  lems with lockin
141c0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
141d0 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71  3BtreeOpen(.  sq
141e0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
141f0 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
14200 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74  use for this b-t
14210 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ree */.  const c
14220 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
14230 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
14240 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
14250 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61  the BTree databa
14260 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  se */.  sqlite3 
14270 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
14280 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61  /* Associated da
14290 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
142a0 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72  .  Btree **ppBtr
142b0 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ee,        /* Po
142c0 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72  inter to new Btr
142d0 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65  ee object writte
142e0 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
142f0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
14300 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a      /* Options *
14310 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
14320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14330 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
14340 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
14350 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
14360 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14370 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
14380 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
14390 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
143a0 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
143b0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
143c0 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
143d0 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
143e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
143f0 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20  mutexOpen = 0;  
14400 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61  /* Prevents a ra
14410 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69  ce condition. Ti
14420 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20  cket #3537 */.  
14430 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14440 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
14450 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
14460 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
14470 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76   */.  u8 nReserv
14480 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
14490 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20       /* Byte of 
144a0 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20  unused space on 
144b0 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  each page */.  u
144c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62  nsigned char zDb
144d0 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a  Header[100];  /*
144e0 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72   Database header
144f0 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f   content */..  /
14500 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e  * True if openin
14510 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20  g an ephemeral, 
14520 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
14530 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  se */.  const in
14540 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69  t isTempDb = zFi
14550 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69  lename==0 || zFi
14560 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20  lename[0]==0;.. 
14570 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
14580 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
14590 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
145a0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
145b0 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
145c0 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
145d0 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23  database..  */.#
145e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
145f0 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e  T_MEMORYDB.  con
14600 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
14610 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73   0;.#else.  cons
14620 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
14630 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74  (zFilename && st
14640 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
14650 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a  ":memory:")==0).
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d         || (isTem
14680 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54 65  pDb && sqlite3Te
14690 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a  mpInMemory(db)).
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146b0 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c         || (vfsFl
146c0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
146d0 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65  N_MEMORY)!=0;.#e
146e0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
146f0 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
14700 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20  t( pVfs!=0 );.  
14710 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14720 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
14730 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
14740 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d  t( (flags&0xff)=
14750 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66  =flags );   /* f
14760 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62 69  lags fit in 8 bi
14770 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79  ts */..  /* Only
14780 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   a BTREE_SINGLE 
14790 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
147a0 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20  BTREE_UNORDERED 
147b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
147c0 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52  ags & BTREE_UNOR
147d0 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c  DERED)==0 || (fl
147e0 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
147f0 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  LE)!=0 );..  /* 
14800 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64  A BTREE_SINGLE d
14810 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61 79  atabase is alway
14820 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  s a temporary an
14830 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a  d/or ephemeral *
14840 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
14850 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c  gs & BTREE_SINGL
14860 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44  E)==0 || isTempD
14870 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65  b );..  if( isMe
14880 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  mdb ){.    flags
14890 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59   |= BTREE_MEMORY
148a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73  ;.  }.  if( (vfs
148b0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
148c0 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20  PEN_MAIN_DB)!=0 
148d0 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69  && (isMemdb || i
148e0 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20  sTempDb) ){.    
148f0 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46  vfsFlags = (vfsF
14900 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f  lags & ~SQLITE_O
14910 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53  PEN_MAIN_DB) | S
14920 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
14930 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71  DB;.  }.  p = sq
14940 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
14950 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a  sizeof(Btree));.
14960 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
14970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
14980 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
14990 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
149a0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
149b0 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53   = db;.#ifndef S
149c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
149d0 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63  D_CACHE.  p->loc
149e0 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  k.pBtree = p;.  
149f0 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d  p->lock.iTable =
14a00 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   1;.#endif..#if 
14a10 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14a20 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14a30 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
14a40 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
14a50 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
14a60 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
14a70 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
14a80 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
14a90 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
14aa0 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
14ab0 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
14ac0 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
14ad0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d    */.  if( isTem
14ae0 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d  pDb==0 && (isMem
14af0 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61  db==0 || (vfsFla
14b00 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  gs&SQLITE_OPEN_U
14b10 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69  RI)!=0) ){.    i
14b20 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53 51  f( vfsFlags & SQ
14b30 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
14b40 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69  CACHE ){.      i
14b50 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nt nFilename = s
14b60 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
14b70 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20  Filename)+1;.   
14b80 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
14b90 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
14ba0 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
14bb0 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
14bc0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
14bd0 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61  lloc(MAX(nFullPa
14be0 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65  thname,nFilename
14bf0 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f  ));.      MUTEX_
14c00 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
14c10 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
14c20 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73  d; )..      p->s
14c30 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
14c40 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
14c50 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
14c60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
14c70 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
14c80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
14c90 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
14ca0 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
14cb0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
14cc0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  zFullPathname, z
14cd0 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e  Filename, nFilen
14ce0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
14cf0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
14d00 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
14d10 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
14d20 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
14d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d40 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50            nFullP
14d50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
14d60 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
14d70 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
14d80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
14d90 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
14da0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
14db0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
14dc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
14dd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14de0 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54    }.#if SQLITE_T
14df0 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20  HREADSAFE.      
14e00 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69  mutexOpen = sqli
14e10 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
14e20 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
14e30 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73  C_OPEN);.      s
14e40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
14e50 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  er(mutexOpen);. 
14e60 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
14e70 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
14e80 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
14e90 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
14ea0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
14eb0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
14ec0 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66  xShared);.#endif
14ed0 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
14ee0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
14ef0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
14f00 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
14f10 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
14f20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14f30 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
14f40 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
14f50 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
14f60 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
14f70 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
14f80 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20  ger, 0)).       
14f90 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
14fa0 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74  ite3PagerVfs(pBt
14fb0 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20  ->pPager)==pVfs 
14fc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
14fd0 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
14fe0 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d  for(iDb=db->nDb-
14ff0 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d  1; iDb>=0; iDb--
15000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42  ){.            B
15010 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20  tree *pExisting 
15020 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
15030 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  Bt;.            
15040 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26  if( pExisting &&
15050 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d   pExisting->pBt=
15060 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
15070 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
15080 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
15090 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20  hared);.        
150a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
150b0 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
150c0 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pen);.          
150d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
150e0 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
150f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
15100 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
15110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
15120 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
15130 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20  TRAINT;.        
15140 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15150 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
15160 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
15170 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b      pBt->nRef++;
15180 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
15190 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
151a0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
151b0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
151c0 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
151d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
151e0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
151f0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
15200 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73  TE_DEBUG.    els
15210 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64  e{.      /* In d
15220 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61  ebug mode, we ma
15230 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e  rk all persisten
15240 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73  t databases as s
15250 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  harable.      **
15260 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20   even when they 
15270 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65  are not.  This e
15280 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63  xercises the loc
15290 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20  king code and.  
152a0 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72      ** gives mor
152b0 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f  e opportunity fo
152c0 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65  r asserts(sqlite
152d0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a  3_mutex_held()).
152e0 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
152f0 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b  nts to find lock
15300 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  ing problems..  
15310 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e      */.      p->
15320 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
15330 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
15340 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d  endif.  if( pBt=
15350 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
15360 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
15370 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73  g asserts make s
15380 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75  ure that structu
15390 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  res used by the 
153a0 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a  btree are.    **
153b0 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e   the right size.
153c0 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61    This is to gua
153d0 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20  rd against size 
153e0 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73  changes that res
153f0 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ult.    ** when 
15400 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64  compiling on a d
15410 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65  ifferent archite
15420 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
15430 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
15440 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20  (i64)==8 );.    
15450 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
15460 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
15470 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
15480 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
15490 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d  rt( sizeof(u16)=
154a0 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =2 );.    assert
154b0 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
154c0 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20  4 );.  .    pBt 
154d0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
154e0 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  ero( sizeof(*pBt
154f0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  ) );.    if( pBt
15500 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
15510 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
15520 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
15530 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
15540 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
15550 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
15560 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67  pVfs, &pBt->pPag
15570 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  er, zFilename,. 
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15590 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
155a0 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61 67 73 2c  MemPage), flags,
155b0 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
155c0 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
155d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
155e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
155f0 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
15600 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d  pBt->pPager, db-
15610 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20  >szMmap);.      
15620 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
15630 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
15640 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
15650 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
15660 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
15670 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15680 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
15690 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
156a0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
156b0 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28  t->openFlags = (
156c0 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42  u8)flags;.    pB
156d0 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
156e0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
156f0 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
15700 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
15710 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
15720 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
15730 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70   = pBt;.  .    p
15740 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
15750 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
15760 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
15770 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
15780 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
15790 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ) ) pBt->btsFlag
157a0 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
157b0 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  LY;.#ifdef SQLIT
157c0 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
157d0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
157e0 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
157f0 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20  DELETE;.#endif. 
15800 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
15810 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
15820 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
15830 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
15840 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
15850 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
15860 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
15870 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
15880 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
15890 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
158a0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
158b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
158c0 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  /.    pBt->pageS
158d0 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72  ize = (zDbHeader
158e0 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48  [16]<<8) | (zDbH
158f0 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a  eader[17]<<16);.
15900 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67      if( pBt->pag
15910 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
15920 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
15930 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
15940 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42           || ((pB
15950 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70  t->pageSize-1)&p
15960 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30  Bt->pageSize)!=0
15970 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
15980 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66  ageSize = 0;.#if
15990 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
159a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
159b0 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69    /* If the magi
159c0 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
159d0 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e  " will create an
159e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
159f0 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ase, then.      
15a00 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74  ** leave the aut
15a10 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20  oVacuum mode at 
15a20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76  0 (do not auto-v
15a30 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a  acuum), even if.
15a40 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
15a50 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
15a60 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74  UM is true. On t
15a70 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
15a80 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
15a90 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
15aa0 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64  has been defined
15ab0 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a  , then ":memory:
15ac0 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20  " is just a.    
15ad0 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c    ** regular fil
15ae0 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e-name. In this 
15af0 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61  case the auto-va
15b00 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20  cuum applies as 
15b10 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20  per normal..    
15b20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a    */.      if( z
15b30 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d  Filename && !isM
15b40 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
15b50 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
15b60 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
15b70 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31  T_AUTOVACUUM ? 1
15b80 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70   : 0);.        p
15b90 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
15ba0 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
15bb0 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f  _AUTOVACUUM==2 ?
15bc0 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d   1 : 0);.      }
15bd0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52  .#endif.      nR
15be0 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20  eserve = 0;.    
15bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
15c00 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
15c10 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
15c20 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
15c30 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
15c40 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
15c50 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74  d by the one-byt
15c60 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  e unsigned integ
15c70 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f  er found at an o
15c80 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20  ffset of 20.    
15c90 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61    ** into the da
15ca0 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
15cb0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65  er. */.      nRe
15cc0 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65  serve = zDbHeade
15cd0 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74  r[20];.      pBt
15ce0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
15cf0 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
15d00 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
15d10 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
15d20 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
15d30 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
15d40 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
15d50 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
15d60 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
15d70 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
15d80 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
15d90 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
15da0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  dif.    }.    rc
15db0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
15dc0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
15dd0 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
15de0 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
15df0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
15e00 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
15e10 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  out;.    pBt->us
15e20 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
15e30 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
15e40 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
15e50 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
15e60 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
15e70 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
15e80 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
15e90 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
15ea0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
15eb0 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
15ec0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15ed0 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
15ee0 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
15ef0 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
15f00 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
15f10 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
15f20 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ds..    */.    p
15f30 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
15f40 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
15f50 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58  e ){.      MUTEX
15f60 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
15f70 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
15f80 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55 54 45  ed; ).      MUTE
15f90 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
15fa0 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
15fb0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
15fc0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
15fd0 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
15fe0 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
15ff0 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
16000 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
16010 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
16020 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
16030 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
16040 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
16050 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
16060 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
16070 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
16080 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
16090 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
160a0 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
160b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
160c0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
160d0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
160e0 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
160f0 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
16100 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
16110 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
16120 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
16130 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
16140 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
16150 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
16160 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
16170 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
16180 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
16190 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
161a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
161b0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
161c0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
161d0 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
161e0 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
161f0 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
16200 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
16210 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
16220 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
16230 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
16240 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
16250 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
16260 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
16270 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
16280 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
16290 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
162a0 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
162b0 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
162c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
162d0 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
162e0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
162f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
16300 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
16310 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
16320 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
16330 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
16340 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
16350 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
16360 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
16370 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74 3c 28  ( (uptr)p->pBt<(
16380 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74 20 29  uptr)pSib->pBt )
16390 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
163a0 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
163b0 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
163c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
163d0 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
163e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
163f0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
16400 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 28  pSib->pNext && (
16410 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65 78 74  uptr)pSib->pNext
16420 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d 3e 70  ->pBt<(uptr)p->p
16430 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
16440 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
16450 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
16460 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
16470 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
16480 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
16490 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
164a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
164b0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
164c0 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
164d0 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
164e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
164f0 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
16500 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16510 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16520 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
16530 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
16540 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
16550 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
16560 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
16570 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
16580 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
16590 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
165a0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
165b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
165c0 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
165d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
165e0 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
165f0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
16600 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
16610 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  *pFile;..    /* 
16620 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61  If the B-Tree wa
16630 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
16640 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70  pened, set the p
16650 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20  ager-cache size 
16660 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65  to the.    ** de
16670 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63  fault value. Exc
16680 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e  ept, when openin
16690 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67  g on an existing
166a0 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61   shared pager-ca
166b0 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e  che,.    ** do n
166c0 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ot change the pa
166d0 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a  ger-cache size..
166e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
166f0 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
16700 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b  a(p, 0, 0)==0 ){
16710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
16720 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
16730 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
16740 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
16750 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  ACHE_SIZE);.    
16760 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d 20 73  }..    pFile = s
16770 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
16780 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
16790 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
167a0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 73  thods ){.      s
167b0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
167c0 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53  rolHint(pFile, S
167d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42 2c  QLITE_FCNTL_PDB,
167e0 20 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64 62   (void*)&pBt->db
167f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
16800 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
16810 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
16820 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
16830 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
16840 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
16850 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
16860 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
16870 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
16880 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e 6e  sqlite3BtreeConn
16890 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70 42  ectionCount(*ppB
168a0 74 72 65 65 29 3e 30 20 29 3b 0a 20 20 72 65 74  tree)>0 );.  ret
168b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
168c0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
168d0 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
168e0 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
168f0 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
16900 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
16910 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
16920 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
16930 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
16940 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
16950 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
16960 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
16970 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
16980 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
16990 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
169a0 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
169b0 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
169c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
169d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
169e0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
169f0 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
16a00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
16a10 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68  Master; ).  BtSh
16a20 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69  ared *pList;.  i
16a30 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a  nt removed = 0;.
16a40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16a50 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
16a60 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
16a70 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70    MUTEX_LOGIC( p
16a80 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
16a90 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
16aa0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
16ab0 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69  ASTER); ).  sqli
16ac0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
16ad0 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
16ae0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
16af0 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
16b00 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
16b10 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
16b20 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
16b30 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
16b40 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
16b50 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
16b60 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
16b70 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
16b80 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
16b90 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
16ba0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
16bb0 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
16bc0 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
16bd0 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
16be0 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
16bf0 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
16c00 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
16c10 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
16c20 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
16c30 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
16c40 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
16c50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
16c60 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
16c70 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
16c80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
16c90 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
16ca0 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
16cb0 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
16cc0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
16cd0 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
16ce0 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
16cf0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
16d00 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
16d10 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
16d20 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
16d30 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
16d40 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
16d50 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69 74  E(pBt) bytes wit
16d60 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66 69  h a 4-byte prefi
16d70 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69  x for a left-chi
16d80 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a  ld.** pointer..*
16d90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
16da0 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
16db0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
16dc0 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70    if( !pBt->pTmp
16dd0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
16de0 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
16df0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
16e00 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
16e10 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ;..    /* One of
16e20 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74   the uses of pBt
16e30 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74  ->pTmpSpace is t
16e40 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62  o format cells b
16e50 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73  efore.    ** ins
16e60 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f  erting them into
16e70 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75   a leaf page (fu
16e80 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c  nction fillInCel
16e90 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20  l()). If.    ** 
16ea0 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74  a cell is less t
16eb0 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73  han 4 bytes in s
16ec0 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64  ize, it is round
16ed0 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73  ed up to 4 bytes
16ee0 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76  .    ** by the v
16ef0 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20  arious routines 
16f00 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20  that manipulate 
16f10 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68  binary cells. Wh
16f20 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d  ich.    ** can m
16f30 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43  ean that fillInC
16f40 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69  ell() only initi
16f50 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74  alizes the first
16f60 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62   2 or 3.    ** b
16f70 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63  ytes of pTmpSpac
16f80 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20  e, but that the 
16f90 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72  first 4 bytes ar
16fa0 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20  e copied from.  
16fb0 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64    ** it into a d
16fc0 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68  atabase page. Th
16fd0 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  is is not actual
16fe0 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75  ly a problem, bu
16ff0 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73  t it.    ** does
17000 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e   cause a valgrin
17010 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65  d error when the
17020 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66   1 or 2 bytes of
17030 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20   unitialized .  
17040 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73    ** data is pas
17050 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61  sed to system ca
17060 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74  ll write(). So t
17070 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72  o avoid this err
17080 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20  or,.    ** zero 
17090 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
170a0 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20  s of temp space 
170b0 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  here..    **.   
170c0 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69   ** Also:  Provi
170d0 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  de four bytes of
170e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61   initialized spa
170f0 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  ce before the.  
17100 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f    ** beginning o
17110 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20 61  f pTmpSpace as a
17120 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65  n area available
17130 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a   to prepend the.
17140 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c      ** left-chil
17150 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  d pointer to the
17160 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
17170 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cell..    */.   
17180 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
17190 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ace ){.      mem
171a0 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61  set(pBt->pTmpSpa
171b0 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20  ce, 0, 8);.     
171c0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
171d0 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += 4;.    }.  }.
171e0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
171f0 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
17200 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
17210 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
17220 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
17230 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70  d *pBt){.  if( p
17240 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
17250 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
17260 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71  ace -= 4;.    sq
17270 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 42  lite3PageFree(pB
17280 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  t->pTmpSpace);. 
17290 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
172a0 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
172b0 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
172c0 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
172d0 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
172e0 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
172f0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
17300 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
17310 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17320 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
17330 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
17340 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
17350 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
17360 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
17370 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17380 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
17390 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
173a0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
173b0 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
173c0 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
173d0 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
173e0 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
173f0 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
17400 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
17410 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
17420 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
17430 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
17440 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
17450 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
17460 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
17470 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
17480 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
17490 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
174a0 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
174b0 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
174c0 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
174d0 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
174e0 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
174f0 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
17500 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
17510 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
17520 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17530 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  eave(p);..  /* I
17540 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
17550 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
17560 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
17570 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
17580 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
17590 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
175a0 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
175b0 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
175c0 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
175d0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
175e0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
175f0 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
17600 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30   && p->locked==0
17610 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   );.  if( !p->sh
17620 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65  arable || remove
17630 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
17640 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
17650 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e  he pBt is no lon
17660 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69  ger on the shari
17670 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63  ng list, so we c
17680 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a  an access.    **
17690 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69   it without havi
176a0 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ng to hold the m
176b0 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  utex..    **.   
176c0 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e   ** Clean out an
176d0 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53  d delete the BtS
176e0 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20  hared object..  
176f0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
17700 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
17710 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
17720 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
17730 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 20  ger, p->db);.   
17740 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53   if( pBt->xFreeS
17750 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53  chema && pBt->pS
17760 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
17770 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
17780 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
17790 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
177a0 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70  DbFree(0, pBt->p
177b0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65  Schema);.    fre
177c0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
177d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
177e0 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
177f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17800 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
17810 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
17820 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
17830 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
17840 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
17850 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
17860 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
17870 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
17880 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
17890 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
178a0 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
178b0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
178c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
178d0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
178e0 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69 74 20  he "soft" limit 
178f0 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
17900 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
17910 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61  che..** Unused a
17920 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20 70 61  nd unmodified pa
17930 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65 63 79  ges will be recy
17940 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75  cled when the nu
17950 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73  mber of.** pages
17960 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 65 78   in the cache ex
17970 63 65 65 64 73 20 74 68 69 73 20 73 6f 66 74 20  ceeds this soft 
17980 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68 65 20  limit.  But the 
17990 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  size of the.** c
179a0 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  ache is allowed 
179b0 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72 20 74  to grow larger t
179c0 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74 20 69  han this limit i
179d0 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  f it contains.**
179e0 20 64 69 72 74 79 20 70 61 67 65 73 20 6f 72 20   dirty pages or 
179f0 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e 20 61  pages still in a
17a00 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ctive use..*/.in
17a10 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
17a20 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
17a30 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
17a40 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
17a50 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
17a60 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
17a70 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
17a80 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
17a90 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
17aa0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
17ab0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
17ac0 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
17ad0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17ae0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
17af0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17b00 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
17b10 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74  he "spill" limit
17b20 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
17b30 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  f pages in the c
17b40 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ache..** If the 
17b50 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
17b60 65 78 63 65 65 64 73 20 74 68 69 73 20 6c 69 6d  exceeds this lim
17b70 69 74 20 64 75 72 69 6e 67 20 61 20 77 72 69 74  it during a writ
17b80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  e transaction,.*
17b90 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69 67 68  * the pager migh
17ba0 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22 73 70  t attempt to "sp
17bb0 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20 74 68  ill" pages to th
17bc0 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20  e journal early 
17bd0 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66  in.** order to f
17be0 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a  ree up memory..*
17bf0 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
17c00 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 63  eturned is the c
17c10 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a  urrent spill siz
17c20 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20 70  e.  If zero is p
17c30 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61  assed.** as an a
17c40 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e  rgument, no chan
17c50 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
17c60 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65 20 73  the spill size s
17c70 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73  etting, so.** us
17c80 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20 30 20  ing mxPage of 0 
17c90 69 73 20 61 20 77 61 79 20 74 6f 20 71 75 65 72  is a way to quer
17ca0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 70  y the current sp
17cb0 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74  ill size..*/.int
17cc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
17cd0 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65 65 20  SpillSize(Btree 
17ce0 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
17cf0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17d00 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
17d10 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20   res;.  assert( 
17d20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17d30 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
17d40 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
17d50 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 65  eeEnter(p);.  re
17d60 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  s = sqlite3Pager
17d70 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 42 74  SetSpillsize(pBt
17d80 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
17d90 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17da0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
17db0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20  urn res;.}..#if 
17dc0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
17dd0 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61  SIZE>0./*.** Cha
17de0 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
17df0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
17e00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17e10 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20   that may be.** 
17e20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a  memory mapped..*
17e30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17e40 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42  eeSetMmapLimit(B
17e50 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  tree *p, sqlite3
17e60 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
17e70 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17e80 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
17e90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
17ea0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
17eb0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
17ec0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
17ed0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
17ee0 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e  tMmapLimit(pBt->
17ef0 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b  pPager, szMmap);
17f00 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17f10 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17f20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
17f30 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
17f40 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
17f50 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
17f60 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
17f70 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
17f80 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
17f90 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
17fa0 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
17fb0 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
17fc0 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
17fd0 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
17fe0 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
17ff0 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
18000 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
18010 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
18020 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
18030 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
18040 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
18050 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
18060 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
18070 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
18080 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
18090 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
180a0 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
180b0 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
180c0 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
180d0 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
180e0 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
180f0 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
18100 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
18110 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
18120 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
18130 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
18140 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67  treeSetPagerFlag
18150 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  s(.  Btree *p,  
18160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18170 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20  he btree to set 
18180 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  the safety level
18190 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   on */.  unsigne
181a0 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20  d pgFlags       
181b0 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52  /* Various PAGER
181c0 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
181d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
181e0 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
181f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
18200 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
18210 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
18220 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18230 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
18240 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65  Flags(pBt->pPage
18250 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73  r, pgFlags);.  s
18260 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18270 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
18280 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
18290 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  f../*.** Change 
182a0 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
182b0 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e  s size and the n
182c0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
182d0 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  d bytes per page
182e0 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  ..** Or, if the 
182f0 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c  page size has al
18300 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64  ready been fixed
18310 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
18320 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74  READONLY .** wit
18330 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e  hout changing an
18340 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ything..**.** Th
18350 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74  e page size must
18360 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
18370 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
18380 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20   65536.  If the 
18390 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70  page.** size sup
183a0 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d  plied does not m
183b0 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61  eet this constra
183c0 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67  int then the pag
183d0 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a  e size is not.**
183e0 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
183f0 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63  Page sizes are c
18400 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65  onstrained to be
18410 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20   a power of two 
18420 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69  so that the regi
18430 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  on.** of the dat
18440 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20  abase file used 
18450 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67  for locking (beg
18460 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e  inning at PENDIN
18470 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66  G_BYTE,.** the f
18480 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
18490 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c  he 1GB boundary,
184a0 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65   0x40000000) nee
184b0 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61  ds to occur.** a
184c0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
184d0 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  of a page..**.**
184e0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52   If parameter nR
184f0 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74  eserve is less t
18500 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
18510 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
18520 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70  erved.** bytes p
18530 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  er page is left 
18540 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
18550 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20   If the iFix!=0 
18560 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47  then the BTS_PAG
18570 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67  ESIZE_FIXED flag
18580 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20   is set so that 
18590 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a  the page size.**
185a0 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20   and autovacuum 
185b0 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  mode can no long
185c0 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  er be changed..*
185d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
185e0 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeSetPageSize(Bt
185f0 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65  ree *p, int page
18600 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
18610 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20  ve, int iFix){. 
18620 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18630 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
18640 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
18650 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
18660 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76  e>=-1 && nReserv
18670 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69  e<=255 );.  sqli
18680 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
18690 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53  ;.#if SQLITE_HAS
186a0 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65  _CODEC.  if( nRe
186b0 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d  serve>pBt->optim
186c0 61 6c 52 65 73 65 72 76 65 20 29 20 70 42 74 2d  alReserve ) pBt-
186d0 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
186e0 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a  = (u8)nReserve;.
186f0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
18700 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
18710 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
18720 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
18730 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
18740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
18750 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
18760 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b  f( nReserve<0 ){
18770 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20  .    nReserve = 
18780 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
18790 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
187a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
187b0 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
187c0 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
187d0 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
187e0 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
187f0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
18800 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
18810 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
18820 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
18830 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
18840 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
18850 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
18860 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
18870 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
18880 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u32)pageSize;. 
18890 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
188a0 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  (pBt);.  }.  rc 
188b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
188c0 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
188d0 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
188e0 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
188f0 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  ;.  pBt->usableS
18900 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
18910 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65  ize - (u16)nRese
18920 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20  rve;.  if( iFix 
18930 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
18940 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
18950 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  FIXED;.  sqlite3
18960 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18970 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18980 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18990 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
189a0 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
189b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
189c0 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
189d0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
189e0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
189f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
18a00 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
18a10 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ar to sqlite3Btr
18a20 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20  eeGetReserve(), 
18a30 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
18a40 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  * may only be ca
18a50 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75  lled if it is gu
18a60 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
18a70 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  e b-tree mutex i
18a80 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c  s already.** hel
18a90 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
18aa0 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73   useful in one s
18ab0 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74  pecial case in t
18ac0 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f  he backup API co
18ad0 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a  de where it is.*
18ae0 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65  * known that the
18af0 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d   shared b-tree m
18b00 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75  utex is held, bu
18b10 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74  t the mutex on t
18b20 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
18b30 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
18b40 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74   *p is not. In t
18b50 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69  his case if sqli
18b60 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a  te3BtreeEnter().
18b70 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61  ** were to be ca
18b80 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63  lled, it might c
18b90 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65  ollide with some
18ba0 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e   other operation
18bb0 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
18bc0 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
18bd0 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67  owns *p, causing
18be0 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76   undefined behav
18bf0 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ior..*/.int sqli
18c00 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
18c10 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20  veNoMutex(Btree 
18c20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
18c30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
18c40 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42  mutex_held(p->pB
18c50 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e  t->mutex) );.  n
18c60 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
18c70 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
18c80 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75  ableSize;.  retu
18c90 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn n;.}../*.** R
18ca0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
18cb0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
18cc0 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
18cd0 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
18ce0 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61  .** are intentua
18cf0 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e  lly left unused.
18d00 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72    This is the "r
18d10 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74  eserved" space t
18d20 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69  hat is.** someti
18d30 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65  mes used by exte
18d40 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  nsions..**.** If
18d50 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45   SQLITE_HAS_MUTE
18d60 58 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  X is defined the
18d70 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74  n the number ret
18d80 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20  urned is the.** 
18d90 67 72 65 61 74 65 72 20 6f 66 20 74 68 65 20 63  greater of the c
18da0 75 72 72 65 6e 74 20 72 65 73 65 72 76 65 64 20  urrent reserved 
18db0 73 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61  space and the ma
18dc0 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a  ximum requested.
18dd0 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61 63 65  ** reserve space
18de0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18df0 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52  BtreeGetOptimalR
18e00 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
18e10 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
18e20 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
18e30 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
18e40 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
18e50 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65  oMutex(p);.#ifde
18e60 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
18e70 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42  EC.  if( n<p->pB
18e80 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
18e90 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  e ) n = p->pBt->
18ea0 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a  optimalReserve;.
18eb0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
18ec0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18ed0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
18ee0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78  *.** Set the max
18ef0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
18f00 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69  for a database i
18f10 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
18f20 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e  tive..** No chan
18f30 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20  ges are made if 
18f40 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e  mxPage is 0 or n
18f50 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61  egative..** Rega
18f60 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
18f70 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  lue of mxPage, r
18f80 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
18f90 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
18fa0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18fb0 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74  eMaxPageCount(Bt
18fc0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
18fd0 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ge){.  int n;.  
18fe0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18ff0 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
19000 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
19010 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61  ount(p->pBt->pPa
19020 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
19030 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19040 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
19050 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
19060 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
19070 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77  LETE flag if new
19080 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20  Flag is 0 or 1. 
19090 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d   If newFlag is -
190a0 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20  1,.** then make 
190b0 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77  no changes.  Alw
190c0 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76  ays return the v
190d0 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f  alue of the BTS_
190e0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a  SECURE_DELETE.**
190f0 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74   setting after t
19100 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e  he change..*/.in
19110 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
19120 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
19130 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
19140 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
19150 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
19160 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
19170 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
19180 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
19190 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
191a0 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55  ags &= ~BTS_SECU
191b0 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69  RE_DELETE;.    i
191c0 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e  f( newFlag ) p->
191d0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
191e0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
191f0 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28  TE;.  } .  b = (
19200 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
19210 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
19220 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69  LETE)!=0;.  sqli
19230 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
19240 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a  ;.  return b;.}.
19250 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
19260 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
19270 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
19280 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
19290 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
192a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
192b0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
192c0 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
192d0 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
192e0 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
192f0 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
19300 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
19310 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
19320 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
19330 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
19340 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
19350 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
19360 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19370 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
19380 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
19390 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
193a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
193b0 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
193c0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
193d0 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
193e0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
193f0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
19400 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76  LITE_OK;.  u8 av
19410 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75   = (u8)autoVacuu
19420 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  m;..  sqlite3Btr
19430 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
19440 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
19450 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
19460 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76  FIXED)!=0 && (av
19470 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74   ?1:0)!=pBt->aut
19480 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
19490 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
194a0 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
194b0 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
194c0 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20  m = av ?1:0;.   
194d0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
194e0 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20   = av==2 ?1:0;. 
194f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
19500 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
19510 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
19520 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
19530 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
19540 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
19550 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
19560 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
19570 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
19580 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
19590 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
195a0 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
195b0 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
195c0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
195d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
195e0 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
195f0 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
19600 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
19610 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
19620 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
19630 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
19640 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
19650 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
19660 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
19670 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
19680 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
19690 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
196a0 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
196b0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
196c0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
196d0 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
196e0 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  ** If the user h
196f0 61 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 73  as not set the s
19700 61 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f 72 20  afety-level for 
19710 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
19720 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e  nnection.** usin
19730 67 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72  g "PRAGMA synchr
19740 6f 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66 20 74  onous", and if t
19750 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20  he safety-level 
19760 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
19770 2a 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  * set to the val
19780 75 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ue passed to thi
19790 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 74 68  s function as th
197a0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
197b0 65 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20 73 6f  er,.** set it so
197c0 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
197d0 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e  DEFAULT_SYNCHRON
197e0 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44 45 46 41  OUS!=SQLITE_DEFA
197f0 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e  ULT_WAL_SYNCHRON
19800 4f 55 53 0a 73 74 61 74 69 63 20 76 6f 69 64 20  OUS.static void 
19810 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
19820 61 67 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ag(BtShared *pBt
19830 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65 76 65  , u8 safety_leve
19840 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  l){.  sqlite3 *d
19850 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  b;.  Db *pDb;.  
19860 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29  if( (db=pBt->db)
19870 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e  !=0 && (pDb=db->
19880 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 77  aDb)!=0 ){.    w
19890 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d  hile( pDb->pBt==
198a0 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70  0 || pDb->pBt->p
198b0 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b  Bt!=pBt ){ pDb++
198c0 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d  ; }.    if( pDb-
198d0 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20  >bSyncSet==0 .  
198e0 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74     && pDb->safet
198f0 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74 79 5f  y_level!=safety_
19900 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26 20 70  level .     && p
19910 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20  Db!=&db->aDb[1] 
19920 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 44  .    ){.      pD
19930 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  b->safety_level 
19940 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a  = safety_level;.
19950 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
19960 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
19970 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20  pPager,.        
19980 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65    pDb->safety_le
19990 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73  vel | (db->flags
199a0 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d   & PAGER_FLAGS_M
199b0 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ASK));.    }.  }
199c0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
199d0 65 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63  e setDefaultSync
199e0 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74 79 5f  Flag(pBt,safety_
199f0 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f  level).#endif../
19a00 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
19a10 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
19a20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
19a30 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
19a40 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
19a50 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
19a60 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
19a70 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
19a80 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
19a90 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
19aa0 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
19ab0 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
19ac0 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
19ad0 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
19ae0 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
19af0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
19b00 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
19b10 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
19b20 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
19b30 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
19b40 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
19b50 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
19b60 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
19b70 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
19b80 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
19b90 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
19ba0 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
19bb0 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ns */.  MemPage 
19bc0 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20  *pPage1;     /* 
19bd0 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  Page 1 of the da
19be0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
19bf0 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
19c00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19c10 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
19c20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
19c30 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b  t nPageFile = 0;
19c40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19c50 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
19c60 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
19c70 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b  int nPageHeader;
19c80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19c90 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
19ca0 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e  atabase accordin
19cb0 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61  g to hdr */..  a
19cc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
19cd0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
19ce0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
19cf0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  t( pBt->pPage1==
19d00 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
19d10 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
19d20 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
19d30 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19d40 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
19d50 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65  ;.  rc = btreeGe
19d60 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
19d70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
19d80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19d90 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
19da0 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
19db0 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
19dc0 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
19dd0 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
19de0 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
19df0 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
19e00 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  .  nPage = nPage
19e10 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74  Header = get4byt
19e20 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
19e30 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->aData);.  sqli
19e40 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
19e50 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
19e60 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66  nPageFile);.  if
19e70 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65  ( nPage==0 || me
19e80 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61  mcmp(24+(u8*)pPa
19e90 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28  ge1->aData, 92+(
19ea0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
19eb0 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  a,4)!=0 ){.    n
19ec0 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65  Page = nPageFile
19ed0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
19ee0 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70  e>0 ){.    u32 p
19ef0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32  ageSize;.    u32
19f00 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
19f10 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
19f20 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
19f30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
19f40 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  DB;.    /* EVIDE
19f50 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d  NCE-OF: R-43737-
19f60 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c 69  39999 Every vali
19f70 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  d SQLite databas
19f80 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20  e file begins.  
19f90 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f    ** with the fo
19fa0 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73  llowing 16 bytes
19fb0 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31   (in hex): 53 51
19fc0 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30 20   4c 69 74 65 20 
19fd0 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20 20  66 6f 72 6d.    
19fe0 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20 30  ** 61 74 20 33 0
19ff0 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65  0. */.    if( me
1a000 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
1a010 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
1a020 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
1a030 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
1a040 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
1a050 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1a060 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
1a070 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
1a080 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1a090 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
1a0a0 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
1a0b0 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [19]>1 ){.      
1a0c0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
1a0d0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65  failed;.    }.#e
1a0e0 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67 65  lse.    if( page
1a0f0 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[18]>2 ){.     
1a100 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1a110 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
1a120 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1a130 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20  age1[19]>2 ){.  
1a140 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
1a150 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
1a160 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1a170 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69   write version i
1a180 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73  s set to 2, this
1a190 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
1a1a0 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20 20   be accessed.   
1a1b0 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e   ** in WAL mode.
1a1c0 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e   If the log is n
1a1d0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
1a1e0 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68   open it now. Th
1a1f0 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  en .    ** retur
1a200 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
1a210 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70  return without p
1a220 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72  opulating BtShar
1a230 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a  ed.pPage1..    *
1a240 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74  * The caller det
1a250 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63 61  ects this and ca
1a260 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
1a270 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73  n again. This is
1a280 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64  .    ** required
1a290 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20   as the version 
1a2a0 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65 6e  of page 1 curren
1a2b0 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 31  tly in the page1
1a2c0 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d   buffer.    ** m
1a2d0 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61  ay not be the la
1a2e0 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74  test version - t
1a2f0 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65  here may be a ne
1a300 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c  wer one in the l
1a310 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a  og.    ** file..
1a320 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1a330 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28  age1[19]==2 && (
1a340 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1a350 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29  BTS_NO_WAL)==0 )
1a360 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70  {.      int isOp
1a370 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  en = 0;.      rc
1a380 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1a390 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  penWal(pBt->pPag
1a3a0 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20  er, &isOpen);.  
1a3b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a3c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a3d0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1a3e0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d  _failed;.      }
1a3f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65  else{.        se
1a400 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67  tDefaultSyncFlag
1a410 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46  (pBt, SQLITE_DEF
1a420 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f  AULT_WAL_SYNCHRO
1a430 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 20 20 20  NOUS+1);.       
1a440 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29   if( isOpen==0 )
1a450 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
1a460 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
1a470 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1a480 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1a490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1a4a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a4b0 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65 6c  _NOTADB;.    }el
1a4c0 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44 65 66  se{.      setDef
1a4d0 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74  aultSyncFlag(pBt
1a4e0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
1a4f0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b  _SYNCHRONOUS+1);
1a500 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1a510 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a520 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33  F: R-15465-20813
1a530 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64   The maximum and
1a540 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65   minimum embedde
1a550 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a  d payload.    **
1a560 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74   fractions and t
1a570 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20  he leaf payload 
1a580 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20  fraction values 
1a590 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20  must be 64, 32, 
1a5a0 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20  and 32..    **. 
1a5b0 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
1a5c0 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
1a5d0 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
1a5e0 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
1a5f0 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
1a600 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
1a610 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
1a620 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
1a630 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
1a640 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
1a650 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
1a660 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
1a670 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
1a680 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
1a690 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
1a6a0 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
1a6b0 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
1a6c0 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
1a6d0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
1a6e0 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
1a6f0 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
1a700 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
1a710 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
1a720 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1a730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a740 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53  le. */.    pageS
1a750 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
1a760 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
1a770 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45  ]<<16);.    /* E
1a780 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
1a790 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69  008-21688 The si
1a7a0 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20  ze of a page is 
1a7b0 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20  a power of two. 
1a7c0 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31     ** between 51
1a7d0 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c  2 and 65536 incl
1a7e0 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66  usive. */.    if
1a7f0 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
1a800 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
1a810 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
1a820 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
1a830 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
1a840 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
1a850 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
1a860 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
1a870 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1a880 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
1a890 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==0 );.    /* EV
1a8a0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33  IDENCE-OF: R-593
1a8b0 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65  10-51205 The "re
1a8c0 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69  served space" si
1a8d0 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65  ze in the 1-byte
1a8e0 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  .    ** integer 
1a8f0 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20  at offset 20 is 
1a900 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1a910 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
1a920 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a  the end of.    *
1a930 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72  * each page to r
1a940 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e  eserve for exten
1a950 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20  sions. .    **. 
1a960 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
1a970 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
1a980 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
1a990 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
1a9a0 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
1a9b0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
1a9c0 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
1a9d0 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
1a9e0 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
1a9f0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
1aa00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
1aa10 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61  ader. */.    usa
1aa20 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
1aa30 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
1aa40 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
1aa50 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
1aa60 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
1aa70 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
1aa80 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1aa90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
1aaa0 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
1aab0 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
1aac0 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
1aad0 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
1aae0 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
1aaf0 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
1ab00 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
1ab10 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
1ab20 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
1ab30 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
1ab40 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
1ab50 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
1ab60 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
1ab70 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
1ab80 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
1ab90 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
1aba0 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
1abb0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
1abc0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1abd0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
1abe0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
1abf0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
1ac00 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
1ac10 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
1ac20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
1ac30 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
1ac40 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
1ac50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
1ac60 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
1ac70 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
1ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac90 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
1aca0 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
1acb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1acc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42     }.    if( (pB
1acd0 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
1ace0 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f  QLITE_RecoveryMo
1acf0 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  de)==0 && nPage>
1ad00 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
1ad10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1ad20 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1ad30 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
1ad40 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
1ad50 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
1ad60 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37  -OF: R-28312-647
1ad70 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  04 However, the 
1ad80 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e  usable size is n
1ad90 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
1ada0 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61    ** be less tha
1adb0 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20  n 480. In other 
1adc0 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61  words, if the pa
1add0 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20  ge size is 512, 
1ade0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
1adf0 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73  reserved space s
1ae00 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ize cannot excee
1ae10 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d 32. */.    if(
1ae20 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
1ae30 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
1ae40 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
1ae50 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
1ae60 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
1ae70 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
1ae80 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
1ae90 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
1aea0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1aeb0 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
1aec0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
1aed0 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
1aee0 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
1aef0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
1af00 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
1af10 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
1af20 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
1af30 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
1af40 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
1af50 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
1af60 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
1af70 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
1af80 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
1af90 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
1afa0 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
1afb0 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
1afc0 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
1afd0 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
1afe0 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
1aff0 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
1b000 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
1b010 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
1b020 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
1b030 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
1b040 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
1b050 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
1b060 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
1b070 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
1b080 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
1b090 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
1b0a0 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
1b0b0 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
1b0c0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
1b0d0 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
1b0e0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
1b0f0 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
1b100 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
1b110 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
1b120 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
1b130 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
1b140 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
1b150 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
1b160 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
1b170 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
1b180 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
1b190 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
1b1a0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
1b1b0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
1b1c0 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
1b1d0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
1b1e0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
1b1f0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
1b200 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
1b210 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
1b220 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
1b230 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
1b240 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
1b250 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
1b260 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
1b270 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
1b280 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
1b290 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
1b2a0 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
1b2b0 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
1b2c0 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
1b2d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
1b2e0 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
1b2f0 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
1b300 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
1b310 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
1b320 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
1b330 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
1b340 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
1b350 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
1b360 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1b370 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
1b380 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
1b390 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1b3a0 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
1b3b0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1b3c0 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
1b3d0 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
1b3e0 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
1b3f0 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
1b400 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
1b410 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
1b420 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
1b430 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
1b440 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
1b450 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
1b460 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
1b470 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
1b480 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
1b490 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
1b4a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
1b4b0 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
1b4c0 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
1b4d0 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
1b4e0 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
1b4f0 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
1b500 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
1b510 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
1b520 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
1b530 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
1b540 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
1b550 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
1b560 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
1b570 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
1b580 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
1b590 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
1b5a0 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
1b5b0 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
1b5c0 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
1b5d0 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
1b5e0 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
1b5f0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1b600 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
1b610 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
1b620 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
1b630 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
1b640 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1b650 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
1b660 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
1b670 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1b680 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1b690 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
1b6a0 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
1b6b0 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
1b6c0 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
1b6d0 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
1b6e0 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
1b6f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
1b700 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
1b710 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
1b720 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1b730 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b740 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
1b750 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
1b760 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
1b770 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1b780 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
1b790 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
1b7a0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1b7b0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1b7c0 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
1b7d0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
1b7e0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1b7f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1b800 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1b810 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1b820 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
1b830 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
1b840 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
1b850 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
1b860 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
1b870 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1b880 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
1b890 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
1b8a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1b8b0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1b8c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b8d0 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
1b8e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1b8f0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1b900 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
1b910 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
1b920 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
1b930 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
1b940 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  age1);.  }.}../*
1b950 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
1b960 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
1b970 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
1b980 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
1b990 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
1b9a0 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
1b9b0 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
1b9c0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
1b9d0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
1b9e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
1b9f0 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
1ba00 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
1ba10 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
1ba20 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
1ba30 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1ba40 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1ba50 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1ba60 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
1ba70 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
1ba80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ba90 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
1baa0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
1bab0 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
1bac0 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
1bad0 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
1bae0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1baf0 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
1bb00 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1bb10 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
1bb20 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
1bb30 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
1bb40 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
1bb50 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
1bb60 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
1bb70 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28  data[16] = (u8)(
1bb80 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
1bb90 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  8)&0xff);.  data
1bba0 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [17] = (u8)((pBt
1bbb0 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26  ->pageSize>>16)&
1bbc0 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38  0xff);.  data[18
1bbd0 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
1bbe0 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
1bbf0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1bc00 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
1bc10 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
1bc20 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
1bc30 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
1bc40 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
1bc50 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
1bc60 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
1bc70 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
1bc80 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
1bc90 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
1bca0 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
1bcb0 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
1bcc0 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
1bcd0 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
1bce0 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
1bcf0 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  );.  pBt->btsFla
1bd00 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
1bd10 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
1bd20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1bd30 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
1bd40 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
1bd50 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
1bd60 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
1bd70 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1bd80 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
1bd90 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
1bda0 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
1bdb0 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
1bdc0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1bdd0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1bde0 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
1bdf0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
1be00 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
1be10 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
1be20 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
1be30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1be40 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1be50 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
1be60 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1be70 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20   file (creating 
1be80 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1be90 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
1bea0 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f  ngle page and no
1beb0 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29   schema objects)
1bec0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
1bed0 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  OK.** if success
1bee0 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
1bef0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
1bf00 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
1bf10 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62  qlite3BtreeNewDb
1bf20 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1bf30 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1bf40 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1bf50 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  p->pBt->nPage = 
1bf60 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74  0;.  rc = newDat
1bf70 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20  abase(p->pBt);. 
1bf80 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1bf90 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1bfa0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
1bfb0 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
1bfc0 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
1bfd0 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1bfe0 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
1bff0 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
1c000 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
1c010 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
1c020 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
1c030 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
1c040 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1c050 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
1c060 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
1c070 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1c080 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
1c090 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
1c0a0 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
1c0b0 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
1c0c0 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
1c0d0 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
1c0e0 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
1c0f0 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
1c100 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
1c110 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1c120 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
1c130 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
1c140 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
1c150 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
1c160 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1c170 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1c180 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
1c190 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
1c1a0 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
1c1b0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1c1c0 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
1c1d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
1c1e0 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
1c1f0 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
1c200 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
1c210 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
1c220 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1c230 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1c240 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1c250 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
1c260 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
1c270 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
1c280 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1c290 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
1c2a0 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1c2b0 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
1c2c0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1c2d0 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
1c2e0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1c2f0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
1c300 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
1c310 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
1c320 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
1c330 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
1c340 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
1c350 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
1c360 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
1c370 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
1c380 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
1c390 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
1c3a0 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
1c3b0 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
1c3c0 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
1c3d0 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
1c3e0 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
1c3f0 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
1c400 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
1c410 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
1c420 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
1c430 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1c440 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1c450 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
1c460 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
1c470 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
1c480 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1c490 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
1c4a0 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
1c4b0 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
1c4c0 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
1c4d0 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
1c4e0 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
1c4f0 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
1c500 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
1c510 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
1c520 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
1c530 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
1c540 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1c550 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
1c560 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
1c570 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
1c580 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
1c590 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
1c5a0 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
1c5b0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1c5c0 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
1c5d0 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
1c5e0 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
1c5f0 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
1c600 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
1c610 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
1c620 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
1c630 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
1c640 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1c650 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
1c660 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
1c670 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1c680 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
1c690 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c6a0 0a 20 20 69 6e 74 20 62 43 6f 6e 63 75 72 72 65  .  int bConcurre
1c6b0 6e 74 20 3d 20 28 70 2d 3e 64 62 2d 3e 62 43 6f  nt = (p->db->bCo
1c6c0 6e 63 75 72 72 65 6e 74 20 26 26 20 21 49 53 41  ncurrent && !ISA
1c6d0 55 54 4f 56 41 43 55 55 4d 29 3b 0a 0a 20 20 73  UTOVACUUM);..  s
1c6e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1c6f0 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
1c700 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
1c710 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
1c720 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
1c730 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
1c740 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
1c750 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
1c760 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
1c770 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
1c780 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
1c790 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
1c7a0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
1c7b0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1c7c0 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
1c7d0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1c7e0 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
1c7f0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
1c800 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20  ns_begun;.  }.  
1c810 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1c820 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1c830 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74  S_WRITE || IfNot
1c840 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
1c850 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a  runcate)==0 );..
1c860 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
1c870 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
1c880 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
1c890 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
1c8a0 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e   */.  if( (pBt->
1c8b0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1c8c0 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20  EAD_ONLY)!=0 && 
1c8d0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
1c8e0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
1c8f0 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
1c900 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
1c910 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c920 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1c930 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20    {.    sqlite3 
1c940 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  *pBlock = 0;.   
1c950 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
1c960 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
1c970 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
1c980 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
1c990 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e  ction .    ** on
1c9a0 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
1c9b0 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
1c9c0 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
1c9d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
1c9e0 20 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c     ** requested,
1c9f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
1ca00 4f 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  OCKED..    */.  
1ca10 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26    if( (wrflag &&
1ca20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1ca30 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1ca40 29 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e  ).     || (pBt->
1ca50 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
1ca60 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29  ENDING)!=0.    )
1ca70 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d  {.      pBlock =
1ca80 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
1ca90 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  b;.    }else if(
1caa0 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
1cab0 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
1cac0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65  ;.      for(pIte
1cad0 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
1cae0 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
1caf0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1cb00 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
1cb10 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
1cb20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74      pBlock = pIt
1cb30 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  er->pBtree->db;.
1cb40 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1cb50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cb60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1cb70 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20   pBlock ){.     
1cb80 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
1cb90 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
1cba0 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20   pBlock);.      
1cbb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
1cbc0 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
1cbd0 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73        goto trans
1cbe0 5f 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20  _begun;.    }.  
1cbf0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
1cc00 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
1cc10 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
1cc20 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
1cc30 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
1cc40 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
1cc50 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
1cc60 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
1cc70 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
1cc80 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
1cc90 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
1cca0 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
1ccb0 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
1ccc0 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
1ccd0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1cce0 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
1ccf0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
1cd00 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
1cd10 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
1cd20 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73  gun;..  pBt->bts
1cd30 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e  Flags &= ~BTS_IN
1cd40 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
1cd50 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
1cd60 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  =0 ) pBt->btsFla
1cd70 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41  gs |= BTS_INITIA
1cd80 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20  LLY_EMPTY;.  do 
1cd90 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
1cda0 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
1cdb0 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
1cdc0 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
1cdd0 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
1cde0 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
1cdf0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
1ce00 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
1ce10 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
1ce20 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
1ce30 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
1ce40 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
1ce50 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
1ce60 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
1ce70 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
1ce80 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
1ce90 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1cea0 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
1ceb0 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
1cec0 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
1ced0 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
1cee0 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
1cef0 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
1cf00 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
1cf10 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
1cf20 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
1cf30 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
1cf40 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
1cf50 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
1cf60 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
1cf70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cf80 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
1cf90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42  ){.      if( (pB
1cfa0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1cfb0 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
1cfc0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1cfd0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1cfe0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1cff0 20 20 20 20 20 20 69 6e 74 20 65 78 46 6c 61 67        int exFlag
1d000 20 3d 20 62 43 6f 6e 63 75 72 72 65 6e 74 20 3f   = bConcurrent ?
1d010 20 2d 31 20 3a 20 28 77 72 66 6c 61 67 3e 31 29   -1 : (wrflag>1)
1d020 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1d030 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1d040 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 65 78  (pBt->pPager, ex
1d050 46 6c 61 67 2c 20 73 71 6c 69 74 65 33 54 65 6d  Flag, sqlite3Tem
1d060 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
1d070 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1d080 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d090 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
1d0a0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
1d0b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d0c0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1d0d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d0e0 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
1d0f0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1d100 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
1d110 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d  ile( (rc&0xFF)==
1d120 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
1d130 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1d140 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
1d150 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
1d160 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
1d170 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28  r(pBt) );..  if(
1d180 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d190 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
1d1a0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
1d1b0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
1d1c0 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23  Transaction++;.#
1d1d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d1e0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1d1f0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61        if( p->sha
1d200 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
1d210 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
1d220 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d  .pBtree==p && p-
1d230 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20  >lock.iTable==1 
1d240 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
1d250 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  ck.eLock = READ_
1d260 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d  LOCK;.        p-
1d270 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42  >lock.pNext = pB
1d280 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  t->pLock;.      
1d290 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26    pBt->pLock = &
1d2a0 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  p->lock;.      }
1d2b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1d2c0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
1d2d0 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
1d2e0 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
1d2f0 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1d300 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
1d310 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
1d320 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1d330 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
1d340 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72      }.    if( wr
1d350 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65  flag ){.      Me
1d360 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
1d370 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66  pBt->pPage1;.#if
1d380 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d390 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1d3a0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
1d3b0 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
1d3c0 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
1d3d0 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = p;.      pBt->
1d3e0 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
1d3f0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
1d400 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
1d410 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1d420 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b  = BTS_EXCLUSIVE;
1d430 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
1d440 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65  * If the db-size
1d450 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73   header field is
1d460 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69   incorrect (as i
1d470 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f  t may be if an o
1d480 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65  ld.      ** clie
1d490 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  nt has been writ
1d4a0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1d4b0 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69   file), update i
1d4c0 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20  t now. Doing.   
1d4d0 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65     ** this soone
1d4e0 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
1d4f0 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61  ter means the da
1d500 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20  tabase size can 
1d510 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  safely .      **
1d520 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74   re-read the dat
1d530 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20  abase size from 
1d540 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65  page 1 if a save
1d550 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  point or transac
1d560 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f  tion.      ** ro
1d570 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69  llback occurs wi
1d580 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  thin the transac
1d590 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1d5a0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
1d5b0 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70  age!=get4byte(&p
1d5c0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1d5d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1d5e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1d5f0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
1d600 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1d610 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1d630 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1d640 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
1d650 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
1d660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d670 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
1d680 3a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  :.#ifndef SQLITE
1d690 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
1d6a0 0a 20 20 69 66 28 20 62 43 6f 6e 63 75 72 72 65  .  if( bConcurre
1d6b0 6e 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  nt && rc==SQLITE
1d6c0 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 50 61  _OK && sqlite3Pa
1d6d0 67 65 72 49 73 57 61 6c 28 70 42 74 2d 3e 70 50  gerIsWal(pBt->pP
1d6e0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20  ager) ){.    rc 
1d6f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
1d700 67 69 6e 43 6f 6e 63 75 72 72 65 6e 74 28 70 42  ginConcurrent(pB
1d710 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1d720 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d730 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
1d740 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 50       rc = btreeP
1d750 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28 70 42  trmapAllocate(pB
1d760 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
1d770 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ndif..  if( rc==
1d780 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
1d790 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  lag ){.    /* Th
1d7a0 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75  is call makes su
1d7b0 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
1d7c0 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63  r has the correc
1d7d0 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  t number of.    
1d7e0 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** open savepoin
1d7f0 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  ts. If the secon
1d800 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67  d parameter is g
1d810 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e  reater than 0 an
1d820 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62  d.    ** the sub
1d830 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20  -journal is not 
1d840 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
1d850 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70  en it will be op
1d860 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a  ened here..    *
1d870 2f 0a 20 20 20 20 69 6e 74 20 6e 53 61 76 65 70  /.    int nSavep
1d880 6f 69 6e 74 20 3d 20 70 2d 3e 64 62 2d 3e 6e 53  oint = p->db->nS
1d890 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 72 63  avepoint;.    rc
1d8a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1d8b0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
1d8c0 2d 3e 70 50 61 67 65 72 2c 20 6e 53 61 76 65 70  ->pPager, nSavep
1d8d0 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
1d8e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d8f0 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  nSavepoint ){.  
1d900 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 50 74      rc = btreePt
1d910 72 6d 61 70 42 65 67 69 6e 28 70 42 74 2c 20 6e  rmapBegin(pBt, n
1d920 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
1d930 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  }.  }..  btreeIn
1d940 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
1d950 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1d960 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1d970 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1d980 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1d990 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
1d9a0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
1d9b0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
1d9c0 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
1d9d0 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
1d9e0 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
1d9f0 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
1da00 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1da10 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
1da20 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
1da30 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
1da40 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
1da50 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
1da60 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
1da70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
1da80 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daa0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
1dab0 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
1dac0 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dae0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1daf0 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
1db00 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
1db10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1db30 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1db40 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1db50 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
1db60 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
1db70 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
1db80 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1db90 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1dba0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
1dbb0 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
1dbc0 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  (pPage);.  if( r
1dbd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1dbe0 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c  eturn rc;.  nCel
1dbf0 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
1dc00 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
1dc10 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
1dc20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
1dc30 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1dc40 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f  ..    ptrmapPutO
1dc50 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
1dc60 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  ell, &rc);..    
1dc70 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1dc80 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
1dc90 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
1dca0 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
1dcb0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1dcc0 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
1dcd0 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
1dce0 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
1dcf0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
1dd00 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
1dd10 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1dd20 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1dd30 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1dd40 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72  set+8]);.    ptr
1dd50 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
1dd60 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
1dd70 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
1dd80 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1dd90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
1dda0 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69  where on pPage i
1ddb0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
1ddc0 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69  age iFrom.  Modi
1ddd0 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
1dde0 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  so.** that it po
1ddf0 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72  ints to iTo. Par
1de00 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
1de10 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
1de20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a  of pointer to.**
1de30 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
1de40 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a    follows:.**.**
1de50 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
1de60 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
1de70 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
1de80 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
1de90 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
1deb0 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
1dec0 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
1ded0 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
1dee0 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
1def0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
1df00 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
1df30 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
1df40 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
1df50 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
1df60 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
1df70 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
1df80 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1df90 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
1dfa0 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
1dfb0 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
1dfc0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
1dfd0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1dfe0 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
1dff0 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
1e000 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
1e010 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
1e020 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
1e030 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1e040 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
1e050 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1e060 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
1e070 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
1e080 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
1e090 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1e0a0 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
1e0b0 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
1e0c0 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
1e0d0 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
1e0e0 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
1e0f0 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
1e100 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
1e110 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
1e120 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e130 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e140 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
1e150 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
1e160 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
1e170 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  lse{.    int i;.
1e180 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20      int nCell;. 
1e190 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
1e1a0 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
1e1b0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
1e1c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1e1d0 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  c;.    nCell = p
1e1e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
1e1f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
1e200 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
1e210 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
1e220 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
1e230 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
1e240 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1e250 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
1e260 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
1e270 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
1e280 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
1e290 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
1e2a0 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f      if( info.nLo
1e2b0 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  cal<info.nPayloa
1e2c0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  d ){.          i
1e2d0 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53  f( pCell+info.nS
1e2e0 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  ize > pPage->aDa
1e2f0 74 61 2b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  ta+pPage->pBt->u
1e300 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
1e310 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1e320 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e330 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  KPT;.          }
1e340 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1e350 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 70  From==get4byte(p
1e360 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d  Cell+info.nSize-
1e370 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  4) ){.          
1e380 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
1e390 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69  +info.nSize-4, i
1e3a0 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  To);.           
1e3b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1e3c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1e3d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e3e0 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
1e3f0 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b  pCell)==iFrom ){
1e400 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1e410 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b  yte(pCell, iTo);
1e420 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1e430 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e440 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1e450 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b   if( i==nCell ){
1e460 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1e470 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  !=PTRMAP_BTREE |
1e480 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  | .          get
1e490 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1e4a0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1e4b0 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20  fset+8])!=iFrom 
1e4c0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1e4d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1e4e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
1e4f0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1e500 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1e510 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
1e520 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   iTo);.    }.  }
1e530 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e540 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
1e550 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
1e560 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1e570 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
1e580 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
1e590 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
1e5a0 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
1e5b0 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
1e5c0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43  d..**.** The isC
1e5d0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63  ommit flag indic
1e5e0 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ates that there 
1e5f0 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
1e600 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74  member that.** t
1e610 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
1e620 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
1e630 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
1e640 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67  page pDbPage->pg
1e650 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72  no .** can be wr
1e660 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
1e670 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1e680 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
1e690 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a   write to that.*
1e6a0 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  * page..*/.stati
1e6b0 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
1e6c0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
1e6d0 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
1e6e0 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
1e6f0 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
1e700 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
1e710 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
1e720 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
1e730 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1e740 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
1e750 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1e760 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
1e770 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
1e780 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
1e790 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
1e7a0 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
1e7b0 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
1e7c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
1e7d0 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
1e7e0 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
1e7f0 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1e800 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f           /* isCo
1e810 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64  mmit flag passed
1e820 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1e830 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  Movepage */.){. 
1e840 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
1e850 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
1e860 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1e870 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
1e880 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1e890 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
1e8a0 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
1e8b0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1e8c0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
1e8d0 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
1e8e0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1e8f0 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
1e900 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
1e910 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
1e920 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1e930 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1e940 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
1e950 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1e960 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1e970 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1e980 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
1e990 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
1e9a0 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
1e9b0 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
1e9c0 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
1e9d0 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
1e9e0 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
1e9f0 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
1ea00 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
1ea10 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
1ea20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
1ea30 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
1ea40 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
1ea50 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
1ea60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
1ea70 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
1ea80 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
1ea90 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
1eaa0 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
1eab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1eac0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1ead0 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
1eae0 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
1eaf0 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
1eb00 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
1eb10 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
1eb20 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
1eb30 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
1eb40 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1eb50 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
1eb60 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1eb70 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
1eb80 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
1eb90 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
1eba0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
1ebb0 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
1ebc0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
1ebd0 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
1ebe0 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
1ebf0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
1ec00 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
1ec10 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
1ec20 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
1ec30 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
1ec40 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
1ec50 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
1ec60 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
1ec70 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1ec80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1ec90 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1eca0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1ecb0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1ecc0 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
1ecd0 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
1ece0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ecf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1ed00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1ed10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1ed20 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
1ed30 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
1ed40 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
1ed50 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
1ed60 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1ed70 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
1ed80 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
1ed90 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
1eda0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1edb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1edc0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1edd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ede0 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
1edf0 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
1ee00 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
1ee10 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
1ee20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
1ee30 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
1ee40 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
1ee50 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
1ee60 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
1ee70 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
1ee80 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
1ee90 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1eea0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1eeb0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1eec0 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
1eed0 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1eee0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1eef0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ef00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1ef10 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1ef20 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
1ef30 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1ef40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ef50 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1ef60 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1ef70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ef80 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
1ef90 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
1efa0 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
1efb0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1efc0 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
1efd0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1efe0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1eff0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1f000 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
1f010 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
1f020 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
1f030 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1f040 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
1f050 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1f060 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
1f070 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
1f080 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
1f090 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
1f0a0 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
1f0b0 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
1f0c0 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
1f0d0 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
1f0e0 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
1f0f0 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
1f100 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1f110 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
1f120 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
1f130 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
1f140 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
1f150 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
1f160 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1f170 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
1f180 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
1f190 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
1f1a0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
1f1b0 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
1f1c0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1f1d0 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c  More specificall
1f1e0 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
1f1f0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
1f200 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74  organize the dat
1f210 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61  abase so .** tha
1f220 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
1f230 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
1f240 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20  ently in use is 
1f250 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
1f260 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
1f270 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75  r nFin is the nu
1f280 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
1f290 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65  at this database
1f2a0 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a   would contain.*
1f2b0 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63  * were this func
1f2c0 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69  tion called unti
1f2d0 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1f2e0 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
1f2f0 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70  If the bCommit p
1f300 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
1f310 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
1f320 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
1f330 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   the .** caller 
1f340 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
1f350 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
1f360 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  () until it retu
1f370 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1f380 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e  .** or an error.
1f390 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73   bCommit is pass
1f3a0 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61  ed true for an a
1f3b0 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f  uto-vacuum-on-co
1f3c0 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69  mmit .** operati
1f3d0 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72  on, or false for
1f3e0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1f3f0 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  vacuum..*/.stati
1f400 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
1f410 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
1f420 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
1f430 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74  gno iLastPg, int
1f440 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e   bCommit){.  Pgn
1f450 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
1f460 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f470 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
1f480 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1f490 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
1f4a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1f4b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1f4c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1f4d0 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
1f4e0 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
1f4f0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1f500 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
1f510 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
1f520 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1f530 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
1f540 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
1f550 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
1f560 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1f570 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1f580 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
1f590 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
1f5a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f5b0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
1f5c0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1f5d0 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
1f5e0 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
1f5f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1f600 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f610 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f620 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
1f630 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1f640 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f650 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1f660 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1f670 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1f680 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
1f690 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1f6a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1f6b0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
1f6c0 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
1f6d0 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
1f6e0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1f6f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62  .        ** if b
1f700 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65  Commit is non-ze
1f710 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
1f720 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
1f730 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
1f740 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
1f750 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
1f760 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1f770 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1f780 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
1f790 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
1f7a0 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
1f7b0 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
1f7c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1f7d0 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
1f7e0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1f7f0 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1f800 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1f810 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1f820 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1f830 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f   iLastPg, BTALLO
1f840 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20  C_EXACT);.      
1f850 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f860 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1f870 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f880 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1f890 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
1f8a0 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1f8b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1f8c0 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
1f8d0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1f8e0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f900 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
1f910 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
1f920 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
1f930 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
1f940 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20  .      u8 eMode 
1f950 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20  = BTALLOC_ANY;  
1f960 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74   /* Mode paramet
1f970 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1f980 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20  treePage() */.  
1f990 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d      Pgno iNear =
1f9a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1f9b0 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65   nearby paramete
1f9c0 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1f9d0 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20  reePage() */..  
1f9e0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1f9f0 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
1fa00 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
1fa10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1fa20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fa30 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1fa40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1fa50 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
1fa60 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
1fa70 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
1fa80 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
1fa90 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
1faa0 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
1fab0 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
1fac0 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
1fad0 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
1fae0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
1faf0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
1fb00 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
1fb10 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
1fb20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
1fb30 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
1fb40 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
1fb50 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
1fb60 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
1fb70 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1fb80 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
1fb90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1fba0 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1fbb0 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
1fbc0 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
1fbd0 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
1fbe0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
1fbf0 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
1fc00 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1fc10 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1fc20 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1fc30 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1fc40 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
1fc50 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
1fc60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fc70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1fc80 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1fc90 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
1fca0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1fcb0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
1fcc0 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1fcd0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
1fce0 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
1fcf0 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
1fd00 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
1fd10 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1fd20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
1fd30 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
1fd40 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
1fd50 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
1fd60 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
1fd70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1fd80 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
1fd90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fda0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1fdb0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1fdc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
1fdd0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1fde0 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
1fdf0 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
1fe00 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
1fe10 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1fe20 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
1fe30 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1fe40 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
1fe50 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1fe60 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1fe70 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
1fe80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fe90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
1fea0 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1feb0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1fec0 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
1fed0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
1fee0 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
1fef0 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
1ff00 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
1ff10 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
1ff20 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
1ff30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ff40 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
1ff50 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
1ff60 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
1ff70 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
1ff80 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
1ff90 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
1ffa0 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
1ffb0 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1ffe0 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
1fff0 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
20000 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
20010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20020 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
20030 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
20040 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
20050 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
20060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
20070 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
20080 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
20090 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
200a0 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
200b0 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
200c0 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
200d0 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
200e0 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
200f0 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
20100 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
20110 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
20120 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
20130 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
20140 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
20150 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
20160 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
20170 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
20180 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
20190 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
201a0 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
201b0 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
201c0 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
201d0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
201e0 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
201f0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
20200 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
20210 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
20220 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
20230 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
20240 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
20250 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
20260 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
20270 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
20280 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
20290 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
202a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
202b0 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
202c0 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
202d0 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
202e0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
202f0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
20300 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
20310 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
20320 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
20330 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
20340 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
20350 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
20360 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
20370 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
20380 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
20390 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
203a0 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
203b0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
203c0 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
203d0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
203e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
203f0 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
20400 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
20410 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
20420 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
20430 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
20440 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
20450 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
20460 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
20470 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
20480 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
20490 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
204a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
204b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
204c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
204d0 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
204e0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
204f0 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
20500 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20510 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20520 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
20530 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
20540 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
20550 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
20560 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
20570 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
20580 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20590 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
205a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
205b0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
205c0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
205d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
205e0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
205f0 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
20600 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
20610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
20620 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
20630 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
20640 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
20650 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20660 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
20670 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
20680 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
20690 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
206a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
206b0 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72  is committed for
206c0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
206d0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
206e0 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
206f0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
20700 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
20710 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
20720 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
20730 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
20740 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
20750 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
20760 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
20770 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
20780 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
20790 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
207a0 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
207b0 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
207c0 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
207d0 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
207e0 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
207f0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
20800 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20810 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
20820 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
20830 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
20840 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
20850 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
20860 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72  ger); )..  asser
20870 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
20880 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
20890 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
208a0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
208b0 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
208c0 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
208d0 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
208e0 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
208f0 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
20900 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20910 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
20920 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
20930 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
20940 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
20950 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
20960 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
20970 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
20980 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
20990 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
209a0 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
209b0 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
209c0 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
209d0 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
209e0 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
209f0 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
20a00 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
20a10 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
20a20 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
20a30 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
20a40 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
20a50 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
20a60 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
20a70 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
20a80 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
20a90 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
20aa0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
20ab0 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
20ac0 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
20ad0 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
20ae0 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
20af0 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
20b00 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
20b10 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
20b20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
20b30 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
20b40 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
20b50 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
20b60 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
20b70 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
20b80 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c      nFin = final
20b90 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
20ba0 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  g, nFree);.    i
20bb0 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
20bc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20bd0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
20be0 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29  if( nFin<nOrig )
20bf0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
20c00 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
20c10 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
20c20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
20c30 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
20c40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
20c50 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
20c60 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
20c70 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
20c80 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Free, 1);.    }.
20c90 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
20ca0 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
20cb0 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
20cc0 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
20cd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20ce0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
20cf0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
20d00 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
20d10 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
20d20 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
20d30 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
20d40 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
20d50 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
20d60 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
20d70 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
20d80 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  n);.      pBt->b
20d90 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
20da0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
20db0 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20   = nFin;.    }. 
20dc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20dd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
20de0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
20df0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
20e00 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
20e10 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61   nRef>=sqlite3Pa
20e20 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
20e30 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
20e40 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
20e50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20e60 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
20e70 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
20e80 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
20e90 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23  ITE_OK.#endif..#
20ea0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20eb0 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a  IT_CONCURRENT./*
20ec0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20ed0 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  n is called as p
20ee0 61 72 74 20 6f 66 20 6d 65 72 67 69 6e 67 20 61  art of merging a
20ef0 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61  n CONCURRENT tra
20f00 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 0a 2a 2a  nsaction with.**
20f10 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 61 74   the snapshot at
20f20 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65   the head of the
20f30 20 77 61 6c 20 66 69 6c 65 2e 20 49 74 20 72 65   wal file. It re
20f40 6c 6f 63 61 74 65 73 20 61 6c 6c 20 70 61 67 65  locates all page
20f50 73 20 69 6e 20 74 68 65 0a 2a 2a 20 72 61 6e 67  s in the.** rang
20f60 65 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c  e iFirst..iLast,
20f70 20 69 6e 63 6c 75 73 69 76 65 2e 20 49 74 20 69   inclusive. It i
20f80 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
20f90 68 65 20 42 74 72 65 65 50 74 72 6d 61 70 20 0a  he BtreePtrmap .
20fa0 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61 74 20  ** structure at 
20fb0 42 74 53 68 61 72 65 64 2e 70 4d 61 70 20 63 6f  BtShared.pMap co
20fc0 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 63 61 74  ntains the locat
20fd0 69 6f 6e 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ion of the point
20fe0 65 72 73 20 74 6f 20 65 61 63 68 0a 2a 2a 20 70  ers to each.** p
20ff0 61 67 65 20 69 6e 20 74 68 65 20 72 61 6e 67 65  age in the range
21000 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e 43 75 72  ..**.** If pnCur
21010 72 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  rent is NULL, th
21020 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20  en all pages in 
21030 74 68 65 20 72 61 6e 67 65 20 61 72 65 20 6d 6f  the range are mo
21040 76 65 64 20 74 6f 20 63 75 72 72 65 6e 74 6c 79  ved to currently
21050 0a 2a 2a 20 66 72 65 65 20 6c 6f 63 61 74 69 6f  .** free locatio
21060 6e 73 20 28 69 2e 65 2e 20 66 72 65 65 2d 6c 69  ns (i.e. free-li
21070 73 74 20 65 6e 74 72 69 65 73 29 20 77 69 74 68  st entries) with
21080 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
21090 66 69 6c 65 20 62 65 66 6f 72 65 20 70 61 67 65  file before page
210a0 0a 2a 2a 20 69 46 69 72 73 74 2e 0a 2a 2a 0a 2a  .** iFirst..**.*
210b0 2a 20 4f 72 2c 20 69 66 20 70 6e 43 75 72 72 65  * Or, if pnCurre
210c0 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
210d0 74 68 65 6e 20 69 74 20 70 6f 69 6e 74 73 20 74  then it points t
210e0 6f 20 61 20 76 61 6c 75 65 20 63 6f 6e 74 61 69  o a value contai
210f0 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 63 75 72 72  ning the.** curr
21100 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
21110 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
21120 20 70 61 67 65 73 2e 20 49 6e 20 74 68 69 73 20   pages. In this 
21130 63 61 73 65 2c 20 61 6c 6c 20 70 61 67 65 73 20  case, all pages 
21140 61 72 65 0a 2a 2a 20 72 65 6c 6f 63 61 74 65 64  are.** relocated
21150 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
21160 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21170 20 2d 20 70 61 67 65 20 69 46 69 72 73 74 20 69   - page iFirst i
21180 73 20 72 65 6c 6f 63 61 74 65 64 20 74 6f 0a 2a  s relocated to.*
21190 2a 20 70 61 67 65 20 28 2a 70 6e 43 75 72 72 65  * page (*pnCurre
211a0 6e 74 2b 31 29 2c 20 70 61 67 65 20 69 46 69 72  nt+1), page iFir
211b0 73 74 2b 31 20 74 6f 20 70 61 67 65 20 28 2a 70  st+1 to page (*p
211c0 6e 43 75 72 72 65 6e 74 2b 32 29 2c 20 61 6e 64  nCurrent+2), and
211d0 20 73 6f 20 6f 6e 2e 0a 2a 2a 20 56 61 6c 75 65   so on..** Value
211e0 20 2a 70 6e 43 75 72 72 65 6e 74 20 69 73 20 73   *pnCurrent is s
211f0 65 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73 69  et to the new si
21200 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
21210 73 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a  se before this .
21220 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
21230 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  rns..**.** If no
21240 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
21250 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
21260 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
21270 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
21280 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
21290 20 69 6e 74 20 62 74 72 65 65 52 65 6c 6f 63 61   int btreeReloca
212a0 74 65 52 61 6e 67 65 28 0a 20 20 42 74 53 68 61  teRange(.  BtSha
212b0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
212c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 2d             /* B-
212d0 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  tree handle */. 
212e0 20 50 67 6e 6f 20 69 46 69 72 73 74 2c 20 20 20   Pgno iFirst,   
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21300 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 74   /* First page t
21310 6f 20 72 65 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o relocate */.  
21320 50 67 6e 6f 20 69 4c 61 73 74 2c 20 20 20 20 20  Pgno iLast,     
21330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21340 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 74 6f 20  /* Last page to 
21350 72 65 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 50 67  relocate */.  Pg
21360 6e 6f 20 2a 70 6e 43 75 72 72 65 6e 74 20 20 20  no *pnCurrent   
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21380 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 49 4e   If not NULL, IN
21390 2f 4f 55 54 3a 20 44 61 74 61 62 61 73 65 20 73  /OUT: Database s
213a0 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ize */.){.  int 
213b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
213c0 20 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70    BtreePtrmap *p
213d0 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b  Map = pBt->pMap;
213e0 0a 20 20 50 67 6e 6f 20 69 50 67 3b 0a 0a 20 20  .  Pgno iPg;..  
213f0 66 6f 72 28 69 50 67 3d 69 46 69 72 73 74 3b 20  for(iPg=iFirst; 
21400 69 50 67 3c 3d 69 4c 61 73 74 20 26 26 20 72 63  iPg<=iLast && rc
21410 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 50 67  ==SQLITE_OK; iPg
21420 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
21430 20 2a 70 46 72 65 65 20 3d 20 30 3b 20 20 20 20   *pFree = 0;    
21440 20 2f 2a 20 50 61 67 65 20 61 6c 6c 6f 63 61 74   /* Page allocat
21450 65 64 20 66 72 6f 6d 20 66 72 65 65 2d 6c 69 73  ed from free-lis
21460 74 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  t */.    MemPage
21470 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 50   *pPg = 0;.    P
21480 67 6e 6f 20 69 4e 65 77 3b 20 20 20 20 20 20 20  gno iNew;       
21490 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61         /* New pa
214a0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50  ge number for pP
214b0 67 20 2a 2f 0a 20 20 20 20 50 74 72 6d 61 70 45  g */.    PtrmapE
214c0 6e 74 72 79 20 2a 70 45 6e 74 72 79 3b 20 20 20  ntry *pEntry;   
214d0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
214e0 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 69  entry for page i
214f0 50 67 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 69  Pg */..    if( i
21500 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
21510 5f 50 41 47 45 28 70 42 74 29 20 29 20 63 6f 6e  _PAGE(pBt) ) con
21520 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 6e 74 72  tinue;.    pEntr
21530 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72 5b  y = &pMap->aPtr[
21540 69 50 67 20 2d 20 70 4d 61 70 2d 3e 69 46 69 72  iPg - pMap->iFir
21550 73 74 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 45  st];..    if( pE
21560 6e 74 72 79 2d 3e 65 54 79 70 65 3d 3d 50 54 52  ntry->eType==PTR
21570 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
21580 20 20 20 20 20 20 50 67 6e 6f 20 64 75 6d 6d 79        Pgno dummy
21590 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  ;.      rc = all
215a0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
215b0 42 74 2c 20 26 70 46 72 65 65 2c 20 26 64 75 6d  Bt, &pFree, &dum
215c0 6d 79 2c 20 69 50 67 2c 20 42 54 41 4c 4c 4f 43  my, iPg, BTALLOC
215d0 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 72  _EXACT);.      r
215e0 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
215f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21600 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
21610 7c 20 64 75 6d 6d 79 3d 3d 69 50 67 20 29 3b 0a  | dummy==iPg );.
21620 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 6e      }else if( pn
21630 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20 20  Current ){.     
21640 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
21650 74 2c 20 69 50 67 2c 20 26 70 50 67 2c 20 30 29  t, iPg, &pPg, 0)
21660 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
21670 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
21680 69 74 65 61 62 6c 65 28 70 50 67 2d 3e 70 44 62  iteable(pPg->pDb
21690 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 61  Page) );.      a
216a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
216b0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
216c0 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3d 3d 31  pPg->pDbPage)==1
216d0 20 29 3b 0a 20 20 20 20 20 20 69 4e 65 77 20 3d   );.      iNew =
216e0 20 2b 2b 28 2a 70 6e 43 75 72 72 65 6e 74 29 3b   ++(*pnCurrent);
216f0 0a 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3d  .      if( iNew=
21700 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
21710 47 45 28 70 42 74 29 20 29 20 69 4e 65 77 20 3d  GE(pBt) ) iNew =
21720 20 2b 2b 28 2a 70 6e 43 75 72 72 65 6e 74 29 3b   ++(*pnCurrent);
21730 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
21740 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 50  catePage(pBt, pP
21750 67 2c 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65  g, pEntry->eType
21760 2c 20 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74  , pEntry->parent
21770 2c 20 69 4e 65 77 2c 20 31 29 3b 0a 20 20 20 20  , iNew, 1);.    
21780 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
21790 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d  Null(pPg);.    }
217a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
217b0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
217c0 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 2c 20  ge(pBt, &pFree, 
217d0 26 69 4e 65 77 2c 20 69 46 69 72 73 74 2d 31 2c  &iNew, iFirst-1,
217e0 20 42 54 41 4c 4c 4f 43 5f 4c 45 29 3b 0a 20 20   BTALLOC_LE);.  
217f0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21800 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 4e 65  SQLITE_OK || iNe
21810 77 3c 69 46 69 72 73 74 20 29 3b 0a 20 20 20 20  w<iFirst );.    
21820 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21830 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  _OK ){.        M
21840 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
21850 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
21860 50 61 67 65 28 70 46 72 65 65 29 3b 0a 20 20 20  Page(pFree);.   
21870 20 20 20 20 20 62 74 72 65 65 47 65 74 50 61 67       btreeGetPag
21880 65 28 70 42 74 2c 20 69 50 67 2c 20 26 70 50 67  e(pBt, iPg, &pPg
21890 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , 0);.        rc
218a0 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
218b0 70 42 74 2c 20 70 50 67 2c 20 70 45 6e 74 72 79  pBt, pPg, pEntry
218c0 2d 3e 65 54 79 70 65 2c 20 70 45 6e 74 72 79 2d  ->eType, pEntry-
218d0 3e 70 61 72 65 6e 74 2c 69 4e 65 77 2c 31 29 3b  >parent,iNew,1);
218e0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
218f0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
21900 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
21910 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
21920 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
21930 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29  OMIT_CONCURRENT)
21940 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 2d 74 72 65  .**.** The b-tre
21950 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  e handle passed 
21960 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
21970 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f  ment is about to
21980 20 63 6f 6d 6d 69 74 20 61 6e 0a 2a 2a 20 43 4f   commit an.** CO
21990 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61 63  NCURRENT transac
219a0 74 69 6f 6e 2e 20 41 74 20 74 68 69 73 20 70 6f  tion. At this po
219b0 69 6e 74 20 69 74 20 69 73 20 67 75 61 72 61 6e  int it is guaran
219c0 74 65 65 64 20 74 68 61 74 20 74 68 69 73 20 69  teed that this i
219d0 73 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 2d  s .** possible -
219e0 20 74 68 65 20 77 61 6c 20 57 52 49 54 45 52 20   the wal WRITER 
219f0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 61 6e 64  lock is held and
21a00 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 68 61   it is known tha
21a10 74 20 74 68 65 72 65 20 61 72 65 20 0a 2a 2a 20  t there are .** 
21a20 6e 6f 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74  no conflicts wit
21a30 68 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  h committed tran
21a40 73 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  sactions..*/.sta
21a50 74 69 63 20 69 6e 74 20 62 74 72 65 65 46 69 78  tic int btreeFix
21a60 55 6e 6c 6f 63 6b 65 64 28 42 74 72 65 65 20 2a  Unlocked(Btree *
21a70 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
21a80 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
21a90 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
21aa0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
21ab0 20 75 38 20 2a 70 31 20 3d 20 70 50 61 67 65 31   u8 *p1 = pPage1
21ac0 2d 3e 61 44 61 74 61 3b 0a 20 20 50 61 67 65 72  ->aData;.  Pager
21ad0 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
21ae0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
21af0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
21b00 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 6f 66   /* If page 1 of
21b10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
21b20 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74   not writable, t
21b30 68 65 6e 20 6e 6f 20 70 61 67 65 73 20 77 65 72  hen no pages wer
21b40 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a  e allocated.  **
21b50 20 6f 72 20 66 72 65 65 64 20 62 79 20 74 68 69   or freed by thi
21b60 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  s transaction. I
21b70 6e 20 74 68 69 73 20 63 61 73 65 20 6e 6f 20 73  n this case no s
21b80 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20  pecial handling 
21b90 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
21ba0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
21bb0 20 70 61 67 65 20 31 20 69 73 20 64 69 72 74 79   page 1 is dirty
21bc0 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20  , proceed.  */. 
21bd0 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d   BtreePtrmap *pM
21be0 61 70 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a  ap = pBt->pMap;.
21bf0 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
21c00 67 65 74 34 62 79 74 65 28 26 70 31 5b 33 32 5d  get4byte(&p1[32]
21c10 29 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 20  );.  Pgno nPage 
21c20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
21c30 28 70 42 74 29 3b 0a 20 20 75 33 32 20 6e 46 72  (pBt);.  u32 nFr
21c40 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
21c50 31 5b 33 36 5d 29 3b 0a 0a 20 20 61 73 73 65 72  1[36]);..  asser
21c60 74 28 20 70 42 74 2d 3e 70 4d 61 70 20 29 3b 0a  t( pBt->pMap );.
21c70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21c80 67 65 72 55 70 67 72 61 64 65 53 6e 61 70 73 68  gerUpgradeSnapsh
21c90 6f 74 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ot(pPager, pPage
21ca0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 61  1->pDbPage);.  a
21cb0 73 73 65 72 74 28 20 70 31 3d 3d 70 50 61 67 65  ssert( p1==pPage
21cc0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69  1->aData );..  i
21cd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21ce0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 48 50   ){.    Pgno nHP
21cf0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
21d00 70 31 5b 32 38 5d 29 3b 0a 20 20 20 20 50 67 6e  p1[28]);.    Pgn
21d10 6f 20 6e 46 69 6e 20 3d 20 6e 48 50 61 67 65 3b  o nFin = nHPage;
21d20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
21d30 20 6f 66 20 64 62 20 61 66 74 65 72 20 74 72 61   of db after tra
21d40 6e 73 61 63 74 69 6f 6e 20 6d 65 72 67 65 20 2a  nsaction merge *
21d50 2f 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  /..    if( sqlit
21d60 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
21d70 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
21d80 67 65 29 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  ge) ){.      Pgn
21d90 6f 20 69 48 54 72 75 6e 6b 20 3d 20 67 65 74 34  o iHTrunk = get4
21da0 62 79 74 65 28 26 70 31 5b 33 32 5d 29 3b 0a 20  byte(&p1[32]);. 
21db0 20 20 20 20 20 75 33 32 20 6e 48 46 72 65 65 20       u32 nHFree 
21dc0 3d 20 67 65 74 34 62 79 74 65 28 26 70 31 5b 33  = get4byte(&p1[3
21dd0 36 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41  6]);..      /* A
21de0 74 74 61 63 68 20 74 68 65 20 68 65 61 64 20 64  ttach the head d
21df0 61 74 61 62 61 73 65 20 66 72 65 65 20 6c 69 73  atabase free lis
21e00 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
21e10 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
21e20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
21e30 73 20 66 72 65 65 2d 6c 69 73 74 20 28 69 66 20  s free-list (if 
21e40 61 6e 79 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20  any).  */.      
21e50 69 66 28 20 69 54 72 75 6e 6b 21 3d 30 20 29 7b  if( iTrunk!=0 ){
21e60 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
21e70 65 28 26 70 31 5b 33 36 5d 2c 20 6e 48 46 72 65  e(&p1[36], nHFre
21e80 65 20 2b 20 6e 46 72 65 65 29 3b 0a 20 20 20 20  e + nFree);.    
21e90 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 31      put4byte(&p1
21ea0 5b 33 32 5d 2c 20 69 54 72 75 6e 6b 29 3b 0a 20  [32], iTrunk);. 
21eb0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 54         while( iT
21ec0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
21ed0 20 20 44 62 50 61 67 65 20 2a 70 54 72 75 6e 6b    DbPage *pTrunk
21ee0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
21ef0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 54  ookup(pPager, iT
21f00 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
21f10 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
21f20 74 65 28 28 75 38 2a 29 70 54 72 75 6e 6b 2d 3e  te((u8*)pTrunk->
21f30 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
21f40 20 20 69 66 28 20 69 54 72 75 6e 6b 3d 3d 30 20    if( iTrunk==0 
21f50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
21f60 75 74 34 62 79 74 65 28 28 75 38 2a 29 70 54 72  ut4byte((u8*)pTr
21f70 75 6e 6b 2d 3e 70 44 61 74 61 2c 20 69 48 54 72  unk->pData, iHTr
21f80 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
21f90 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
21fa0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 54  te3PagerUnref(pT
21fb0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d  runk);.        }
21fc0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
21fd0 20 69 66 28 20 6e 48 50 61 67 65 3c 28 70 4d 61   if( nHPage<(pMa
21fe0 70 2d 3e 69 46 69 72 73 74 2d 31 29 20 29 7b 0a  p->iFirst-1) ){.
21ff0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
22000 61 74 61 62 61 73 65 20 63 6f 6e 73 69 73 74 65  atabase consiste
22010 64 20 6f 66 20 28 70 4d 61 70 2d 3e 69 46 69 72  d of (pMap->iFir
22020 73 74 2d 31 29 20 70 61 67 65 73 20 77 68 65 6e  st-1) pages when
22030 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20   the current.   
22040 20 20 20 20 20 2a 2a 20 63 6f 6e 63 75 72 72 65       ** concurre
22050 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
22060 61 73 20 6f 70 65 6e 65 64 2e 20 41 6e 64 20 61  as opened. And a
22070 6e 20 63 6f 6e 63 75 72 72 65 6e 74 20 74 72 61  n concurrent tra
22080 6e 73 61 63 74 69 6f 6e 20 6d 61 79 0a 20 20 20  nsaction may.   
22090 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 65       ** not be e
220a0 78 65 63 75 74 65 64 20 6f 6e 20 61 6e 20 61 75  xecuted on an au
220b0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
220c0 73 65 20 2d 20 73 6f 20 74 68 65 20 64 62 20 73  se - so the db s
220d0 68 6f 75 6c 64 20 0a 20 20 20 20 20 20 20 20 2a  hould .        *
220e0 2a 20 6e 6f 74 20 68 61 76 65 20 73 68 72 75 6e  * not have shrun
220f0 6b 20 73 69 6e 63 65 20 74 68 65 20 74 72 61 6e  k since the tran
22100 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
22110 65 64 2e 20 54 68 65 72 65 66 6f 72 65 20 6e 48  ed. Therefore nH
22120 50 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  Page.        ** 
22130 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f  should be set to
22140 20 28 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31   (pMap->iFirst-1
22150 29 20 6f 72 20 67 72 65 61 74 65 72 2e 20 2a 2f  ) or greater. */
22160 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
22170 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
22180 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
22190 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
221a0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
221b0 6f 6e 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  on allocated pag
221c0 65 73 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 20  es pMap->iFirst 
221d0 74 68 72 6f 75 67 68 0a 20 20 20 20 20 20 20 20  through.        
221e0 2a 2a 20 6e 50 61 67 65 20 28 69 6e 63 6c 75 73  ** nPage (inclus
221f0 69 76 65 29 20 61 74 20 74 68 65 20 65 6e 64 20  ive) at the end 
22200 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
22210 66 69 6c 65 2e 20 4d 65 61 6e 77 68 69 6c 65 2c  file. Meanwhile,
22220 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  .        ** othe
22230 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 68  r transactions h
22240 61 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 28 69  ave allocated (i
22250 46 69 72 73 74 2e 2e 6e 48 50 61 67 65 29 2e 20  First..nHPage). 
22260 53 6f 20 6d 6f 76 65 0a 20 20 20 20 20 20 20 20  So move.        
22270 2a 2a 20 70 61 67 65 73 20 28 69 46 69 72 73 74  ** pages (iFirst
22280 2e 2e 4d 49 4e 28 6e 50 61 67 65 2c 6e 48 50 61  ..MIN(nPage,nHPa
22290 67 65 29 29 20 74 6f 20 28 4d 41 58 28 6e 50 61  ge)) to (MAX(nPa
222a0 67 65 2c 6e 48 50 61 67 65 29 2b 31 29 2e 20 20  ge,nHPage)+1).  
222b0 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
222c0 69 4c 61 73 74 20 3d 20 4d 49 4e 28 6e 50 61 67  iLast = MIN(nPag
222d0 65 2c 20 6e 48 50 61 67 65 29 3b 20 20 20 20 2f  e, nHPage);    /
222e0 2a 20 4c 61 73 74 20 70 61 67 65 20 74 6f 20 6d  * Last page to m
222f0 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 50  ove */.        P
22300 67 6e 6f 20 6e 43 75 72 72 65 6e 74 3b 20 20 20  gno nCurrent;   
22310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22320 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
22330 7a 65 20 6f 66 20 64 62 20 2a 2f 0a 20 20 20 20  ze of db */.    
22340 20 20 20 20 6e 43 75 72 72 65 6e 74 20 3d 20 4d      nCurrent = M
22350 41 58 28 6e 50 61 67 65 2c 20 6e 48 50 61 67 65  AX(nPage, nHPage
22360 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
22370 62 74 72 65 65 52 65 6c 6f 63 61 74 65 52 61 6e  btreeRelocateRan
22380 67 65 28 70 42 74 2c 20 70 4d 61 70 2d 3e 69 46  ge(pBt, pMap->iF
22390 69 72 73 74 2c 20 69 4c 61 73 74 2c 20 26 6e 43  irst, iLast, &nC
223a0 75 72 72 65 6e 74 29 3b 0a 0a 20 20 20 20 20 20  urrent);..      
223b0 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
223c0 6f 77 20 6e 6f 20 63 6f 6c 6c 69 73 69 6f 6e 73  ow no collisions
223d0 20 77 69 74 68 20 74 68 65 20 73 6e 61 70 73 68   with the snapsh
223e0 6f 74 20 61 74 20 74 68 65 20 68 65 61 64 20 6f  ot at the head o
223f0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
22400 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
22410 53 6f 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  So at this point
22420 20 69 74 20 77 6f 75 6c 64 20 62 65 20 70 6f 73   it would be pos
22430 73 69 62 6c 65 20 74 6f 20 77 72 69 74 65 0a 20  sible to write. 
22440 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 72         ** the tr
22450 61 6e 73 61 63 74 69 6f 6e 20 6f 75 74 20 74 6f  ansaction out to
22460 20 64 69 73 6b 2e 20 42 65 66 6f 72 65 20 64 6f   disk. Before do
22470 69 6e 67 20 73 6f 20 74 68 6f 75 67 68 2c 20 61  ing so though, a
22480 74 74 65 6d 70 74 20 74 6f 0a 20 20 20 20 20 20  ttempt to.      
22490 20 20 2a 2a 20 72 65 6c 6f 63 61 74 65 20 73 6f    ** relocate so
224a0 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 70 61  me of the new pa
224b0 67 65 73 20 74 6f 20 66 72 65 65 20 6c 6f 63 61  ges to free loca
224c0 74 69 6f 6e 73 20 77 69 74 68 69 6e 20 74 68 65  tions within the
224d0 20 62 6f 64 79 0a 20 20 20 20 20 20 20 20 2a 2a   body.        **
224e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
224f0 20 66 69 6c 65 20 28 69 2e 65 2e 20 66 72 65 65   file (i.e. free
22500 2d 6c 69 73 74 20 65 6e 74 72 69 65 73 29 2e 20  -list entries). 
22510 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  */.        if( r
22520 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22530 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
22540 28 20 6e 43 75 72 72 65 6e 74 21 3d 50 45 4e 44  ( nCurrent!=PEND
22550 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
22560 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t) );.          
22570 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 44  sqlite3PagerSetD
22580 62 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  bsize(pBt->pPage
22590 72 2c 20 6e 43 75 72 72 65 6e 74 29 3b 0a 20 20  r, nCurrent);.  
225a0 20 20 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20          nFree = 
225b0 67 65 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d  get4byte(&p1[36]
225c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 46 69  );.          nFi
225d0 6e 20 3d 20 6e 43 75 72 72 65 6e 74 2d 6e 46 72  n = nCurrent-nFr
225e0 65 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ee;.          if
225f0 28 20 6e 43 75 72 72 65 6e 74 3e 50 45 4e 44 49  ( nCurrent>PENDI
22600 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
22610 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49  ) && nFin<=PENDI
22620 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
22630 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
22640 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 20   nFin--;.       
22650 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6e     }.          n
22660 46 69 6e 20 3d 20 4d 41 58 28 6e 46 69 6e 2c 20  Fin = MAX(nFin, 
22670 6e 48 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  nHPage);.       
22680 20 20 20 72 63 20 3d 20 62 74 72 65 65 52 65 6c     rc = btreeRel
22690 6f 63 61 74 65 52 61 6e 67 65 28 70 42 74 2c 20  ocateRange(pBt, 
226a0 6e 46 69 6e 2b 31 2c 20 6e 43 75 72 72 65 6e 74  nFin+1, nCurrent
226b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
226c0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
226d0 65 28 26 70 31 5b 32 38 5d 2c 20 6e 46 69 6e 29  e(&p1[28], nFin)
226e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
226f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
22700 53 65 74 44 62 73 69 7a 65 28 70 50 61 67 65 72  SetDbsize(pPager
22710 2c 20 6e 46 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20  , nFin);.  }..  
22720 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c  return rc;.}.#el
22730 73 65 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65  se.# define btre
22740 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28 58 29 20  eFixUnlocked(X) 
22750 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
22760 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
22770 5f 43 4f 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 0a  _CONCURRENT */..
22780 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
22790 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
227a0 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f  t phase of a two
227b0 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
227c0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
227d0 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  causes a rollbac
227e0 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  k journal to be 
227f0 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64  created (if it d
22800 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
22810 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f  exist).** and po
22820 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f  pulated with eno
22830 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ugh information 
22840 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  so that if a pow
22850 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a  er loss occurs.*
22860 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
22870 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  an be restored t
22880 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
22890 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20  tate by playing 
228a0 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  back.** the jour
228b0 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63  nal.  Then the c
228c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a  ontents of the j
228d0 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68  ournal are flush
228e0 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65  ed out to.** the
228f0 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68   disk.  After th
22900 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66  e journal is saf
22910 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68  ely on oxide, th
22920 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
22930 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65  .** database are
22940 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
22950 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22960 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f  and flushed to o
22970 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20  xide..** At the 
22980 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  end of this call
22990 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  , the rollback j
229a0 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69  ournal still exi
229b0 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69  sts on the.** di
229c0 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74  sk and we are st
229d0 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ill holding all 
229e0 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72  locks, so the tr
229f0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f  ansaction has no
22a00 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20  t.** committed. 
22a10 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65   See sqlite3Btre
22a20 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
22a30 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
22a40 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
22a50 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
22a60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
22a70 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
22a80 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
22a90 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
22aa0 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
22ab0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
22ac0 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
22ad0 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
22ae0 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
22af0 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
22b00 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
22b10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
22b20 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
22b30 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
22b40 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
22b50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
22b60 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
22b70 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
22b80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
22b90 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
22ba0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
22bb0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
22bc0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
22bd0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
22be0 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
22bf0 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
22c00 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
22c10 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
22c20 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
22c30 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
22c40 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
22c50 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
22c60 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
22c70 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
22c80 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
22c90 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
22ca0 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
22cb0 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
22cc0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
22cd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
22ce0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
22cf0 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
22d00 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
22d10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22d20 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
22d30 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
22d40 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
22d50 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
22d60 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
22d70 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a 23  treeEnter(p);..#
22d80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22d90 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
22da0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
22db0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 61  acuum ){.      a
22dc0 73 73 65 72 74 28 20 49 53 43 4f 4e 43 55 52 52  ssert( ISCONCURR
22dd0 45 4e 54 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ENT==0 );.      
22de0 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
22df0 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20  ommit(pBt);.    
22e00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22e10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
22e20 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
22e30 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
22e40 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
22e50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
22e60 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29  t->bDoTruncate )
22e70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
22e80 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
22e90 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
22ea0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
22eb0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
22ec0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22ed0 26 20 49 53 43 4f 4e 43 55 52 52 45 4e 54 20 29  & ISCONCURRENT )
22ee0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  {.      rc = btr
22ef0 65 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28 70 29  eeFixUnlocked(p)
22f00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22f10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22f20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
22f30 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
22f40 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
22f50 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
22f60 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
22f70 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
22f80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
22f90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
22fa0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
22fb0 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72  ed from both Btr
22fc0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
22fd0 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c  () and BtreeRoll
22fe0 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65  back().** at the
22ff0 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61   conclusion of a
23000 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
23010 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
23020 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
23030 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
23040 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
23050 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  >pBt;.  sqlite3 
23060 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61  *db = p->db;.  a
23070 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
23080 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
23090 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
230a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
230b0 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72  UUM.  pBt->bDoTr
230c0 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64  uncate = 0;.#end
230d0 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  if.  if( p->inTr
230e0 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  ans>TRANS_NONE &
230f0 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  & db->nVdbeRead>
23100 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  1 ){.    /* If t
23110 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61  here are other a
23120 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
23130 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
23140 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20  this database.  
23150 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77    ** handle, dow
23160 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64  ngrade to a read
23170 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
23180 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61  n. The other sta
23190 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d  tements.    ** m
231a0 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
231b0 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
231c0 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64  abase.  */.    d
231d0 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
231e0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
231f0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72  (p);.    p->inTr
23200 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ans = TRANS_READ
23210 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
23220 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
23230 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  had any kind of 
23240 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
23250 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20  , decrement the 
23260 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
23270 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  ion count of the
23280 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
23290 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
232a0 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20  n count .    ** 
232b0 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74  reaches 0, set t
232c0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
232d0 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
232e0 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
232f0 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20  Unused().    ** 
23300 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20  call below will 
23310 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
23320 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  .  */.    if( p-
23330 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
23340 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c  NONE ){.      cl
23350 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
23360 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
23370 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
23380 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20  saction--;.     
23390 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
233a0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
233b0 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
233c0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
233d0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NONE;.      }.  
233e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
233f0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
23400 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
23410 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
23420 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20  unlock the .    
23430 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73  ** pager if this
23440 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
23450 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
23460 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
23470 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72    */.    p->inTr
23480 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
23490 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  ;.    unlockBtre
234a0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
234b0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
234c0 73 20 77 61 73 20 61 6e 20 43 4f 4e 43 55 52 52  s was an CONCURR
234d0 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ENT transaction,
234e0 20 64 65 6c 65 74 65 20 74 68 65 20 70 42 74 2d   delete the pBt-
234f0 3e 70 4d 61 70 20 6f 62 6a 65 63 74 2e 0a 20 20  >pMap object..  
23500 2a 2a 20 41 6c 73 6f 20 63 61 6c 6c 20 50 61 67  ** Also call Pag
23510 65 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28  erEndConcurrent(
23520 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  ) to ensure that
23530 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 64   the pager has d
23540 69 73 63 61 72 64 65 64 0a 20 20 2a 2a 20 74 68  iscarded.  ** th
23550 65 20 72 65 63 6f 72 64 20 6f 66 20 61 6c 6c 20  e record of all 
23560 70 61 67 65 73 20 72 65 61 64 20 77 69 74 68 69  pages read withi
23570 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
23580 6e 2e 20 20 2a 2f 0a 20 20 62 74 72 65 65 50 74  n.  */.  btreePt
23590 72 6d 61 70 44 65 6c 65 74 65 28 70 42 74 29 3b  rmapDelete(pBt);
235a0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 45  .  sqlite3PagerE
235b0 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28 70 42 74  ndConcurrent(pBt
235c0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 62 74 72  ->pPager);.  btr
235d0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
235e0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
235f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
23600 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
23610 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
23620 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
23630 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
23640 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
23650 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
23660 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
23670 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
23680 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
23690 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64   first phase and
236a0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e   should.** be in
236b0 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63  voked prior to c
236c0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
236d0 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ine.  The sqlite
236e0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
236f0 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  eOne().** routin
23700 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f  e did all the wo
23710 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e  rk of writing in
23720 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f  formation out to
23730 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69   disk and flushi
23740 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
23750 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ts so that they 
23760 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f  are written onto
23770 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65   the disk platte
23780 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20  r.  All this.** 
23790 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64  routine has to d
237a0 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74  o is delete or t
237b0 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
237c0 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68  the header in th
237d0 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  e.** the rollbac
237e0 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68  k journal (which
237f0 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e   causes the tran
23800 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69  saction to commi
23810 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c  t) and.** drop l
23820 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  ocks..**.** Norm
23830 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
23840 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
23850 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69  he pager layer i
23860 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
23870 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65  .** finalize the
23880 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72   underlying jour
23890 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66  nal file, this f
238a0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
238b0 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20  an error and.** 
238c0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
238d0 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72  will attempt a r
238e0 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72  ollback. However
238f0 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  , if the second 
23900 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e  argument.** is n
23910 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69  on-zero then thi
23920 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63  s b-tree transac
23930 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
23940 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a  a multi-file .**
23950 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
23960 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
23970 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
23980 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d  already been com
23990 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64  mitted .** (by d
239a0 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72  eleting a master
239b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
239c0 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  nd the caller wi
239d0 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a  ll ignore this .
239e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  ** functions ret
239f0 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76  urn code. So, ev
23a00 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
23a10 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67  ccurs in the pag
23a20 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73  er layer,.** res
23a30 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  et the b-tree ob
23a40 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73  jects internal s
23a50 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65  tate to indicate
23a60 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a   that the write.
23a70 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  ** transaction h
23a80 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20  as been closed. 
23a90 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61  This is quite sa
23aa0 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72  fe, as the pager
23ab0 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72   will have.** tr
23ac0 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68  ansitioned to th
23ad0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  e error state..*
23ae0 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
23af0 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
23b00 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
23b10 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
23b20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
23b30 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
23b40 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
23b50 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
23b60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
23b70 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
23b80 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  o(Btree *p, int 
23b90 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66  bCleanup){..  if
23ba0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
23bb0 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72  ANS_NONE ) retur
23bc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  n SQLITE_OK;.  s
23bd0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
23be0 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
23bf0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
23c00 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
23c10 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
23c20 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
23c30 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
23c40 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
23c50 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
23c60 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
23c70 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
23c80 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
23c90 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
23ca0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
23cb0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
23cc0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
23cd0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
23ce0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
23cf0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
23d00 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
23d10 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
23d20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
23d30 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
23d40 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
23d50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
23d60 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e  ITE_OK && bClean
23d70 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  up==0 ){.      s
23d80 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
23d90 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
23da0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
23db0 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d  p->iDataVersion-
23dc0 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74  -;  /* Compensat
23dd0 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44  e for pPager->iD
23de0 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f  ataVersion++; */
23df0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
23e00 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
23e10 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
23e20 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
23e30 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
23e40 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
23e50 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
23e60 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
23e70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23e80 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
23e90 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
23ea0 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
23eb0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
23ec0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
23ed0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
23ee0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
23ef0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
23f00 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
23f10 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
23f20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23f30 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
23f40 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
23f50 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  p, 0);.  }.  sql
23f60 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
23f70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
23f80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
23f90 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
23fa0 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
23fb0 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
23fc0 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
23fd0 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
23fe0 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74  cursor on any Bt
23ff0 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
24000 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
24010 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69  .  Or if the wri
24020 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73  teOnly flag is s
24030 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e  et to 1, then on
24040 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65  ly.** trip write
24050 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61   cursors and lea
24060 76 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  ve read cursors 
24070 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
24080 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
24090 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
240a0 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c  be tripped, incl
240b0 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a  uding cursors.**
240c0 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
240d0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
240e0 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
240f0 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20  happen to be.** 
24100 73 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68  sharing the cach
24110 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a  e with pBtree..*
24120 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
24130 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68  e gets called wh
24140 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  en a rollback oc
24150 63 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69  curs. If the wri
24160 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69  teOnly.** flag i
24170 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c  s true, then onl
24180 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20  y write-cursors 
24190 6e 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20  need be tripped 
241a0 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63  - read-only.** c
241b0 75 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69  ursors save thei
241c0 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  r current positi
241d0 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ons so that they
241e0 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a   may continue .*
241f0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
24200 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66  rollback. Or, if
24210 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
24220 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  lse, all cursors
24230 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64   are .** tripped
24240 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72  . In general, wr
24250 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
24260 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
24270 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c  ion being.** rol
24280 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65  led back modifie
24290 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
242a0 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63  chema. In this c
242b0 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a  ase b-tree root.
242c0 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20  ** pages may be 
242d0 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64  moved or deleted
242e0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
242f0 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d  se altogether, m
24300 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61  aking.** it unsa
24310 66 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73  fe for read curs
24320 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  ors to continue.
24330 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72  .**.** If the wr
24340 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20  iteOnly flag is 
24350 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f  true and an erro
24360 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
24370 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e   while .** savin
24380 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  g the current po
24390 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64  sition of a read
243a0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c  -only cursor, al
243b0 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69  l cursors, .** i
243c0 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61  ncluding all rea
243d0 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72  d-cursors are tr
243e0 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ipped..**.** SQL
243f0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
24400 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
24410 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  , or if an error
24420 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a   occurs while.**
24430 20 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72   saving a cursor
24440 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51   position, an SQ
24450 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
24460 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
24470 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
24480 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
24490 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69  , int errCode, i
244a0 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20  nt writeOnly){. 
244b0 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
244c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
244d0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  OK;..  assert( (
244e0 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  writeOnly==0 || 
244f0 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26  writeOnly==1) &&
24500 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d   BTCF_WriteFlag=
24510 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72  =1 );.  if( pBtr
24520 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
24530 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
24540 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  ee);.    for(p=p
24550 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
24560 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
24570 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
24580 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74  ;.      if( writ
24590 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72  eOnly && (p->cur
245a0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
245b0 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20  teFlag)==0 ){.  
245c0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
245d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
245e0 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
245f0 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
24600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
24610 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
24620 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20  tion(p);.       
24630 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
24650 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
24660 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
24670 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c  sors(pBtree, rc,
24680 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
24690 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
246a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
246b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
246c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
246d0 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20  learCursor(p);. 
246e0 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
246f0 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
24700 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70  .        p->skip
24710 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
24720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
24730 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61  r(i=0; i<=p->iPa
24740 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
24750 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
24760 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
24770 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
24780 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
24790 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
247a0 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
247b0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
247c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
247d0 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
247e0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
247f0 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69  ss..**.** If tri
24800 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
24810 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73  ITE_OK then curs
24820 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ors will be inva
24830 6c 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64  lidated (tripped
24840 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  )..** Only write
24850 20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69   cursors are tri
24860 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
24870 79 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c  y is true but al
24880 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a  l cursors are.**
24890 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
248a0 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20  eOnly is false. 
248b0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
248c0 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64  use.** a tripped
248d0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73   cursor will res
248e0 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  ult in an error.
248f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
24900 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
24910 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
24920 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
24930 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
24940 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
24950 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
24960 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
24970 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24980 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
24990 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70  ree *p, int trip
249a0 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
249b0 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
249c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
249d0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
249e0 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
249f0 61 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c  assert( writeOnl
24a00 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==1 || writeOnl
24a10 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
24a20 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
24a30 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
24a40 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53  K || tripCode==S
24a50 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
24a60 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
24a70 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f  p);.  if( tripCo
24a80 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
24a90 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f  .    rc = tripCo
24aa0 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  de = saveAllCurs
24ab0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
24ac0 20 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69      if( rc ) wri
24ad0 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65  teOnly = 0;.  }e
24ae0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
24af0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
24b00 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20  f( tripCode ){. 
24b10 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c     int rc2 = sql
24b20 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
24b30 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43  Cursors(p, tripC
24b40 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b  ode, writeOnly);
24b50 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
24b60 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77  =SQLITE_OK || (w
24b70 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72  riteOnly==0 && r
24b80 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  c2==SQLITE_OK) )
24b90 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
24ba0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
24bb0 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65  rc2;.  }.  btree
24bc0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
24bd0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
24be0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
24bf0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
24c00 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
24c10 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
24c20 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
24c30 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
24c40 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
24c50 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
24c60 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
24c70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
24c80 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
24c90 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
24ca0 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
24cb0 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
24cc0 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
24cd0 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65     ** call btree
24ce0 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
24cf0 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
24d00 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
24d10 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
24d20 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
24d30 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65  .    if( btreeGe
24d40 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
24d50 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
24d60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
24d70 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  t nPage = get4by
24d80 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
24d90 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  1->aData);.     
24da0 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65   testcase( nPage
24db0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
24dc0 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69   nPage==0 ) sqli
24dd0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
24de0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
24df0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65  nPage);.      te
24e00 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61  stcase( pBt->nPa
24e10 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20  ge!=nPage );.   
24e20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
24e30 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c  nPage;.      rel
24e40 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
24e50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
24e60 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
24e70 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30  rsors(pBt, 1)==0
24e80 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   );.    pBt->inT
24e90 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
24ea0 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
24eb0 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
24ec0 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
24ed0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
24ee0 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
24ef0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
24f00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24f10 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
24f20 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
24f30 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
24f40 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65  ansaction can be
24f50 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
24f60 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
24f70 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
24f80 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20  ction. You must 
24f90 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
24fa0 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73  ion .** before s
24fb0 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
24fc0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
24fd0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
24fe0 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
24ff0 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d  lly .** if the m
25000 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ain transaction 
25010 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
25020 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61   back..**.** Sta
25030 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
25040 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
25050 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
25060 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
25070 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
25080 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
25090 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
250a0 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
250b0 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
250c0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
250d0 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
250e0 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
250f0 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
25100 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
25110 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
25120 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
25130 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
25140 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  ction..**.** A s
25150 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61  tatement sub-tra
25160 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  nsaction is impl
25170 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e  emented as an an
25180 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
25190 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  t. The.** value 
251a0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
251b0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
251c0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
251d0 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
251e0 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74  ,.** including t
251f0 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73  he new anonymous
25200 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e   savepoint, open
25210 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20   on the B-Tree. 
25220 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a  i.e. if there.**
25230 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
25240 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f  avepoints and no
25250 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
25260 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70  -transactions op
25270 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e  en,.** iStatemen
25280 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f  t is 1. This ano
25290 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
252a0 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
252b0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a   or rolled back.
252c0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
252d0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
252e0 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  nt() function..*
252f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
25300 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
25310 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65  e *p, int iState
25320 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ment){.  int rc;
25330 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
25340 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
25350 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
25360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
25370 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
25380 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
25390 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
253a0 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
253b0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
253c0 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ( iStatement>0 )
253d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
253e0 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53  tement>p->db->nS
253f0 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73  avepoint );.  as
25400 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
25410 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
25420 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74  WRITE );.  /* At
25430 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c   the pager level
25440 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
25450 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73  ansaction is a s
25460 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20  avepoint with.  
25470 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
25480 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
25490 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
254a0 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
254b0 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
254c0 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
254d0 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
254e0 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
254f0 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73   any.  ** such s
25500 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
25510 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
25520 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
25530 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
25540 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
25550 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
25560 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
25570 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
25580 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25590 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
255a0 74 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28  treePtrmapBegin(
255b0 70 42 74 2c 20 69 53 74 61 74 65 6d 65 6e 74 29  pBt, iStatement)
255c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
255d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
255e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
255f0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
25600 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
25610 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
25620 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
25630 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
25640 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
25650 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
25660 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
25670 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
25680 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
25690 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
256a0 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
256b0 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
256c0 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
256d0 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
256e0 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
256f0 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
25700 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
25710 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
25720 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
25730 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
25740 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
25750 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
25760 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
25770 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
25780 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
25790 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
257a0 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
257b0 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
257c0 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
257d0 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
257e0 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
257f0 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
25800 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
25810 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
25820 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
25830 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
25840 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
25850 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
25860 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25870 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
25880 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
25890 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
258a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
258b0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
258c0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
258d0 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
258e0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
258f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
25900 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
25910 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31   (iSavepoint==-1
25920 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
25930 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20  T_ROLLBACK) );. 
25940 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
25950 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 62 74 72  nter(p);.    btr
25960 65 65 50 74 72 6d 61 70 45 6e 64 28 70 42 74 2c  eePtrmapEnd(pBt,
25970 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
25980 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41  ;.    if( op==SA
25990 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
259a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
259b0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
259c0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 0, 0);.    }.
259d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
259e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
259f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25a00 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
25a10 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65  Pager, op, iSave
25a20 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  point);.    }.  
25a30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25a40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
25a50 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26   iSavepoint<0 &&
25a60 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
25a70 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  & BTS_INITIALLY_
25a80 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20  EMPTY)!=0 ){.   
25a90 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
25aa0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
25ab0 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
25ac0 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
25ad0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74  pBt->nPage = get
25ae0 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e  4byte(28 + pBt->
25af0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
25b00 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  .      /* The da
25b10 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
25b20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
25b30 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68   offset 28 of th
25b40 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a  e header.      *
25b50 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  * when the trans
25b60 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
25b70 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  so we know that 
25b80 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66  the value at off
25b90 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20  set.      ** 28 
25ba0 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20  is nonzero. */. 
25bb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
25bc0 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->nPage>0 );.   
25bd0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
25be0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
25bf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25c00 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
25c10 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
25c20 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
25c30 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
25c40 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66  ge.** iTable. If
25c50 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
25c60 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
25c70 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
25c80 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  that.** the call
25c90 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  er already has a
25ca0 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f  t least a read-o
25cb0 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
25cc0 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  open.** on the d
25cd0 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e  atabase already.
25ce0 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73   If a write-curs
25cf0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
25d00 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
25d10 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  ler is assumed t
25d20 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  o have an open w
25d30 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
25d40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42  ..**.** If the B
25d50 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 6f  TREE_WRCSR bit o
25d60 66 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65 61  f wrFlag is clea
25d70 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  r, then the curs
25d80 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62  or can only.** b
25d90 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
25da0 6e 67 2e 20 20 49 66 20 74 68 65 20 42 54 52 45  ng.  If the BTRE
25db0 45 5f 57 52 43 53 52 20 62 69 74 20 69 73 20 73  E_WRCSR bit is s
25dc0 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  et, then the cur
25dd0 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  sor.** can be us
25de0 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
25df0 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69 66  r for writing if
25e00 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
25e10 73 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  s for writing.**
25e20 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
25e30 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63 6f  These are the co
25e40 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
25e50 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
25e60 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e  er.** for writin
25e70 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a  g to be allowed:
25e80 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
25e90 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
25ea0 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
25eb0 20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69   wrFlag containi
25ec0 6e 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a  ng BTREE_WRCSR.*
25ed0 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
25ee0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
25ef0 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
25f00 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
25f10 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
25f20 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
25f30 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
25f40 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
25f50 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
25f60 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
25f70 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
25f80 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
25f90 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
25fa0 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
25fb0 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
25fc0 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
25fd0 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
25fe0 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
25ff0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
26000 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
26010 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
26020 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
26030 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
26040 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
26050 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
26060 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
26070 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
26080 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54  on..**.** The BT
26090 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62 69  REE_FORDELETE bi
260a0 74 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79 20  t of wrFlag may 
260b0 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65  optionally be se
260c0 74 20 69 66 20 42 54 52 45 45 5f 57 52 43 53 52  t if BTREE_WRCSR
260d0 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66 20  .** is set.  If 
260e0 46 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65 74  FORDELETE is set
260f0 2c 20 74 68 61 74 20 69 73 20 61 20 68 69 6e 74  , that is a hint
26100 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   to the implemen
26110 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74  tation that.** t
26120 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  his cursor will 
26130 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f 20  only be used to 
26140 73 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65  seek to and dele
26150 74 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61 6e  te entries of an
26160 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61 72   index.** as par
26170 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44 45  t of a larger DE
26180 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  LETE statement. 
26190 20 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20 68   The FORDELETE h
261a0 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  int is not used 
261b0 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65  by.** this imple
261c0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20  mentation.  But 
261d0 69 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63 61  in a hypothetica
261e0 6c 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74  l alternative st
261f0 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a  orage engine .**
26200 20 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20   in which index 
26210 65 6e 74 72 69 65 73 20 61 72 65 20 61 75 74 6f  entries are auto
26220 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
26230 64 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e  d when correspon
26240 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f  ding table.** ro
26250 77 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20  ws are deleted, 
26260 74 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c  the FORDELETE fl
26270 61 67 20 69 73 20 61 20 68 69 6e 74 20 74 68 61  ag is a hint tha
26280 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44  t all SEEK and D
26290 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69  ELETE.** operati
262a0 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72 73  ons on this curs
262b0 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73  or can be no-ops
262c0 20 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f 70   and all READ op
262d0 65 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a  erations can .**
262e0 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72   return a null r
262f0 6f 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78 30  ow (2-bytes: 0x0
26300 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e  1 0x00)..**.** N
26310 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
26320 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
26330 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
26340 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
26350 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
26360 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
26370 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
26380 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
26390 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
263a0 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
263b0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
263c0 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
263d0 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
263e0 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
263f0 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f  ed.** on pCur to
26400 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
26410 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69  memory space pri
26420 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
26430 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
26440 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
26450 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
26460 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26480 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
26490 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
264a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
264c0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
264d0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
264e0 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
264f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26500 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
26510 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
26520 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
26530 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
26540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
26550 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
26560 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
26570 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
26580 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
26590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
265a0 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
265b0 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
265c0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
265d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
265e0 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
265f0 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  ee handle */.  B
26600 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20  tCursor *pX;    
26610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26620 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67        /* Looping
26630 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20   over other all 
26640 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73  cursors */..  as
26650 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
26660 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
26670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
26680 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c  lag==0 .       |
26690 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f  | wrFlag==BTREE_
266a0 57 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c  WRCSR .       ||
266b0 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f   wrFlag==(BTREE_
266c0 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44  WRCSR|BTREE_FORD
266d0 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20  ELETE) .  );..  
266e0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
266f0 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
26700 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69  ts verify that i
26710 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72  f this is a shar
26720 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65  able .  ** b-tre
26730 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
26740 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
26750 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72  lding the requir
26760 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20  ed table locks, 
26770 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e  .  ** and that n
26780 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
26790 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20  on has any open 
267a0 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66  cursor that conf
267b0 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a  licts with .  **
267c0 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a   this lock.  */.
267d0 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
267e0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
267f0 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65  k(p, iTable, pKe
26800 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61  yInfo!=0, (wrFla
26810 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73  g?2:1)) );.  ass
26820 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
26830 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  | !hasReadConfli
26840 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29  cts(p, iTable) )
26850 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
26860 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
26870 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65  as opened the re
26880 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69  quired transacti
26890 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on. */.  assert(
268a0 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
268b0 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65  S_NONE );.  asse
268c0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
268d0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
268e0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
268f0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
26900 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  1 && pBt->pPage1
26910 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
26920 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
26930 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
26940 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
26950 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77  )==0 );..  if( w
26960 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c  rFlag ){.    all
26970 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
26980 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  Bt);.    if( pBt
26990 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29  ->pTmpSpace==0 )
269a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
269b0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
269c0 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26   if( iTable==1 &
269d0 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  & btreePagecount
269e0 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  (pBt)==0 ){.    
269f0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
26a00 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20  0 );.    iTable 
26a10 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  = 0;.  }..  /* N
26a20 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
26a30 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
26a40 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
26a50 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
26a60 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
26a70 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75   and link the cu
26a80 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
26a90 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f  Shared list.  */
26aa0 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  .  pCur->pgnoRoo
26ab0 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  t = (Pgno)iTable
26ac0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  ;.  pCur->iPage 
26ad0 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  = -1;.  pCur->pK
26ae0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
26af0 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65  o;.  pCur->pBtre
26b00 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70  e = p;.  pCur->p
26b10 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72  Bt = pBt;.  pCur
26b20 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46  ->curFlags = wrF
26b30 6c 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74 65  lag ? BTCF_Write
26b40 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75 72  Flag : 0;.  pCur
26b50 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20  ->curPagerFlags 
26b60 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50  = wrFlag ? 0 : P
26b70 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
26b80 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  Y;.  /* If there
26b90 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65   are two or more
26ba0 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
26bb0 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e  same btree, then
26bc0 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63   all such.  ** c
26bd0 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61  ursors *must* ha
26be0 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74  ve the BTCF_Mult
26bf0 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a  iple flag set. *
26c00 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e  /.  for(pX=pBt->
26c10 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d  pCursor; pX; pX=
26c20 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
26c30 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74  if( pX->pgnoRoot
26c40 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29  ==(Pgno)iTable )
26c50 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46  {.      pX->curF
26c60 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c  lags |= BTCF_Mul
26c70 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75  tiple;.      pCu
26c80 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
26c90 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20  TCF_Multiple;.  
26ca0 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e    }.  }.  pCur->
26cb0 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
26cc0 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75  rsor;.  pBt->pCu
26cd0 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
26ce0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
26cf0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
26d00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26d10 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
26d20 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
26d30 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26d60 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
26d70 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
26d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d90 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
26da0 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
26db0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
26dc0 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26de0 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
26df0 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
26e00 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
26e10 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
26e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e30 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
26e40 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
26e50 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
26e60 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
26e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26e80 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
26e90 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
26ea0 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54  int rc;.  if( iT
26eb0 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63  able<1 ){.    rc
26ec0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
26ed0 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  T_BKPT;.  }else{
26ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
26ef0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72  eEnter(p);.    r
26f00 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
26f10 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
26f20 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
26f30 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  r);.    sqlite3B
26f40 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
26f50 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26f60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
26f70 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
26f80 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
26f90 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
26fa0 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
26fb0 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
26fc0 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
26fd0 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
26fe0 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
26ff0 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
27000 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
27010 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
27020 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
27030 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
27040 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
27050 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
27060 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
27070 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
27080 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
27090 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
270a0 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
270b0 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
270c0 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
270d0 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
270e0 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
270f0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
27100 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
27110 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
27120 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
27130 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
27140 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
27150 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
27160 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
27170 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
27180 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
27190 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
271a0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
271b0 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
271c0 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
271d0 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
271e0 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
271f0 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
27200 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
27210 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
27220 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
27230 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
27240 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
27250 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
27260 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
27270 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
27280 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
27290 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
272a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
272b0 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
272c0 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
272d0 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
272e0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
272f0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
27300 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
27310 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
27320 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
27330 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
27340 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
27350 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
27360 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
27370 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
27380 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
27390 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
273a0 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
273b0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
273c0 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  >pCursor!=0 );. 
273d0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72     if( pBt->pCur
273e0 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  sor==pCur ){.   
273f0 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
27400 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
27410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27420 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20  BtCursor *pPrev 
27430 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
27440 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
27450 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65    if( pPrev->pNe
27460 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20  xt==pCur ){.    
27470 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65        pPrev->pNe
27480 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
27490 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
274a0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
274b0 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50 72       pPrev = pPr
274c0 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ev->pNext;.     
274d0 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28   }while( ALWAYS(
274e0 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a  pPrev) );.    }.
274f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
27500 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
27510 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
27520 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
27530 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
27540 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
27550 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73  used(pBt);.    s
27560 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
27570 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
27580 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
27590 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20  e(pCur); */.    
275a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
275b0 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
275c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
275d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
275e0 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
275f0 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
27600 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
27610 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
27620 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
27630 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
27640 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
27650 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  all.** btreePars
27660 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
27670 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
27680 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
27690 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
276a0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
276b0 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
276c0 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
276d0 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
276e0 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
276f0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
27700 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  )..*/.#ifndef ND
27710 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
27720 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
27730 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
27740 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
27750 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50  info;.    int iP
27760 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
27770 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  e;.    memset(&i
27780 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
27790 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65  nfo));.    btree
277a0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
277b0 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70  apPage[iPage], p
277c0 43 75 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b  Cur->ix, &info);
277d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52  .    assert( COR
277e0 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d  RUPT_DB || memcm
277f0 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
27800 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
27810 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
27820 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
27830 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
27840 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51  #endif.static SQ
27850 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
27860 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
27870 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
27880 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
27890 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
278a0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
278b0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43  r->iPage;.    pC
278c0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
278d0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a  BTCF_ValidNKey;.
278e0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
278f0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
27900 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 69 78 2c  iPage],pCur->ix,
27910 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
27920 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
27930 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
27940 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
27950 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
27960 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
27970 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
27980 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
27990 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
279a0 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
279b0 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
279c0 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
279d0 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
279e0 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
279f0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
27a00 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
27a10 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
27a20 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
27a30 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
27a40 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
27a50 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
27a60 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
27a70 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
27a80 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
27a90 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
27aa0 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
27ab0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
27ac0 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
27ad0 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20  * NDEBUG */.int 
27ae0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
27af0 6f 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75  orIsValidNN(BtCu
27b00 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
27b10 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29  ssert( pCur!=0 )
27b20 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  ;.  return pCur-
27b30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
27b40 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
27b50 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
27b60 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
27b70 6b 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66  key or "rowid" f
27b80 6f 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  or a table btree
27b90 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
27ba0 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20  e is only valid 
27bb0 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
27bc0 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
27bd0 74 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  to a.** ordinary
27be0 20 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49   table btree.  I
27bf0 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  f the cursor poi
27c00 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  nts to an index 
27c10 62 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69  btree or.** is i
27c20 6e 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75  nvalid, the resu
27c30 6c 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  lt of this routi
27c40 6e 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ne is undefined.
27c50 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42  .*/.i64 sqlite3B
27c60 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42  treeIntegerKey(B
27c70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
27c80 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
27c90 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
27ca0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27cb0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
27cc0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
27cd0 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49  sert( pCur->curI
27ce0 6e 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65  ntKey );.  getCe
27cf0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
27d00 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66  return pCur->inf
27d10 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  o.nKey;.}../*.**
27d20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
27d30 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70  er of bytes of p
27d40 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65  ayload for the e
27d50 6e 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69  ntry that pCur i
27d60 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70  s.** currently p
27d70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72  ointing to.  For
27d80 20 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74   table btrees, t
27d90 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
27da0 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74  amount.** of dat
27db0 61 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74  a.  For index bt
27dc0 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  rees, this will 
27dd0 62 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  be the size of t
27de0 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
27df0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75  e caller must gu
27e00 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
27e10 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
27e20 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  ing to a non-NUL
27e30 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79  L.** valid entry
27e40 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
27e50 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  s, the calling p
27e60 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75  rocedure must gu
27e70 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20  arantee.** that 
27e80 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43  the cursor has C
27e90 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55  ursor.eState==CU
27ea0 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75  RSOR_VALID..*/.u
27eb0 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  32 sqlite3BtreeP
27ec0 61 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72  ayloadSize(BtCur
27ed0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
27ee0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
27ef0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
27f00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27f10 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
27f20 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c  ALID );.  getCel
27f30 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
27f40 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
27f50 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a  .nPayload;.}../*
27f60 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
27f70 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
27f80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
27f90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
27fa0 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
27fb0 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
27fc0 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
27fd0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
27fe0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
27ff0 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
28000 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
28010 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
28020 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
28030 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
28040 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
28050 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
28060 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
28070 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
28080 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
28090 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
280a0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
280b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
280c0 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
280d0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
280e0 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
280f0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
28100 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
28110 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
28120 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
28130 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
28140 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
28150 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
28160 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
28170 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
28180 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
28190 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
281a0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
281b0 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
281c0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
281d0 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
281e0 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
281f0 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
28200 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
28210 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
28220 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
28230 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
28240 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
28250 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
28260 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
28270 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
28280 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
28290 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
282a0 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
282b0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
282c0 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
282d0 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
282e0 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
282f0 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
28300 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
28310 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
28320 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
28330 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
28340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28350 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28360 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c   */.  Pgno ovfl,
28370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28380 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76     /* Current ov
28390 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
283a0 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  er */.  MemPage 
283b0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
283c0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
283d0 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79  Page handle (may
283e0 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50   be NULL) */.  P
283f0 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
28400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
28410 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
28420 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
28430 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
28440 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
28450 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
28460 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28470 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
28480 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
28490 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
284a0 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74  assert(pPgnoNext
284b0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
284c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
284d0 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
284e0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
284f0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
28500 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
28510 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
28520 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
28530 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
28540 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
28550 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
28560 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
28570 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
28580 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
28590 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
285a0 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
285b0 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
285c0 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
285d0 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
285e0 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
285f0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
28600 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
28610 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
28620 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
28630 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
28640 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
28650 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
28660 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
28670 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
28680 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
28690 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
286a0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
286b0 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
286c0 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62     if( iGuess<=b
286d0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
286e0 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
286f0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
28700 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20  iGuess, &eType, 
28710 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  &pgno);.      if
28720 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28730 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
28740 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
28750 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
28760 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
28770 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
28780 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
28790 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
287a0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
287b0 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d   next==0 || rc==
287c0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
287d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
287e0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
287f0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
28800 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28   ovfl, &pPage, (
28810 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47  ppPage==0) ? PAG
28820 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
28830 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
28840 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28850 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
28860 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
28880 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
28890 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
288a0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
288b0 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
288c0 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
288d0 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
288e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
288f0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
28900 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
28910 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
28920 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
28930 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
28940 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
28950 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
28960 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
28970 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
28980 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
28990 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
289a0 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
289b0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
289c0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
289d0 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
289e0 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
289f0 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
28a00 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
28a10 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
28a20 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
28a30 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
28a40 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
28a50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
28a60 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
28a70 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
28a80 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
28a90 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
28aa0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
28ab0 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
28ac0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
28ad0 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
28ae0 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
28af0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
28b00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
28b10 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
28b20 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
28b30 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
28b40 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
28b50 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b70 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
28b80 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
28b90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28ba0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
28bb0 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
28bc0 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
28bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
28be0 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
28bf0 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
28c00 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
28c10 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
28c20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
28c30 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
28c40 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
28c50 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
28c60 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
28c70 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
28c80 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
28c90 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
28ca0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
28cb0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
28cc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28cd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
28ce0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
28cf0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
28d00 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
28d10 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
28d20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
28d30 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
28d40 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
28d50 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
28d60 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
28d70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
28d80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
28d90 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
28da0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
28db0 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
28dc0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
28dd0 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
28de0 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
28df0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
28e00 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a  ing to. The eOp.
28e10 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
28e20 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
28e30 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  llows:.**.**   0
28e40 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
28e50 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c  is a read. Popul
28e60 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
28e70 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20   cache..**   1: 
28e80 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
28e90 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61   a write. Popula
28ea0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
28eb0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  cache..**.** A t
28ec0 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
28ed0 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
28ee0 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
28ef0 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
28f00 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
28f10 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
28f20 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
28f30 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   The content bei
28f40 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  ng read or writt
28f50 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  en might appear 
28f60 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
28f70 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65  .** or be scatte
28f80 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
28f90 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ple overflow pag
28fa0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
28fb0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
28fc0 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
28fd0 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
28fe0 70 61 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75  pages.** this fu
28ff0 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63  nction may alloc
29000 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e  ate space for an
29010 64 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  d lazily populat
29020 65 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f  e.** the overflo
29030 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
29040 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
29050 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a  r.aOverflow). .*
29060 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
29070 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68  ls use this cach
29080 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
29090 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
290a0 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72  d offset .** mor
290b0 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
290c0 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
290d0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
290e0 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
290f0 6f 63 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20  ocated, it must 
29100 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
29110 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
29120 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
29130 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
29140 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
29150 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
29160 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
29170 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
29180 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
29190 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
291a0 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
291b0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
291c0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
291d0 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
291e0 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
291f0 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
29200 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
29210 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
29220 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
29230 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
29240 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
29250 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
29260 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
29270 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
29280 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
29290 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
292a0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
292b0 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
292c0 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
292d0 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
292e0 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
292f0 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
29300 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
29310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29320 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
29330 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
29340 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
29350 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
29360 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
29370 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
29380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29390 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
293a0 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
293b0 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
293c0 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
293d0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
293e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
293f0 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
29400 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
29410 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29420 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
29430 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
29440 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
29450 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
29460 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
29470 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
29480 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
29490 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66  ngs to */.#ifdef
294a0 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
294b0 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75  VERFLOW_READ.  u
294c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63  nsigned char * c
294d0 6f 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d  onst pBufStart =
294e0 20 70 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74   pBuf;     /* St
294f0 61 72 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  art of original 
29500 6f 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65  out buffer */.#e
29510 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
29520 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
29530 74 28 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70  t( eOp==0 || eOp
29540 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
29550 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29560 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
29570 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29580 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
29590 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
295a0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
295b0 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c  r) );..  getCell
295c0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
295d0 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
295e0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20  nfo.pPayload;.  
295f0 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61  assert( offset+a
29600 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  mt <= pCur->info
29610 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20  .nPayload );..  
29620 61 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64  assert( aPayload
29630 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20   > pPage->aData 
29640 29 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29 28  );.  if( (uptr)(
29650 61 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65  aPayload - pPage
29660 2d 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d  ->aData) > (pBt-
29670 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43  >usableSize - pC
29680 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29  ur->info.nLocal)
29690 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
296a0 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
296b0 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
296c0 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
296d0 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20  n error.  The.  
296e0 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c    ** conditional
296f0 20 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79   above is really
29700 3a 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61  :.    **    &aPa
29710 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
29720 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
29730 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
29740 61 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a  ableSize].    **
29750 20 62 75 74 20 69 73 20 72 65 63 61 73 74 20 69   but is recast i
29760 6e 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20  nto its current 
29770 66 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e  form to avoid in
29780 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70  teger overflow p
29790 72 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20  roblems.    */. 
297a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
297b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
297c0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
297d0 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
297e0 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
297f0 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
29800 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
29810 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
29820 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
29830 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
29840 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
29850 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
29860 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
29870 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
29880 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
29890 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
298a0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
298b0 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
298c0 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
298d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
298e0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
298f0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
29900 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
29910 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
29920 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
29930 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d  .  }...  if( rc=
29940 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
29950 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
29960 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
29970 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
29980 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
29990 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
299a0 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
299b0 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
299c0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
299d0 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
299e0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
299f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
29a00 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
29a10 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62  flow[] has not b
29a20 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
29a30 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a  llocate it now..
29a40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
29a50 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
29a60 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 20  ray is sized at 
29a70 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
29a80 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
29a90 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  .    ** in the o
29aa0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
29ab0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
29ac0 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
29ad0 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20  flow page is.   
29ae0 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   ** stored in aO
29af0 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e  verflow[0], etc.
29b00 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
29b10 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
29b20 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65   array.    ** me
29b30 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
29b40 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20 69  wn" (the cache i
29b50 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
29b60 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
29b70 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
29b80 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
29b90 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Ovfl)==0 ){.    
29ba0 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
29bb0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
29bc0 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
29bd0 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
29be0 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
29bf0 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d   if( nOvfl>pCur-
29c00 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20  >nOvflAlloc ){. 
29c10 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65         Pgno *aNe
29c20 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74  w = (Pgno*)sqlit
29c30 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3Realloc(.     
29c40 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
29c50 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a  erflow, nOvfl*2*
29c60 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20  sizeof(Pgno).   
29c70 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
29c80 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
29c90 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
29ca0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
29cb0 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  T;.        }else
29cc0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  {.          pCur
29cd0 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e  ->nOvflAlloc = n
29ce0 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20  Ovfl*2;.        
29cf0 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
29d00 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20  w = aNew;.      
29d10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29d20 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61    memset(pCur->a
29d30 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76  Overflow, 0, nOv
29d40 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29  fl*sizeof(Pgno))
29d50 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75  ;.      pCur->cu
29d60 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
29d70 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 7d 65  alidOvfl;.    }e
29d80 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  lse{.      /* If
29d90 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
29da0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
29db0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
29dc0 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
29dd0 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
29de0 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f  first required o
29df0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
29e00 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20  valid, skip.    
29e10 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
29e20 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
29e30 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
29e40 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f  verflow[offset/o
29e50 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20  vflSize] ){.    
29e60 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73      iIdx = (offs
29e70 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et/ovflSize);.  
29e80 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
29e90 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
29ea0 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 20 20  [iIdx];.        
29eb0 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74  offset = (offset
29ec0 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  %ovflSize);.    
29ed0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61    }.    }..    a
29ee0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
29ef0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 3b  E_OK && amt>0 );
29f00 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 65 78 74  .    while( next
29f10 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Page ){.      /*
29f20 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
29f30 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
29f40 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
29f50 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  che. */.      as
29f60 73 65 72 74 28 20 70 43 75 72 2d 3e 61 4f 76 65  sert( pCur->aOve
29f70 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20  rflow[iIdx]==0. 
29f80 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
29f90 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
29fa0 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a  iIdx]==nextPage.
29fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
29fc0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
29fd0 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
29fe0 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
29ff0 74 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 69 66  tPage;..      if
2a000 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69  ( offset>=ovflSi
2a010 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ze ){.        /*
2a020 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e   The only reason
2a030 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
2a040 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20  ge is to obtain 
2a050 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
2a060 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74   ** number for t
2a070 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
2a080 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
2a090 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20  in. The page.   
2a0a0 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20       ** data is 
2a0b0 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f  not required. So
2a0c0 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f   first try to lo
2a0d0 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f  okup the overflo
2a0e0 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  w.        ** pag
2a0f0 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66  e-list cache, if
2a100 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20   any, then fall 
2a110 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f  back to the getO
2a120 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20  verflowPage().  
2a130 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
2a140 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  n..        */.  
2a150 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2a160 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2a170 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b  TCF_ValidOvfl );
2a180 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a190 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
2a1a0 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  b==pBt->db );.  
2a1b0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2a1c0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
2a1d0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ] ){.          n
2a1e0 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
2a1f0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
2a200 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ];.        }else
2a210 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2a220 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
2a230 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
2a240 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
2a250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a260 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
2a270 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
2a280 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
2a290 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
2a2a0 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
2a2b0 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
2a2c0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
2a2d0 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
2a2e0 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
2a2f0 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
2a300 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
2a310 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65          */.#ifde
2a320 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
2a330 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
2a340 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
2a350 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 2f 2a 20  le *fd;      /* 
2a360 46 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  File from which 
2a370 74 6f 20 64 6f 20 64 69 72 65 63 74 20 6f 76 65  to do direct ove
2a380 72 66 6c 6f 77 20 72 65 61 64 20 2a 2f 0a 23 65  rflow read */.#e
2a390 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74  ndif.        int
2a3a0 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
2a3b0 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
2a3c0 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
2a3d0 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
2a3e0 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
2a3f0 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65          }..#ifde
2a400 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
2a410 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
2a420 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
2a430 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
2a440 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20  e true:.        
2a450 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2a460 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61  1) this is a rea
2a470 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64  d operation, and
2a480 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32   .        **   2
2a490 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72  ) data is requir
2a4a0 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ed from the star
2a4b0 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c  t of this overfl
2a4c0 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20  ow page, and.   
2a4d0 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65       **   3) the
2a4e0 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72  re is no open wr
2a4f0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
2a500 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
2a510 20 20 34 29 20 74 68 65 20 64 61 74 61 62 61 73    4) the databas
2a520 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64  e is file-backed
2a530 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
2a540 20 20 20 35 29 20 74 68 65 20 70 61 67 65 20 69     5) the page i
2a550 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 57 41 4c  s not in the WAL
2a560 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a   file.        **
2a570 20 20 20 36 29 20 61 74 20 6c 65 61 73 74 20 34     6) at least 4
2a580 20 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65   bytes have alre
2a590 61 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e  ady been read in
2a5a0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
2a5b0 66 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  ffer .        **
2a5c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
2a5d0 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61   data can be rea
2a5e0 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  d directly from 
2a5f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a600 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  e into the.     
2a610 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66     ** output buf
2a620 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74  fer, bypassing t
2a630 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c  he page-cache al
2a640 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73  together. This s
2a650 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  peeds.        **
2a660 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67   up loading larg
2a670 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73  e records that s
2a680 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f  pan many overflo
2a690 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20  w pages..       
2a6a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2a6b0 65 4f 70 3d 3d 30 20 20 20 20 20 20 20 20 20 20  eOp==0          
2a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6e0 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20     /* (1) */.   
2a6f0 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d        && offset=
2a700 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
2a730 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  2) */.         &
2a740 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
2a750 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44  tion==TRANS_READ
2a760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a770 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20       /* (3) */. 
2a780 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20 3d          && (fd =
2a790 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
2a7a0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d  e(pBt->pPager))-
2a7b0 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a  >pMethods     /*
2a7c0 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (4) */.        
2a7d0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 50 61   && 0==sqlite3Pa
2a7e0 67 65 72 55 73 65 57 61 6c 28 70 42 74 2d 3e 70  gerUseWal(pBt->p
2a7f0 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 29  Pager, nextPage)
2a800 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f         /* (5) */
2a810 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70 42  .         && &pB
2a820 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72  uf[-4]>=pBufStar
2a830 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a850 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20  /* (6) */.      
2a860 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75    ){.          u
2a870 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20  8 aSave[4];.    
2a880 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65        u8 *aWrite
2a890 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20   = &pBuf[-4];.  
2a8a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2a8b0 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61 72  aWrite>=pBufStar
2a8c0 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  t );            
2a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a8e0 64 75 65 20 74 6f 20 28 36 29 20 2a 2f 0a 20 20  due to (6) */.  
2a8f0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
2a900 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29  Save, aWrite, 4)
2a910 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2a920 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
2a930 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20  d, aWrite, a+4, 
2a940 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69  (i64)pBt->pageSi
2a950 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29  ze*(nextPage-1))
2a960 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
2a970 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
2a980 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  aWrite);.       
2a990 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65     memcpy(aWrite
2a9a0 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20  , aSave, 4);.   
2a9b0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
2a9c0 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  f..        {.   
2a9d0 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
2a9e0 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
2a9f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2aa00 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
2aa10 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
2aa20 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20  DbPage,.        
2aa30 20 20 20 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20        (eOp==0 ? 
2aa40 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
2aa50 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  LY : 0).        
2aa60 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
2aa70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2aa80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2aa90 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
2aaa0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
2aab0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2aac0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
2aad0 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
2aae0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
2aaf0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
2ab00 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
2ab10 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  t+4], pBuf, a, e
2ab20 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  Op, pDbPage);.  
2ab30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2ab40 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
2ab50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2ab60 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
2ab70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ab80 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20    }.        amt 
2ab90 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 69 66  -= a;.        if
2aba0 28 20 61 6d 74 3d 3d 30 20 29 20 72 65 74 75 72  ( amt==0 ) retur
2abb0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 70 42  n rc;.        pB
2abc0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d  uf += a;.      }
2abd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2abe0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 49 64  break;.      iId
2abf0 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  x++;.    }.  }..
2ac00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ac10 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
2ac20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ac30 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
2ac40 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61 69  /* Overflow chai
2ac50 6e 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72 65  n ends premature
2ac60 6c 79 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ly */.  }.  retu
2ac70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2ac80 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
2ac90 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65   payload for the
2aca0 20 72 6f 77 20 61 74 20 77 68 69 63 68 20 74 68   row at which th
2acb0 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
2acc0 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  s currently.** p
2acd0 6f 69 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22 20  ointing.  "amt" 
2ace0 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
2acf0 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70  ansferred into p
2ad00 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
2ad10 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
2ad20 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
2ad30 2a 20 70 43 75 72 20 63 61 6e 20 62 65 20 70 6f  * pCur can be po
2ad40 69 6e 74 69 6e 67 20 74 6f 20 65 69 74 68 65 72  inting to either
2ad50 20 61 20 74 61 62 6c 65 20 6f 72 20 61 6e 20 69   a table or an i
2ad60 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20  ndex b-tree..** 
2ad70 49 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  If pointing to a
2ad80 20 74 61 62 6c 65 20 62 74 72 65 65 2c 20 74 68   table btree, th
2ad90 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 73  en the content s
2ada0 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 20  ection is read. 
2adb0 20 49 66 0a 2a 2a 20 70 43 75 72 20 69 73 20 70   If.** pCur is p
2adc0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e  ointing to an in
2add0 64 65 78 20 62 2d 74 72 65 65 20 74 68 65 6e 20  dex b-tree then 
2ade0 74 68 65 20 6b 65 79 20 73 65 63 74 69 6f 6e 20  the key section 
2adf0 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46  is read..**.** F
2ae00 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
2ae10 61 79 6c 6f 61 64 28 29 2c 20 74 68 65 20 63 61  ayload(), the ca
2ae20 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
2ae30 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f   that pCur is po
2ae40 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
2ae50 61 6c 69 64 20 72 6f 77 20 69 6e 20 74 68 65 20  alid row in the 
2ae60 74 61 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69  table.  For sqli
2ae70 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43  te3BtreePayloadC
2ae80 68 65 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a  hecked(), the.**
2ae90 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 62 65   cursor might be
2aea0 20 69 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67 68   invalid or migh
2aeb0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 73  t need to be res
2aec0 74 6f 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  tored before bei
2aed0 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52  ng read..**.** R
2aee0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2aef0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
2af00 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
2af10 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
2af20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
2af30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af40 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
2af50 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
2af60 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
2af70 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
2af80 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
2af90 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2afa0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
2afb0 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
2afc0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2afd0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2afe0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2aff0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2b000 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2b010 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2b020 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
2b030 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b040 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
2b050 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d  ( pCur->ix<pCur-
2b060 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b070 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
2b080 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
2b090 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
2b0a0 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
2b0b0 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
2b0c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
2b0d0 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71 6c 69   variant of sqli
2b0e0 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28  te3BtreePayload(
2b0f0 29 20 77 6f 72 6b 73 20 65 76 65 6e 20 69 66 20  ) works even if 
2b100 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
2b110 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 43 55 52  ot.** in the CUR
2b120 53 4f 52 5f 56 41 4c 49 44 20 73 74 61 74 65 2e  SOR_VALID state.
2b130 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65    It is only use
2b140 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
2b150 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20  _blob_read().** 
2b160 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69  interface..*/.#i
2b170 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b180 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74 61 74 69  T_INCRBLOB.stati
2b190 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
2b1a0 45 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  E int accessPayl
2b1b0 6f 61 64 43 68 65 63 6b 65 64 28 0a 20 20 42 74  oadChecked(.  Bt
2b1c0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20  Cursor *pCur,.  
2b1d0 75 33 32 20 6f 66 66 73 65 74 2c 0a 20 20 75 33  u32 offset,.  u3
2b1e0 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64 20 2a 70  2 amt,.  void *p
2b1f0 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Buf.){.  int rc;
2b200 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
2b210 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
2b220 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
2b230 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
2b240 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
2b250 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2b260 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  d(pCur) );.  rc 
2b270 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75  = btreeRestoreCu
2b280 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2b290 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20  r);.  return rc 
2b2a0 3f 20 72 63 20 3a 20 61 63 63 65 73 73 50 61 79  ? rc : accessPay
2b2b0 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
2b2c0 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29  t, amt, pBuf, 0)
2b2d0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
2b2e0 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b  treePayloadCheck
2b2f0 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ed(BtCursor *pCu
2b300 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
2b310 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
2b320 75 66 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  uf){.  if( pCur-
2b330 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2b340 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
2b350 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2b360 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2b370 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65  .    return acce
2b380 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
2b390 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
2b3a0 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f, 0);.  }else{.
2b3b0 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65 73      return acces
2b3c0 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28  sPayloadChecked(
2b3d0 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
2b3e0 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a  t, pBuf);.  }.}.
2b3f0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2b400 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a  _OMIT_INCRBLOB *
2b410 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
2b420 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
2b430 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
2b440 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
2b450 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
2b460 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
2b470 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
2b480 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
2b490 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
2b4a0 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78  the key if index
2b4b0 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
2b4c0 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69  intKey==0) and i
2b4d0 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a  s the data for.*
2b4e0 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28  * table btrees (
2b4f0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pPage->intKey==1
2b500 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ). The number of
2b510 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
2b520 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20  ble.** key/data 
2b530 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2b540 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
2b550 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
2b560 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  lue.** returned 
2b570 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61  will not be a va
2b580 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
2b590 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b5a0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
2b5b0 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
2b5c0 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
2b5d0 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
2b5e0 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
2b5f0 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
2b600 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
2b610 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
2b620 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
2b630 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
2b640 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
2b650 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
2b660 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
2b670 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
2b680 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
2b690 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
2b6a0 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
2b6b0 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
2b6c0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
2b6d0 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
2b6e0 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68  reassemble.** th
2b6f0 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
2b700 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
2b710 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
2b720 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
2b730 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
2b740 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
2b750 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
2b760 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
2b770 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
2b780 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
2b790 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
2b7a0 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
2b7b0 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
2b7c0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2b7d0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
2b7e0 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61  st void *fetchPa
2b7f0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
2b800 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
2b810 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
2b820 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
2b830 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
2b840 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20  *pAmt           
2b850 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
2b860 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
2b870 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
2b880 29 7b 0a 20 20 75 33 32 20 61 6d 74 3b 0a 20 20  ){.  u32 amt;.  
2b890 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
2b8a0 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
2b8b0 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
2b8c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
2b8d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b8e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2b8f0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2b900 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2b910 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2b920 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2b930 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
2b940 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2b950 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2b960 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d  ( pCur->ix<pCur-
2b970 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b980 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
2b990 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2b9a0 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20  nfo.nSize>0 );. 
2b9b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2b9c0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75  nfo.pPayload>pCu
2b9d0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2b9e0 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c  iPage]->aData ||
2b9f0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
2ba00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2ba10 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75  nfo.pPayload<pCu
2ba20 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2ba30 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64  iPage]->aDataEnd
2ba40 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a   ||CORRUPT_DB);.
2ba50 20 20 61 6d 74 20 3d 20 28 69 6e 74 29 28 70 43    amt = (int)(pC
2ba60 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2ba70 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e  >iPage]->aDataEn
2ba80 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d - pCur->info.p
2ba90 50 61 79 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20  Payload);.  if( 
2baa0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
2bab0 6c 3c 61 6d 74 20 29 20 61 6d 74 20 3d 20 70 43  l<amt ) amt = pC
2bac0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
2bad0 0a 20 20 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a  .  *pAmt = amt;.
2bae0 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
2baf0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
2bb00 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
2bb10 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
2bb20 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
2bb30 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
2bb40 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
2bb50 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
2bb60 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
2bb70 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
2bb80 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
2bb90 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
2bba0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
2bbb0 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
2bbc0 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
2bbd0 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
2bbe0 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
2bbf0 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
2bc00 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
2bc10 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
2bc20 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
2bc30 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
2bc40 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
2bc50 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
2bc60 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
2bc70 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
2bc80 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
2bc90 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
2bca0 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
2bcb0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
2bcc0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
2bcd0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
2bce0 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
2bcf0 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
2bd00 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
2bd10 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
2bd20 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
2bd30 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
2bd40 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
2bd50 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
2bd60 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68  treePayloadFetch
2bd70 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2bd80 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72   u32 *pAmt){.  r
2bd90 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f  eturn fetchPaylo
2bda0 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a  ad(pCur, pAmt);.
2bdb0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
2bdc0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
2bdd0 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
2bde0 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
2bdf0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2be00 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
2be10 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
2be20 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a  e to move to..**
2be30 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2be40 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
2be50 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20  _CORRUPT if the 
2be60 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
2be70 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68  s field of.** th
2be80 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
2be90 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
2bea0 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20  the flags field 
2beb0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69  of the parent (i
2bec0 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74  .e..** if an int
2bed0 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73  key page appears
2bee0 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e   to be the paren
2bef0 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  t of a non-intke
2bf00 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69  y page, or.** vi
2bf10 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74  ce-versa)..*/.st
2bf20 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
2bf30 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
2bf40 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
2bf50 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2bf60 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
2bf70 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2bf80 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2bf90 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2bfa0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2bfb0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2bfc0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2bfd0 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
2bfe0 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
2bff0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
2c000 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  >=0 );.  if( pCu
2c010 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
2c020 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
2c030 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2c040 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2c050 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  PT;.  }.  pCur->
2c060 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2c070 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2c080 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
2c090 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2c0a0 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69  vfl);.  pCur->ai
2c0b0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2b  Idx[pCur->iPage+
2c0c0 2b 5d 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20  +] = pCur->ix;. 
2c0d0 20 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20   pCur->ix = 0;. 
2c0e0 20 72 65 74 75 72 6e 20 67 65 74 41 6e 64 49 6e   return getAndIn
2c0f0 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
2c100 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  gno, &pCur->apPa
2c110 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c  ge[pCur->iPage],
2c120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c130 20 20 20 20 20 20 20 20 20 70 43 75 72 2c 20 70           pCur, p
2c140 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
2c150 67 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  gs);.}..#ifdef S
2c160 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
2c170 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69  * Page pParent i
2c180 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e  s an internal (n
2c190 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61  on-leaf) tree pa
2c1a0 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
2c1b0 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68  n .** asserts th
2c1c0 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
2c1d0 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66  Child is the lef
2c1e0 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69  t-child if the i
2c1f0 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69  Idx'th.** cell i
2c200 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20  n page pParent. 
2c210 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65  Or, if iIdx is e
2c220 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61  qual to the tota
2c230 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  l number of.** c
2c240 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c  ells in pParent,
2c250 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
2c260 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
2c270 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a  right-child of.*
2c280 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  * the page..*/.s
2c290 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
2c2a0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d  tParentIndex(Mem
2c2b0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69  Page *pParent, i
2c2c0 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43  nt iIdx, Pgno iC
2c2d0 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52  hild){.  if( COR
2c2e0 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
2c2f0 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74  ;  /* The condit
2c300 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f  ions tested belo
2c310 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74  w might not be t
2c320 72 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  rue.            
2c330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c340 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20  ** in a corrupt 
2c350 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73  database */.  as
2c360 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
2c370 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
2c380 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
2c390 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
2c3a0 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
2c3b0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
2c3c0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
2c3d0 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
2c3e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c3f0 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
2c400 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
2c410 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
2c420 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
2c430 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
2c440 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
2c450 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
2c460 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2c470 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
2c480 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
2c490 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
2c4a0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
2c4b0 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
2c4c0 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
2c4d0 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
2c4e0 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
2c4f0 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
2c500 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
2c510 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
2c520 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
2c530 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
2c540 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
2c550 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
2c560 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
2c570 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
2c580 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2c590 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2c5a0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2c5b0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2c5c0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2c5d0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2c5e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2c5f0 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
2c600 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2c610 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
2c620 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e  );.  assertParen
2c630 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72  tIndex(.    pCur
2c640 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2c650 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
2c660 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2c670 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
2c680 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2c690 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20  ->iPage]->pgno. 
2c6a0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2c6b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2c6c0 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75  ->iPage-1] > pCu
2c6d0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2c6e0 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20  iPage-1]->nCell 
2c6f0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
2c700 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2c710 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2c720 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2c730 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2c740 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 43  .  pCur->ix = pC
2c750 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2c760 69 50 61 67 65 2d 31 5d 3b 0a 20 20 72 65 6c 65  iPage-1];.  rele
2c770 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
2c780 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2c790 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a  ->iPage--]);.}..
2c7a0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
2c7b0 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
2c7c0 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
2c7d0 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74  of its b-tree st
2c7e0 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
2c7f0 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  f the table has 
2c800 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
2c810 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75  age, then the cu
2c820 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
2c830 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65   point.** to the
2c840 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
2c850 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ge instead of th
2c860 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
2c870 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20  ge. A table has 
2c880 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  a.** virtual roo
2c890 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20  t page when the 
2c8a0 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
2c8b0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
2c8c0 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e  ls and a .** sin
2c8d0 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20  gle child page. 
2c8e0 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  This can only ha
2c8f0 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61  ppen with the ta
2c900 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
2c910 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge 1..**.** If t
2c920 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  he b-tree struct
2c930 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  ure is empty, th
2c940 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
2c950 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52  s set to .** CUR
2c960 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68  SOR_INVALID. Oth
2c970 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73  erwise, the curs
2c980 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
2c990 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a  nt to the first.
2c9a0 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20  ** cell located 
2c9b0 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20  on the root (or 
2c9c0 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61  virtual root) pa
2c9d0 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ge and the curso
2c9e0 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65  r state.** is se
2c9f0 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49  t to CURSOR_VALI
2ca00 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  D..**.** If this
2ca10 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2ca20 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
2ca30 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  it may be assume
2ca40 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  d that the.** pa
2ca50 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
2ca60 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
2ca70 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74  e [virtual] root
2ca80 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70  -page is the exp
2ca90 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f  ected .** kind o
2caa0 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69  f b-tree page (i
2cab0 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e  .e. if when open
2cac0 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
2cad0 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f  he caller did no
2cae0 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b  t.** specify a K
2caf0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
2cb00 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
2cb10 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f  is set to 0x05 o
2cb20 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63  r 0x0D,.** indic
2cb30 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d  ating a table b-
2cb40 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20  tree, or if the 
2cb50 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69  caller did speci
2cb60 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  fy a KeyInfo .**
2cb70 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
2cb80 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
2cb90 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41   to 0x02 or 0x0A
2cba0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
2cbb0 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29  index.** b-tree)
2cbc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cbd0 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
2cbe0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
2cbf0 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
2cc00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2cc10 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  OK;..  assert( c
2cc20 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2cc30 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2cc40 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
2cc50 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
2cc60 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
2cc70 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
2cc80 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
2cc90 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
2cca0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
2ccb0 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
2ccc0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
2ccd0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2cce0 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
2ccf0 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  SEEK ){.    if( 
2cd00 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2cd10 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
2cd20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2cd30 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49  ->skipNext!=SQLI
2cd40 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72  TE_OK );.      r
2cd50 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
2cd60 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
2cd70 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
2cd80 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
2cd90 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   }..  if( pCur->
2cda0 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  iPage>=0 ){.    
2cdb0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20  if( pCur->iPage 
2cdc0 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
2cdd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2cde0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2cdf0 69 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20 20  iPage]!=0 );.   
2ce00 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2ce10 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70  NotNull(pCur->ap
2ce20 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2ce30 2d 2d 5d 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  --]);.      }whi
2ce40 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 29  le( pCur->iPage)
2ce50 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69  ;.      goto ski
2ce60 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a 20 20  p_init;.    }.  
2ce70 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e  }else if( pCur->
2ce80 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  pgnoRoot==0 ){. 
2ce90 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2cea0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2ceb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2cec0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2ced0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2cee0 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20 29  r->iPage==(-1) )
2cef0 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  ;.    rc = getAn
2cf00 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e  dInitPage(pCur->
2cf10 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75  pBtree->pBt, pCu
2cf20 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
2cf30 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20  ur->apPage[0],. 
2cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf50 20 20 20 20 20 20 20 30 2c 20 70 43 75 72 2d 3e         0, pCur->
2cf60 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a  curPagerFlags);.
2cf70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2cf80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
2cf90 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2cfa0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2cfb0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2cfc0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
2cfd0 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70  iPage = 0;.    p
2cfe0 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d  Cur->curIntKey =
2cff0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
2d000 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20  ->intKey;.  }.  
2d010 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70  pRoot = pCur->ap
2d020 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72  Page[0];.  asser
2d030 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
2d040 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
2d050 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d  ;..  /* If pCur-
2d060 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74  >pKeyInfo is not
2d070 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
2d080 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e  caller that open
2d090 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20  ed this cursor. 
2d0a0 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20   ** expected to 
2d0b0 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e  open it on an in
2d0c0 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65  dex b-tree. Othe
2d0d0 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e  rwise, if pKeyIn
2d0e0 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c  fo is.  ** NULL,
2d0f0 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65   the caller expe
2d100 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72  cts a table b-tr
2d110 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  ee. If this is n
2d120 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a  ot the case,.  *
2d130 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  * return an SQLI
2d140 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72  TE_CORRUPT error
2d150 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72  . .  **.  ** Ear
2d160 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lier versions of
2d170 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20   SQLite assumed 
2d180 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20 63  that this test c
2d190 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20  ould not fail.  
2d1a0 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70  ** if the root p
2d1b0 61 67 65 20 77 61 73 20 61 6c 72 65 61 64 79 20  age was already 
2d1c0 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69 73  loaded when this
2d1d0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
2d1e0 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20  lled (i.e..  ** 
2d1f0 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  if pCur->iPage>=
2d200 30 29 2e 20 42 75 74 20 74 68 69 73 20 69 73 20  0). But this is 
2d210 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64 61  not so if the da
2d220 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
2d230 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63  ted .  ** in suc
2d240 68 20 61 20 77 61 79 20 74 68 61 74 20 70 61 67  h a way that pag
2d250 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65  e pRoot is linke
2d260 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20  d into a second 
2d270 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20  b-tree table .  
2d280 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c  ** (or the freel
2d290 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ist).  */.  asse
2d2a0 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  rt( pRoot->intKe
2d2b0 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69  y==1 || pRoot->i
2d2c0 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66  ntKey==0 );.  if
2d2d0 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d  ( pRoot->isInit=
2d2e0 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65  =0 || (pCur->pKe
2d2f0 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74  yInfo==0)!=pRoot
2d300 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
2d310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2d320 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2d330 0a 73 6b 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20  .skip_init:  .  
2d340 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20  pCur->ix = 0;.  
2d350 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2d360 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2d370 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2d380 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2d390 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2d3a0 64 4f 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74  dOvfl);..  pRoot
2d3b0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2d3c0 30 5d 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  0];.  if( pRoot-
2d3d0 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
2d3e0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2d3f0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d  URSOR_VALID;.  }
2d400 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d  else if( !pRoot-
2d410 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
2d420 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
2d430 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
2d440 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
2d450 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2d460 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
2d470 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
2d480 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
2d490 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
2d4a0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2d4b0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2d4c0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2d4d0 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
2d4e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
2d4f0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2d500 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d  SOR_INVALID;.  }
2d510 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d520 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2d530 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
2d540 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
2d550 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
2d560 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
2d570 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
2d580 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
2d590 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
2d5a0 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
2d5b0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
2d5c0 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
2d5d0 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
2d5e0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
2d5f0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
2d600 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
2d610 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
2d620 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
2d630 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2d640 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2d650 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2d660 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2d670 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2d680 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2d690 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2d6a0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
2d6b0 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
2d6c0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2d6d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
2d6e0 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
2d6f0 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67  t( pCur->ix<pPag
2d700 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2d710 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
2d720 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2d730 70 43 75 72 2d 3e 69 78 29 29 3b 0a 20 20 20 20  pCur->ix));.    
2d740 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2d750 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
2d760 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2d770 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
2d780 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
2d790 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
2d7a0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
2d7b0 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
2d7c0 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
2d7d0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
2d7e0 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
2d7f0 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
2d800 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
2d810 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
2d820 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
2d830 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
2d840 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
2d850 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
2d860 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
2d870 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
2d880 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
2d890 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2d8a0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
2d8b0 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
2d8c0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
2d8d0 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
2d8e0 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
2d8f0 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
2d900 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
2d910 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
2d920 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
2d930 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
2d940 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
2d950 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
2d960 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
2d970 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2d980 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
2d990 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2d9a0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2d9b0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2d9c0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2d9d0 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61  ;.  while( !(pPa
2d9e0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2d9f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
2da00 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
2da10 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
2da20 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2da30 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2da40 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  .    pCur->ix = 
2da50 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
2da60 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2da70 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
2da80 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2da90 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
2daa0 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e  ur->ix = pPage->
2dab0 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72  nCell-1;.  asser
2dac0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
2dad0 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ize==0 );.  asse
2dae0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2daf0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2db00 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65  NKey)==0 );.  re
2db10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2db20 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
2db30 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
2db40 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2db50 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
2db60 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
2db70 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
2db80 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
2db90 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
2dba0 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
2dbb0 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
2dbc0 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
2dbd0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2dbe0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2dbf0 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
2dc00 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2dc10 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  s){.  int rc;.. 
2dc20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2dc30 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2dc40 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2dc50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2dc60 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2dc70 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
2dc80 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
2dc90 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
2dca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2dcb0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2dcc0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2dcd0 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ID ){.      asse
2dce0 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2dcf0 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
2dd00 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2dd10 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
2dd20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2dd30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2dd40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2dd50 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2dd60 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
2dd70 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2dd80 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2dd90 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2dda0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2ddb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
2ddc0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
2ddd0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
2dde0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
2ddf0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2de00 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
2de10 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
2de20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
2de30 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
2de40 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
2de50 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
2de60 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2de70 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
2de80 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
2de90 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2dea0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2deb0 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
2dec0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2ded0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2dee0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2def0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2df00 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2df10 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
2df20 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64  he cursor alread
2df30 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
2df40 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73  last entry, this
2df50 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
2df60 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c    if( CURSOR_VAL
2df70 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2df80 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
2df90 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
2dfa0 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  t)!=0 ){.#ifdef 
2dfb0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
2dfc0 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
2dfd0 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28  erves to assert(
2dfe0 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  ) that the curso
2dff0 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f  r really does po
2e000 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74  int .    ** to t
2e010 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2e020 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a   the b-tree. */.
2e030 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
2e040 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75  for(ii=0; ii<pCu
2e050 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b  r->iPage; ii++){
2e060 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2e070 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d  Cur->aiIdx[ii]==
2e080 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d  pCur->apPage[ii]
2e090 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d  ->nCell );.    }
2e0a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2e0b0 72 2d 3e 69 78 3d 3d 70 43 75 72 2d 3e 61 70 50  r->ix==pCur->apP
2e0c0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2e0d0 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20  ->nCell-1 );.   
2e0e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2e0f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2e100 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64  e]->leaf );.#end
2e110 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
2e120 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2e130 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
2e140 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
2e150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e160 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2e170 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2e180 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  te ){.      asse
2e190 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2e1a0 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
2e1b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2e1c0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
2e1d0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2e1e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e1f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2e200 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2e210 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
2e220 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
2e230 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
2e240 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
2e250 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e260 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
2e270 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
2e280 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20  BTCF_AtLast;.   
2e290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e2a0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2e2b0 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74   &= ~BTCF_AtLast
2e2c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20  ;.      }.   .  
2e2d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2e2e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
2e2f0 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
2e300 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
2e310 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
2e320 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
2e330 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
2e340 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
2e350 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
2e360 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
2e370 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
2e380 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
2e390 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
2e3a0 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
2e3b0 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
2e3c0 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
2e3d0 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
2e3e0 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
2e3f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
2e400 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
2e410 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
2e420 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
2e430 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
2e440 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
2e450 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
2e460 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
2e470 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
2e480 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
2e490 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
2e4a0 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
2e4b0 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
2e4c0 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
2e4d0 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20  *.** An integer 
2e4e0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2e4f0 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74  *pRes which is t
2e500 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
2e510 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
2e520 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
2e530 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
2e540 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e  rsor is .** poin
2e550 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69  ting.  The meani
2e560 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ng of the intege
2e570 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  r written into.*
2e580 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f  * *pRes is as fo
2e590 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
2e5a0 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
2e5b0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
2e5c0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2e5d0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
2e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2e5f0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69  s smaller than i
2e600 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72  ntKey/pIdxKey or
2e610 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2e620 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
2e630 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
2e640 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
2e650 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
2e660 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
2e670 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
2e680 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2e690 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2e6a0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2e6b0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2e6c0 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
2e6d0 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64  tches intKey/pId
2e6e0 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  xKey..**.**     
2e6f0 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
2e700 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2e710 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2e720 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2e740 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74   larger than int
2e750 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
2e760 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  ** For index tab
2e770 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79  les, the pIdxKey
2e780 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69  ->eqSeen field i
2e790 73 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68  s set to 1 if th
2e7a0 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e  ere.** exists an
2e7b0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2e7c0 62 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c 79  ble that exactly
2e7d0 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65 79   matches pIdxKey
2e7e0 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
2e7f0 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
2e800 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
2e810 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
2e820 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
2e830 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
2e840 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
2e850 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
2e860 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
2e870 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
2e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e890 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
2e8a0 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
2e8b0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
2e8c0 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
2e8d0 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
2e8e0 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
2e8f0 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
2e900 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
2e910 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
2e920 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2e930 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70  rc;.  RecordComp
2e940 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  are xRecordCompa
2e950 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  re;..  assert( c
2e960 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2e970 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2e980 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2e990 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2e9a0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2e9b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
2e9c0 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  es );.  assert( 
2e9d0 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70  (pIdxKey==0)==(p
2e9e0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
2e9f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2ea00 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2ea10 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49  SOR_VALID || (pI
2ea20 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
2ea30 2d 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20  ->curIntKey!=0) 
2ea40 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2ea50 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
2ea60 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
2ea70 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
2ea80 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
2ea90 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
2eaa0 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
2eab0 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
2eac0 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65   */.  if( pIdxKe
2ead0 79 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d  y==0.   && pCur-
2eae0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2eaf0 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e  VALID && (pCur->
2eb00 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2eb10 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20  ValidNKey)!=0.  
2eb20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
2eb30 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
2eb40 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
2eb50 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
2eb60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2eb70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2eb80 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
2eb90 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Key ){.      if(
2eba0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2ebb0 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2ebc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
2ebd0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
2ebe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ebf0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2ec00 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75    /* If the requ
2ec10 65 73 74 65 64 20 6b 65 79 20 69 73 20 6f 6e 65  ested key is one
2ec20 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 70   more than the p
2ec30 72 65 76 69 6f 75 73 20 6b 65 79 2c 20 74 68 65  revious key, the
2ec40 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 79 20 74  n.      ** try t
2ec50 6f 20 67 65 74 20 74 68 65 72 65 20 75 73 69 6e  o get there usin
2ec60 67 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  g sqlite3BtreeNe
2ec70 78 74 28 29 20 72 61 74 68 65 72 20 74 68 61 6e  xt() rather than
2ec80 20 61 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a   a full.      **
2ec90 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20   binary search. 
2eca0 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
2ecb0 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20  mization only.  
2ecc0 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  The correct answ
2ecd0 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  er.      ** is s
2ece0 74 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77 69  till obtained wi
2ecf0 74 68 6f 75 74 20 74 68 69 73 20 61 73 65 2c 20  thout this ase, 
2ed00 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f  only a little mo
2ed10 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20  re slowely */.  
2ed20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2ed30 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65  fo.nKey+1==intKe
2ed40 79 20 26 26 20 21 70 43 75 72 2d 3e 73 6b 69 70  y && !pCur->skip
2ed50 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
2ed60 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2ed70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2ed80 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
2ed90 52 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Res);.        if
2eda0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2edb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70  ;.        if( *p
2edc0 52 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Res==0 ){.      
2edd0 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
2ede0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20  pCur);.         
2edf0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2ee00 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
2ee10 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2ee20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ee30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ee40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2ee50 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64  }.  }..  if( pId
2ee60 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63  xKey ){.    xRec
2ee70 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c  ordCompare = sql
2ee80 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
2ee90 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20  are(pIdxKey);.  
2eea0 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f    pIdxKey->errCo
2eeb0 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  de = 0;.    asse
2eec0 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66  rt( pIdxKey->def
2eed0 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20  ault_rc==1 .    
2eee0 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
2eef0 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a  >default_rc==0 .
2ef00 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78           || pIdx
2ef10 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
2ef20 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  =-1.    );.  }el
2ef30 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43  se{.    xRecordC
2ef40 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41  ompare = 0; /* A
2ef50 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65  ll keys are inte
2ef60 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72  gers */.  }..  r
2ef70 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
2ef80 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
2ef90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2efa0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2efb0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
2efc0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2efd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
2efe0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2eff0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2f000 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2f010 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69  r->iPage]->isIni
2f020 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2f030 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2f040 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
2f050 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2f060 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
2f070 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2f080 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2f090 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
2f0a0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
2f0b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
2f0c0 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
2f0d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2f0e0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
2f0f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2f100 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
2f110 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2f120 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d  age[0]->intKey==
2f130 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
2f140 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2f150 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20  r->curIntKey || 
2f160 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72  pIdxKey );.  for
2f170 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77  (;;){.    int lw
2f180 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a  r, upr, idx, c;.
2f190 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
2f1a0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
2f1b0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2f1c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2f1d0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20  .    u8 *pCell; 
2f1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2f200 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63  ter to current c
2f210 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a  ell in pPage */.
2f220 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e  .    /* pPage->n
2f230 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65  Cell must be gre
2f240 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20  ater than zero. 
2f250 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72  If this is the r
2f260 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
2f270 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  the cursor would
2f280 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c   have been INVAL
2f290 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69  ID above and thi
2f2a0 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20  s for(;;) loop. 
2f2b0 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49     ** not run. I
2f2c0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
2f2d0 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65  e root-page, the
2f2e0 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c  n the moveToChil
2f2f0 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  d() routine.    
2f300 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c  ** would have al
2f310 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64  ready detected d
2f320 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69  b corruption. Si
2f330 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d  milarly, pPage m
2f340 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68  ust.    ** be th
2f350 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e  e right kind (in
2f360 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66  dex or table) of
2f370 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74   b-tree page. Ot
2f380 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61  herwise.    ** a
2f390 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f   moveToChild() o
2f3a0 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63  r moveToRoot() c
2f3b0 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64  all would have d
2f3c0 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69  etected corrupti
2f3d0 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  on.  */.    asse
2f3e0 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
2f3f0 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
2f400 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d  ( pPage->intKey=
2f410 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b  =(pIdxKey==0) );
2f420 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20  .    lwr = 0;.  
2f430 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e    upr = pPage->n
2f440 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65  Cell-1;.    asse
2f450 72 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30  rt( biasRight==0
2f460 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31   || biasRight==1
2f470 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70   );.    idx = up
2f480 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29  r>>(1-biasRight)
2f490 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52  ; /* idx = biasR
2f4a0 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77  ight ? upr : (lw
2f4b0 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20  r+upr)/2; */.   
2f4c0 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2f4d0 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52  )idx;.    if( xR
2f4e0 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20  ecordCompare==0 
2f4f0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  ){.      for(;;)
2f500 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43  {.        i64 nC
2f510 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
2f520 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2f530 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69  PastPtr(pPage, i
2f540 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dx);.        if(
2f550 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
2f560 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
2f570 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a  while( 0x80 <= *
2f580 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20  (pCell++) ){.   
2f590 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
2f5a0 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  ll>=pPage->aData
2f5b0 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  End ) return SQL
2f5c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2f5d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f5e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f5f0 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
2f600 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79   (u64*)&nCellKey
2f610 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
2f620 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29  CellKey<intKey )
2f630 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
2f640 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20  = idx+1;.       
2f650 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
2f660 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b  { c = -1; break;
2f670 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2f680 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e   if( nCellKey>in
2f690 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
2f6a0 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
2f6b0 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72           if( lwr
2f6c0 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20  >upr ){ c = +1; 
2f6d0 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20  break; }.       
2f6e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f6f0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b    assert( nCellK
2f700 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ey==intKey );.  
2f710 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78          pCur->ix
2f720 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2f730 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2f740 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2f750 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2f760 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2f770 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c  to moveto_next_l
2f780 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  ayer;.          
2f790 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2f7a0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2f7b0 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
2f7c0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Key;.           
2f7d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2f7e0 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
2f7f0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2f800 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2f810 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73             *pRes
2f820 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2f830 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f840 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
2f850 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f860 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
2f870 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
2f880 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
2f890 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
2f8a0 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
2f8b0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2f8c0 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
2f8d0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c          int nCel
2f8e0 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74  l;  /* Size of t
2f8f0 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e  he pCell cell in
2f900 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
2f910 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2f920 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c  llPastPtr(pPage,
2f930 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20   idx);..        
2f940 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  /* The maximum s
2f950 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69  upported page-si
2f960 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65  ze is 65536 byte
2f970 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  s. This means th
2f980 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  at.        ** th
2f990 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
2f9a0 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73   of record bytes
2f9b0 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e   stored on an in
2f9c0 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20  dex B-Tree.     
2f9d0 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65     ** page is le
2f9e0 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79  ss than 16384 by
2f9f0 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73  tes and may be s
2fa00 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74  tored as a 2-byt
2fa10 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72  e.        ** var
2fa20 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d  int. This inform
2fa30 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
2fa40 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69   attempt to avoi
2fa50 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20  d parsing .     
2fa60 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
2fa70 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e   cell by checkin
2fa80 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20  g for the cases 
2fa90 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64  where the record
2faa0 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
2fab0 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20  stored entirely 
2fac0 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65  within the b-tre
2fad0 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63  e page by inspec
2fae0 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a  ting the first .
2faf0 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74          ** 2 byt
2fb00 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  es of the cell..
2fb10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2fb20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c     nCell = pCell
2fb30 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
2fb40 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d   nCell<=pPage->m
2fb50 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29  ax1bytePayload )
2fb60 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2fb70 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
2fb80 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69  if the record-si
2fb90 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ze field of the 
2fba0 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20  cell is a.      
2fbb0 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79      ** single by
2fbc0 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
2fbd0 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e  e record fits en
2fbe0 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
2fbf0 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
2fc00 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
2fc10 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2fc20 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
2fc30 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +1==pPage->aData
2fc40 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
2fc50 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
2fc60 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
2fc70 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64  *)&pCell[1], pId
2fc80 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
2fc90 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c  else if( !(pCell
2fca0 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20  [1] & 0x80) .   
2fcb0 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c         && (nCell
2fcc0 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29   = ((nCell&0x7f)
2fcd0 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29  <<7) + pCell[1])
2fce0 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
2fcf0 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  l.        ){.   
2fd00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2fd10 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
2fd20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69  is a 2 byte vari
2fd30 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
2fd40 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  d .          ** 
2fd50 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
2fd60 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65   the main b-tree
2fd70 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
2fd80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2fd90 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50  Cell+nCell+2==pP
2fda0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
2fdb0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
2fdc0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
2fdd0 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
2fde0 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[2], pIdxKey);
2fdf0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2fe00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fe10 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76   record flows ov
2fe20 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  er onto one or m
2fe30 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
2fe40 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20  es. In.         
2fe50 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68   ** this case th
2fe60 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65  e whole cell nee
2fe70 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c  ds to be parsed,
2fe80 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
2fe90 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
2fea0 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f   and accessPaylo
2feb0 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74  ad() used to ret
2fec0 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64  rieve the record
2fed0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
2fee0 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65      ** buffer be
2fef0 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43  fore VdbeRecordC
2ff00 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20  ompare() can be 
2ff10 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20  called. .       
2ff20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
2ff30 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64  ** If the record
2ff40 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65   is corrupt, the
2ff50 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2ff60 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64  routine may read
2ff70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70  .          ** up
2ff80 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20   to two varints 
2ff90 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
2ffa0 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65  the buffer. An e
2ffb0 78 74 72 61 20 31 38 20 0a 20 20 20 20 20 20 20  xtra 18 .       
2ffc0 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70     ** bytes of p
2ffd0 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61  adding is alloca
2ffe0 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ted at the end o
2fff0 66 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a  f the buffer in.
30000 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73            ** cas
30010 65 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20  e this happens. 
30020 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f   */.          vo
30030 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
30040 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e          u8 * con
30050 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70  st pCellBody = p
30060 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68  Cell - pPage->ch
30070 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
30080 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
30090 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
300a0 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d  CellBody, &pCur-
300b0 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  >info);.        
300c0 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70    nCell = (int)p
300d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
300e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
300f0 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20  se( nCell<0 );  
30100 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20   /* True if key 
30110 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20  size is 2^32 or 
30120 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  more */.        
30130 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
30140 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==0 );  /* Inva
30150 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
30160 78 38 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f  x80 0x80 0x00 */
30170 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
30180 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b  ase( nCell==1 );
30190 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
301a0 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
301b0 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20  0 0x01 */.      
301c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
301d0 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69  ell==2 );  /* Mi
301e0 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65  nimum legal inde
301f0 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20  x key size */.  
30200 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
30210 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<2 ){.         
30220 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
30230 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
30240 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
30250 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
30260 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30270 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71     pCellKey = sq
30280 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65  lite3Malloc( nCe
30290 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20  ll+18 );.       
302a0 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
302b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
302c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
302d0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
302e0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
302f0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
30300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30310 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
30320 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72  idx;.          r
30330 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
30340 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  d(pCur, 0, nCell
30350 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
30360 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a  *)pCellKey, 0);.
30370 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
30380 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
30390 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
303a0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
303b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
303c0 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
303d0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ey);.           
303e0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
303f0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
30400 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
30410 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
30420 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  ell, pCellKey, p
30430 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
30440 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
30450 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
30460 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
30470 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20  ert( .          
30480 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43    (pIdxKey->errC
30490 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52  ode!=SQLITE_CORR
304a0 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20  UPT || c==0).   
304b0 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65        && (pIdxKe
304c0 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
304d0 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72  TE_NOMEM || pCur
304e0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61  ->pBtree->db->ma
304f0 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20  llocFailed).    
30500 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
30510 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
30520 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
30530 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
30540 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( c>0 ){.      
30550 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
30560 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
30570 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
30580 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( c==0 );.      
30590 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
305a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
305b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
305c0 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
305d0 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
305e0 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65    if( pIdxKey->e
305f0 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51  rrCode ) rc = SQ
30600 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
30610 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
30620 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
30630 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
30640 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61  ( lwr>upr ) brea
30650 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  k;.        asser
30660 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
30670 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
30680 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
30690 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
306a0 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  /2 */.      }.  
306b0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
306c0 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70  lwr==upr+1 || (p
306d0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
306e0 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b  !pPage->leaf) );
306f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
30700 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
30710 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
30720 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
30730 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72  t( pCur->ix<pCur
30740 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
30750 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
30760 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d        pCur->ix =
30770 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
30780 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
30790 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
307a0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
307b0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
307c0 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  }.moveto_next_la
307d0 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72  yer:.    if( lwr
307e0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
307f0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
30800 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
30810 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
30820 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
30830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
30840 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
30850 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
30860 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
30870 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
30880 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20  6)lwr;.    rc = 
30890 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
308a0 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
308b0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
308c0 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
308d0 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  :.  pCur->info.n
308e0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  Size = 0;.  asse
308f0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
30900 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
30910 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65  Ovfl)==0 );.  re
30920 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
30930 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
30940 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
30950 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  not pointing at 
30960 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
30970 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55  table..**.** TRU
30980 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  E will be return
30990 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ed after a call 
309a0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  to sqlite3BtreeN
309b0 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70  ext() moves.** p
309c0 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  ast the last ent
309d0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
309e0 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
309f0 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74  rev() moves past
30a00 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e  .** the first en
30a10 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c  try.  TRUE is al
30a20 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
30a30 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
30a40 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
30a50 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73  3BtreeEof(BtCurs
30a60 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
30a70 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68  TODO: What if th
30a80 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43  e cursor is in C
30a90 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
30aa0 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20  K but all table 
30ab0 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76  entries.  ** hav
30ac0 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20  e been deleted? 
30ad0 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65  This API will ne
30ae0 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20  ed to change to 
30af0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
30b00 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c  code.  ** as wel
30b10 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e  l as the boolean
30b20 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20   result value.. 
30b30 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55   */.  return (CU
30b40 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72  RSOR_VALID!=pCur
30b50 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  ->eState);.}../*
30b60 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 73  .** Return an es
30b70 74 69 6d 61 74 65 20 66 6f 72 20 74 68 65 20 6e  timate for the n
30b80 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
30b90 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
30ba0 70 43 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74  pCur is.** point
30bb0 69 6e 67 20 74 6f 2e 20 20 52 65 74 75 72 6e 20  ing to.  Return 
30bc0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
30bd0 72 20 69 66 20 6e 6f 20 65 73 74 69 6d 61 74 65  r if no estimate
30be0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a   is currently .*
30bf0 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  * available..*/.
30c00 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65  i64 sqlite3Btree
30c10 52 6f 77 43 6f 75 6e 74 45 73 74 28 42 74 43 75  RowCountEst(BtCu
30c20 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
30c30 36 34 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a 20  64 n;.  u8 i;.. 
30c40 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
30c50 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
30c60 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
30c70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
30c80 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
30c90 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
30ca0 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 74 68   /* Currently th
30cb0 69 73 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  is interface is 
30cc0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 74  only called by t
30cd0 68 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 0a  he OP_IfSmaller.
30ce0 20 20 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e 64    ** opcode, and
30cf0 20 69 74 20 74 68 61 74 20 63 61 73 65 20 74 68   it that case th
30d00 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 61 6c  e cursor will al
30d10 77 61 79 73 20 62 65 20 76 61 6c 69 64 20 61 6e  ways be valid an
30d20 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77 61  d.  ** will alwa
30d30 79 73 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c 65  ys point to a le
30d40 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66  af node. */.  if
30d50 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53  ( NEVER(pCur->eS
30d60 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
30d70 49 44 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ID) ) return -1;
30d80 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75  .  if( NEVER(pCu
30d90 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
30da0 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 29  iPage]->leaf==0)
30db0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20   ) return -1;.. 
30dc0 20 66 6f 72 28 6e 3d 31 2c 20 69 3d 30 3b 20 69   for(n=1, i=0; i
30dd0 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
30de0 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a 3d 20 70 43  ++){.    n *= pC
30df0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 6e  ur->apPage[i]->n
30e00 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Cell;.  }.  retu
30e10 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn n;.}../*.** A
30e20 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
30e30 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
30e40 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
30e50 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
30e60 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
30e70 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
30e80 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
30e90 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
30ea0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
30eb0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
30ec0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
30ed0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
30ee0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
30ef0 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Res=1..**.** The
30f00 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
30f10 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
30f20 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72  eNext().  That r
30f30 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
30f40 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
30f50 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
30f60 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e  rely incrementin
30f70 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
30f80 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
30f90 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74  x.** to the next
30fa0 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
30fb0 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
30fc0 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65  (slower) btreeNe
30fd0 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72  xt() helper.** r
30fe0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
30ff0 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
31000 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
31010 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
31020 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f  e or.** to resto
31030 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
31040 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
31050 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
31060 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72  et *pRes to 0 or
31070 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c   1.  The initial
31080 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20   *pRes value.** 
31090 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65  will be 1 if the
310a0 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74   cursor being st
310b0 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64  epped correspond
310c0 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
310d0 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73  x and.** if this
310e0 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
310f0 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
31100 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64   if that SQL ind
31110 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61  ex had been.** a
31120 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
31130 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61  Otherwise the ca
31140 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73  ller will have s
31150 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f  et *pRes to zero
31160 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65  ..** Zero is the
31170 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68   common case. Th
31180 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
31190 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74  tation is free t
311a0 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69  o use the.** ini
311b0 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
311c0 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d   as a hint to im
311d0 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  prove performanc
311e0 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65  e, but the curre
311f0 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72  nt.** SQLite btr
31200 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
31210 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74  n does not. (Not
31220 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62  e that the comdb
31230 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65  2 btree.** imple
31240 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75  mentation does u
31250 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f  se this hint, ho
31260 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69  wever.).*/.stati
31270 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
31280 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28  E int btreeNext(
31290 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
312a0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
312b0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
312c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
312d0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
312e0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
312f0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
31300 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
31310 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
31320 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
31330 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
31340 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69   *pRes==0 );.  i
31350 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
31360 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
31370 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43  .    assert( (pC
31380 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
31390 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d  TCF_ValidOvfl)==
313a0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  0 );.    rc = re
313b0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
313c0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
313d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
313e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
313f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
31400 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
31410 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
31420 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
31430 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
31440 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
31450 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
31460 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
31470 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
31480 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
31490 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
314a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
314b0 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70  PNEXT );.      p
314c0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
314d0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
314e0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
314f0 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  Next>0 ){.      
31500 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
31510 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
31520 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
31540 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
31550 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
31560 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
31570 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
31580 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72  ;.  idx = ++pCur
31590 2d 3e 69 78 3b 0a 20 20 61 73 73 65 72 74 28 20  ->ix;.  assert( 
315a0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
315b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
315c0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63  tabase file is c
315d0 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f  orrupt, it is po
315e0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76  ssible for the v
315f0 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a  alue of idx .  *
31600 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20  * to be invalid 
31610 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  here. This can o
31620 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73  nly occur if a s
31630 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64  econd cursor mod
31640 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70  ifies.  ** the p
31650 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72  age while cursor
31660 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67   pCur is holding
31670 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
31680 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20  it. Which can.  
31690 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  ** only happen i
316a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
316b0 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63  s corrupt in suc
316c0 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69  h a way as to li
316d0 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  nk the.  ** page
316e0 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20   into more than 
316f0 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  one b-tree struc
31700 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63  ture. */.  testc
31710 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e  ase( idx>pPage->
31720 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20  nCell );..  if( 
31730 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
31740 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
31750 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
31760 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
31770 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
31780 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
31790 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
317a0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
317b0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
317c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d  ;.      return m
317d0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
317e0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  ur);.    }.    d
317f0 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
31800 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
31810 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
31820 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
31830 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
31840 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
31850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31860 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
31870 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
31880 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
31890 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
318a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
318b0 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
318c0 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ix>=pPage->nCell
318d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
318e0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
318f0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
31900 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
31910 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
31920 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
31930 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
31940 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
31950 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
31960 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
31980 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
31990 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
319a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
319b0 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
319c0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
319d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
319e0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  e;.  assert( cur
319f0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
31a00 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
31a10 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
31a20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
31a30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a   || *pRes==1 );.
31a40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
31a50 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
31a60 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
31a70 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70  SOR_VALID );.  p
31a80 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
31a90 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
31aa0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
31ab0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
31ac0 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52  alidOvfl);.  *pR
31ad0 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43  es = 0;.  if( pC
31ae0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
31af0 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72  OR_VALID ) retur
31b00 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
31b10 2c 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67 65  , pRes);.  pPage
31b20 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
31b30 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
31b40 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 69 78 29  if( (++pCur->ix)
31b50 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
31b60 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d  {.    pCur->ix--
31b70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  ;.    return btr
31b80 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
31b90 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  s);.  }.  if( pP
31ba0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
31bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31bc0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
31bd0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
31be0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
31bf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  .}../*.** Step t
31c00 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
31c10 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
31c20 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
31c30 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
31c40 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
31c50 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
31c60 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
31c70 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
31c80 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
31c90 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
31ca0 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
31cb0 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
31cc0 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
31cd0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
31ce0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
31cf0 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
31d00 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
31d10 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  us().  That rout
31d20 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
31d30 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
31d40 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
31d50 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74  y decrementing t
31d60 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
31d70 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
31d80 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  * to the previou
31d90 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  s cell on the cu
31da0 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
31db0 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50   (slower) btreeP
31dc0 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c  revious().** hel
31dd0 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63  per routine is c
31de0 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73  alled when it is
31df0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f   necessary to mo
31e00 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ve to a differen
31e10 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20  t page.** or to 
31e20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  restore the curs
31e30 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  or..**.** The ca
31e40 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77  lling function w
31e50 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ill set *pRes to
31e60 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e   0 or 1.  The in
31e70 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
31e80 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69  e.** will be 1 i
31e90 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69  f the cursor bei
31ea0 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65  ng stepped corre
31eb0 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
31ec0 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66   index and.** if
31ed0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
31ee0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b  uld have been sk
31ef0 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51  ipped if that SQ
31f00 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e  L index had been
31f10 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64  .** a unique ind
31f20 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74  ex.  Otherwise t
31f30 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  he caller will h
31f40 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ave set *pRes to
31f50 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69   zero..** Zero i
31f60 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  s the common cas
31f70 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70  e. The btree imp
31f80 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66  lementation is f
31f90 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a  ree to use the.*
31fa0 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  * initial *pRes 
31fb0 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20  value as a hint 
31fc0 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f  to improve perfo
31fd0 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20  rmance, but the 
31fe0 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74  current.** SQLit
31ff0 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
32000 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e  tation does not.
32010 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20   (Note that the 
32020 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20  comdb2 btree.** 
32030 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
32040 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e  oes use this hin
32050 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a  t, however.).*/.
32060 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
32070 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65  INLINE int btree
32080 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
32090 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
320a0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
320b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
320c0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
320d0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
320e0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
320f0 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
32100 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
32110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
32120 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
32130 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
32140 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
32150 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
32160 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
32170 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
32180 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
32190 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20  idNKey))==0 );. 
321a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
321b0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
321c0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
321d0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
321e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   ){.    rc = res
321f0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
32200 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
32210 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32220 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
32230 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
32240 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
32250 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
32260 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
32270 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
32280 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
32290 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
322a0 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
322b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
322c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
322d0 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
322e0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
322f0 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
32300 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
32310 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
32320 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
32330 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ext<0 ){.       
32340 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
32350 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
32360 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
32370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
32380 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
32390 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
323a0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
323b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
323c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
323d0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
323e0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
323f0 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
32400 70 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63  pCur->ix;.    rc
32410 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
32420 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
32430 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
32440 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
32450 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
32460 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
32470 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
32480 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
32490 28 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b  ( pCur->ix==0 ){
324a0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
324b0 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
324c0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
324d0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
324e0 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
324f0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
32500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
32510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
32520 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
32530 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
32540 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
32550 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nSize==0 );.    
32560 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
32570 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
32580 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29  ValidOvfl))==0 )
32590 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d  ;..    pCur->ix-
325a0 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  -;.    pPage = p
325b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
325c0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66  ->iPage];.    if
325d0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
325e0 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
325f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
32600 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
32610 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
32620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32630 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32640 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
32650 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
32660 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
32670 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
32680 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
32690 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
326a0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
326b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
326c0 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
326d0 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20  rt( *pRes==0 || 
326e0 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73  *pRes==1 );.  as
326f0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
32700 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
32710 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
32720 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73  VALID );.  *pRes
32730 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
32740 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
32750 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
32760 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
32770 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  dNKey);.  pCur->
32780 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
32790 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
327a0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
327b0 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d  .   || pCur->ix=
327c0 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61  =0.   || pCur->a
327d0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
327e0 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b  e]->leaf==0.  ){
327f0 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
32800 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
32810 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75  pRes);.  }.  pCu
32820 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75 72  r->ix--;.  retur
32830 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
32840 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
32850 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
32860 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32870 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
32880 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
32890 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
328a0 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
328b0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
328c0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
328d0 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
328e0 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
328f0 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
32900 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
32910 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
32920 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
32930 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
32940 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
32950 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
32960 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
32970 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
32980 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
32990 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
329a0 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
329b0 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
329c0 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
329d0 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
329e0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
329f0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
32a00 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
32a10 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
32a20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
32a30 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f   0, then an effo
32a40 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
32a50 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
32a60 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
32a70 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
32a80 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
32a90 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
32aa0 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
32ab0 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
32ac0 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
32ad0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
32ae0 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
32af0 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
32b00 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
32b10 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
32b20 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d   the eMode param
32b30 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f  eter is BTALLOC_
32b40 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65  EXACT and the ne
32b50 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73  arby page exists
32b60 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
32b70 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
32b80 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
32b90 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
32ba0 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64  ned.  If.** eMod
32bb0 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20  e is BTALLOC_LT 
32bc0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65  then the page re
32bd0 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c  turned will be l
32be0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
32bf0 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69  l.** to nearby i
32c00 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20  f any such page 
32c10 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64  exists.  If eMod
32c20 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  e is BTALLOC_ANY
32c30 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61   then there.** a
32c40 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f  re no restrictio
32c50 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65  ns on which page
32c60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
32c70 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
32c80 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
32c90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
32ca0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
32cb0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
32cc0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
32cd0 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65   /* Store pointe
32ce0 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
32cf0 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  ed page here */.
32d00 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20    Pgno *pPgno,  
32d10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
32d20 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
32d30 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  r here */.  Pgno
32d40 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20   nearby,        
32d50 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
32d60 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69   a page near thi
32d70 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d  s one */.  u8 eM
32d80 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
32d90 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41    /* BTALLOC_EXA
32da0 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20  CT, BTALLOC_LT, 
32db0 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a  or BTALLOC_ANY *
32dc0 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
32dd0 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
32de0 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
32df0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
32e00 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
32e10 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
32e20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
32e30 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
32e40 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
32e50 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
32e60 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
32e70 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
32e80 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
32e90 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
32ea0 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
32eb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
32ec0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
32ed0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
32ee0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
32ef0 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42  assert( eMode==B
32f00 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e  TALLOC_ANY || (n
32f10 65 61 72 62 79 3e 30 20 26 26 20 52 45 51 55 49  earby>0 && REQUI
32f20 52 45 5f 50 54 52 4d 41 50 20 29 20 29 3b 0a 20  RE_PTRMAP ) );. 
32f30 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
32f40 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20  Page1;.  mxPage 
32f50 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
32f60 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44  (pBt);.  /* EVID
32f70 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39  ENCE-OF: R-05119
32f80 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79 74  -02637 The 4-byt
32f90 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
32fa0 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
32fb0 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74  6.  ** stores st
32fc0 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  ores the total n
32fd0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
32fe0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
32ff0 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  */.  n = get4byt
33000 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
33010 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73  [36]);.  testcas
33020 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29  e( n==mxPage-1 )
33030 3b 0a 20 20 69 66 28 20 49 53 43 4f 4e 43 55 52  ;.  if( ISCONCUR
33040 52 45 4e 54 3d 3d 30 20 26 26 20 6e 3e 3d 6d 78  RENT==0 && n>=mx
33050 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
33060 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
33070 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
33080 2a 20 45 6e 73 75 72 65 20 70 61 67 65 20 31 20  * Ensure page 1 
33090 69 73 20 77 72 69 74 61 62 6c 65 2e 20 54 68 69  is writable. Thi
330a0 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
330b0 65 69 74 68 65 72 20 63 68 61 6e 67 65 20 74 68  either change th
330c0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
330d0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 72   pages in the fr
330e0 65 65 2d 6c 69 73 74 20 6f 72 20 74 68 65 20 73  ee-list or the s
330f0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
33100 61 73 65 20 66 69 6c 65 2e 20 53 69 6e 63 65 20  ase file. Since 
33110 62 6f 74 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65  both.  ** of the
33120 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 69 6e  se operations in
33130 76 6f 6c 76 65 20 6d 6f 64 69 66 79 69 6e 67 20  volve modifying 
33140 70 61 67 65 20 31 20 68 65 61 64 65 72 20 66 69  page 1 header fi
33150 65 6c 64 73 2c 20 70 61 67 65 20 31 0a 20 20 2a  elds, page 1.  *
33160 2a 20 77 69 6c 6c 20 64 65 66 69 6e 69 74 65 6c  * will definitel
33170 79 20 62 65 20 77 72 69 74 74 65 6e 20 62 79 20  y be written by 
33180 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
33190 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
331a0 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2a 2a 20  CONCURRENT.  ** 
331b0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 65 6e 73  transaction, ens
331c0 75 72 65 20 74 68 65 20 42 74 72 65 65 50 74 72  ure the BtreePtr
331d0 6d 61 70 20 73 74 72 75 63 74 75 72 65 20 68 61  map structure ha
331e0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
331f0 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
33200 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
33210 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
33220 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
33230 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6e 3e  rn rc;..  if( n>
33240 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
33250 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
33260 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
33270 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
33280 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
33290 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
332a0 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
332b0 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
332c0 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
332d0 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
332e0 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20  rby' */.    u32 
332f0 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f  nSearch = 0;   /
33300 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  * Count of the n
33310 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20  umber of search 
33320 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20  attempts */.    
33330 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65  .    /* If eMode
33340 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
33350 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
33360 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
33370 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
33380 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
33390 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
333a0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
333b0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
333c0 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
333d0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
333e0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
333f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4d 6f    */.    if( eMo
33400 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
33410 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
33420 74 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 21  t( ISAUTOVACUUM!
33430 3d 49 53 43 4f 4e 43 55 52 52 45 4e 54 20 29 3b  =ISCONCURRENT );
33440 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54  .      if( ISAUT
33450 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
33460 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d     if( nearby<=m
33470 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
33480 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
33490 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
334a0 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
334b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
334c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
334d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
334e0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
334f0 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
33500 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
33510 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
33520 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 54            if( eT
33530 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
33540 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
33550 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
33560 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
33570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33580 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
33590 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
335a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
335b0 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
335c0 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
335d0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
335e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
335f0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
33600 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
33610 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
33620 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
33630 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
33640 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
33650 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
33660 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
33670 20 20 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79     */.    put4by
33680 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
33690 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
336a0 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
336b0 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
336c0 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
336d0 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
336e0 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
336f0 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
33700 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
33710 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
33720 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
33730 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
33740 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
33750 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
33760 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
33770 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20  BTALLOC_EXACT). 
33780 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61     ** or until a
33790 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20   page less than 
337a0 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
337b0 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
337c0 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20  LOC_LT).    */. 
337d0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
337e0 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
337f0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
33800 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
33810 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
33820 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33  F: R-01506-11053
33830 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67   The first integ
33840 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
33850 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
33860 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61      ** is the pa
33870 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
33880 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74   next freelist t
33890 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
338a0 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20   list or.       
338b0 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73   ** zero if this
338c0 20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65   is the last fre
338d0 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
338e0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
338f0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
33900 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
33910 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
33920 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
33930 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
33940 38 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d  841-13798 The 4-
33950 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
33960 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
33970 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20  t 32.        ** 
33980 73 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20  stores the page 
33990 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
339a0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
339b0 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72  freelist, or zer
339c0 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  o if.        ** 
339d0 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
339e0 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  empty. */.      
339f0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
33a00 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
33a10 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
33a20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
33a30 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
33a40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
33a50 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53  unk>mxPage || nS
33a60 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20  earch++ > n ){. 
33a70 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
33a80 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
33a90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
33aa0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
33ab0 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
33ac0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
33ad0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nk, 0);.      }.
33ae0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
33af0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
33b00 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
33b10 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
33b20 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
33b30 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
33b40 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
33b50 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ert( pTrunk->aDa
33b60 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f  ta!=0 );.      /
33b70 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
33b80 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54 68 65  -13523-04394 The
33b90 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20   second integer 
33ba0 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
33bb0 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a  unk page.      *
33bc0 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
33bd0 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69  of leaf page poi
33be0 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e  nters to follow.
33bf0 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   */.      k = ge
33c00 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
33c10 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
33c20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
33c30 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
33c40 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
33c50 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
33c60 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
33c70 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
33c80 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
33c90 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
33ca0 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
33cb0 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
33cc0 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
33cd0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
33ce0 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
33cf0 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
33d00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
33d10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
33d20 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
33d30 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
33d40 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
33d50 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
33d60 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
33d70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
33d80 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
33d90 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
33da0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
33db0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
33dc0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
33dd0 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
33de0 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
33df0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
33e00 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
33e10 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
33e20 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
33e30 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
33e40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
33e50 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75  ( k>(u32)(pBt->u
33e60 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
33e70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
33e80 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
33e90 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
33ea0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
33eb0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
33ec0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
33ed0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
33ee0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
33ef0 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  age;.#ifndef SQL
33f00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
33f10 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  UUM.      }else 
33f20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a  if( searchList .
33f30 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
33f40 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c  nearby==iTrunk |
33f50 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79  | (iTrunk<nearby
33f60 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   && eMode==BTALL
33f70 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29  OC_LE)) .      )
33f80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
33f90 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
33fa0 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
33fb0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
33fc0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
33fd0 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
33fe0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
33ff0 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
34000 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
34010 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
34020 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
34030 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
34040 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
34050 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
34060 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
34070 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
34080 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
34090 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
340a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
340b0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
340c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
340d0 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
340e0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
340f0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
34100 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
34110 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
34120 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
34130 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
34140 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34150 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34160 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
34170 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
34180 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
34190 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
341a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
341b0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
341c0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
341d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
341e0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
341f0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
34200 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
34210 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
34220 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
34230 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
34240 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
34250 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
34260 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
34270 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
34280 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
34290 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
342a0 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
342b0 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
342c0 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
342d0 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
342e0 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
342f0 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
34300 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
34310 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
34320 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
34330 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
34340 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
34350 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e    if( iNewTrunk>
34360 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20  mxPage ){ .     
34370 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
34380 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
34390 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
343a0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
343b0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
343c0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
343d0 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d  ase( iNewTrunk==
343e0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
343f0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
34400 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
34410 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
34420 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
34430 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34440 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34450 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
34460 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
34470 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
34480 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34490 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
344a0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
344b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
344c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
344d0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
344e0 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
344f0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
34500 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
34510 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
34520 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
34530 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
34540 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
34550 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
34560 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
34570 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
34580 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
34590 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
345a0 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
345b0 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
345c0 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
345d0 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
345e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
345f0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
34600 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
34610 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
34620 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
34630 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
34640 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
34650 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
34660 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
34670 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
34680 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
34690 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
346a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
346b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
346c0 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
346d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
346e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
346f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
34700 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
34710 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
34720 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
34730 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
34740 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
34750 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
34760 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
34770 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
34780 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
34790 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
347a0 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
347b0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
347c0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
347d0 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
347e0 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
347f0 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
34800 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
34810 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
34820 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
34830 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
34840 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
34850 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
34860 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
34870 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
34880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
34890 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63  2 i;.          c
348a0 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
348b0 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d        if( eMode=
348c0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
348d0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
348e0 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
348f0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
34900 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
34910 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20  Data[8+i*4]);.  
34920 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
34930 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b  iPage<=nearby ){
34940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34950 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
34960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
34970 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
34980 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
34990 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
349a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
349b0 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
349c0 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c        dist = sql
349d0 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
349e0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
349f0 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
34a00 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
34a10 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
34a20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
34a30 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
34a40 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
34a50 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
34a60 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
34a70 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
34a80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
34a90 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
34aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ab0 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
34ac0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
34ad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34ae0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
34af0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
34b00 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
34b10 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
34b20 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
34b30 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
34b40 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4]);.        tes
34b50 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
34b60 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
34b70 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
34b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
34b90 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
34ba0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
34bb0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
34bc0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
34bd0 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
34be0 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
34bf0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
34c00 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a  f( !searchList .
34c10 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61           || (iPa
34c20 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69  ge==nearby || (i
34c30 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65  Page<nearby && e
34c40 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
34c50 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  )) .        ){. 
34c60 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43           int noC
34c70 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  ontent;.        
34c80 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
34c90 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
34ca0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
34cb0 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
34cc0 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
34cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ce0 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
34cf0 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
34d00 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
34d10 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
34d20 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
34d30 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
34d40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
34d50 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
34d60 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
34d70 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
34d80 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
34d90 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  age;.          i
34da0 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
34db0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
34dc0 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
34dd0 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
34de0 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
34df0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34e00 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
34e10 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
34e20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74         noContent
34e30 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43   = !btreeGetHasC
34e40 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67  ontent(pBt, *pPg
34e50 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  no)? PAGER_GET_N
34e60 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20  OCONTENT : 0;.  
34e70 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
34e80 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
34e90 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
34ea0 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
34eb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
34ec0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34ed0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
34ee0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
34ef0 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
34f00 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
34f10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34f20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
34f30 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
34f40 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
34f50 20 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61             *ppPa
34f60 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
34f70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
34f80 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
34f90 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
34fa0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
34fb0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
34fc0 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
34fd0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
34fe0 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
34ff0 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
35000 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
35010 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
35020 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
35030 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77   so append a new
35040 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20   page to the.   
35050 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61   ** database ima
35060 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ge..    **.    *
35070 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20  * Normally, new 
35080 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  pages allocated 
35090 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61  by this block ca
350a0 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66  n be requested f
350b0 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  rom the.    ** p
350c0 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
350d0 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
350e0 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20   flag set. This 
350f0 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67  prevents the pag
35100 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  er.    ** from t
35110 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68  rying to read th
35120 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20  e pages content 
35130 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76  from disk. Howev
35140 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a  er, if the.    *
35150 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  * current transa
35160 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
35170 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72  y run one or mor
35180 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  e incremental-va
35190 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70  cuum.    ** step
351a0 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  s, then the page
351b0 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f   we are about to
351c0 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f   allocate may co
351d0 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20  ntain content.  
351e0 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71    ** that is req
351f0 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65  uired in the eve
35200 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  nt of a rollback
35210 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
35220 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65  do.    ** not se
35230 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  t the no-content
35240 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73   flag. This caus
35250 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
35260 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  load and journal
35270 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72  .    ** the curr
35280 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
35290 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74   before overwrit
352a0 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20  ing it..    **. 
352b0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
352c0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e  the pager will n
352d0 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65  ot actually atte
352e0 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a  mpt to load or j
352f0 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63  ournal .    ** c
35300 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70  ontent for any p
35310 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20  age that really 
35320 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68  does lie past th
35330 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
35340 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
35350 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68  e on disk. So th
35360 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73  e effects of dis
35370 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f  abling the no-co
35380 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69  ntent optimizati
35390 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61  on.    ** here a
353a0 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74  re confined to t
353b0 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20  hose pages that 
353c0 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  lie between the 
353d0 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
353e0 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
353f0 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20   and the end of 
35400 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35410 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  e..    */.    in
35420 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  t bNoContent = (
35430 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  0==IfNotOmitAV(p
35440 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
35450 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  )? PAGER_GET_NOC
35460 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72  ONTENT:0;..    r
35470 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
35480 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
35490 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
354a0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
354b0 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50   rc;.    pBt->nP
354c0 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  age++;.    if( p
354d0 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
354e0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
354f0 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b  ) ) pBt->nPage++
35500 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
35510 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
35520 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
35530 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
35540 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
35550 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20  pBt->nPage) ){. 
35560 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
35570 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
35580 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
35590 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
355a0 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
355b0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
355c0 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
355d0 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
355e0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
355f0 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
35600 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
35610 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
35620 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
35630 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
35640 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
35650 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
35660 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
35670 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
35680 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
35690 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70  -map page)\n", p
356a0 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20  Bt->nPage));.   
356b0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
356c0 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42  nPage!=PENDING_B
356d0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
356e0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
356f0 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
35700 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20  Bt, pBt->nPage, 
35710 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74  &pPg, bNoContent
35720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
35730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35740 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35750 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
35760 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
35770 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35780 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pPg);.      }.  
35790 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
357a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42  urn rc;.      pB
357b0 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  t->nPage++;.    
357c0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
357d0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
357e0 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d  AGE(pBt) ){ pBt-
357f0 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20  >nPage++; }.    
35800 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74  }.#endif.    put
35810 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29  4byte(28 + (u8*)
35820 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
35830 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ta, pBt->nPage);
35840 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42  .    *pPgno = pB
35850 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61  t->nPage;..    a
35860 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
35870 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
35880 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20  (pBt) );.    rc 
35890 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
358a0 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
358b0 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e  , ppPage, bNoCon
358c0 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  tent);.    if( r
358d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
358e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
358f0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
35900 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
35910 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35920 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
35930 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
35940 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67  e);.      *ppPag
35950 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
35960 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
35970 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
35980 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e  f file\n", *pPgn
35990 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  o));.  }..  asse
359a0 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
359b0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
359c0 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
359d0 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
359e0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
359f0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
35a00 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73  PrevTrunk);.  as
35a10 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
35a20 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  _OK || sqlite3Pa
35a30 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
35a40 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
35a50 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65  ge)<=1 );.  asse
35a60 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
35a70 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  K || (*ppPage)->
35a80 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72  isInit==0 );.  r
35a90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
35aa0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
35ab0 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
35ac0 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68  page iPage to th
35ad0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
35ae0 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49  free-list. .** I
35af0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
35b00 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
35b10 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74  t already a part
35b20 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   of the free-lis
35b30 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  t..**.** The val
35b40 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
35b50 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
35b60 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
35b70 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a  n is optional..*
35b80 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
35b90 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20  happens to have 
35ba0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
35bb0 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
35bc0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
35bd0 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20  g to page iPage 
35be0 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61  handy, it may pa
35bf0 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63  ss it as the sec
35c00 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f  ond value. .** O
35c10 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79  therwise, it may
35c20 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a   pass NULL..**.*
35c30 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74  * If a pointer t
35c40 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  o a MemPage obje
35c50 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ct is passed as 
35c60 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
35c70 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65  ent,.** its refe
35c80 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e  rence count is n
35c90 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68  ot altered by th
35ca0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
35cb0 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
35cc0 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70  age2(BtShared *p
35cd0 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65  Bt, MemPage *pMe
35ce0 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67  mPage, Pgno iPag
35cf0 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
35d00 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
35d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
35d20 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
35d30 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75  e */.  Pgno iTru
35d40 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
35d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
35d60 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  ge number of fre
35d70 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
35d80 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20  e */ .  MemPage 
35d90 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
35da0 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c  Page1;      /* L
35db0 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74  ocal reference t
35dc0 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65  o page 1 */.  Me
35dd0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
35de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35df0 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20    /* Page being 
35e00 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55  freed. May be NU
35e10 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  LL. */.  int rc;
35e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35e40 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
35e50 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
35e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e70 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
35e80 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
35e90 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  on free-list */.
35ea0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
35eb0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
35ec0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
35ed0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
35ee0 42 20 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a  B || iPage>1 );.
35ef0 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50    assert( !pMemP
35f00 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d  age || pMemPage-
35f10 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a  >pgno==iPage );.
35f20 0a 20 20 69 66 28 20 69 50 61 67 65 3c 32 20 29  .  if( iPage<2 )
35f30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
35f40 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69  ORRUPT_BKPT;.  i
35f50 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20  f( pMemPage ){. 
35f60 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50     pPage = pMemP
35f70 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  age;.    sqlite3
35f80 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e  PagerRef(pPage->
35f90 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  pDbPage);.  }els
35fa0 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62  e{.    pPage = b
35fb0 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
35fc0 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a  Bt, iPage);.  }.
35fd0 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
35fe0 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f  the free page co
35ff0 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f  unt on pPage1 */
36000 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
36010 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
36020 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
36030 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
36040 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65  page_out;.  nFre
36050 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  e = get4byte(&pP
36060 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
36070 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
36080 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
36090 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66   nFree+1);..  if
360a0 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
360b0 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
360c0 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ETE ){.    /* If
360d0 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
360e0 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  te option is ena
360f0 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  bled, then.    *
36100 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
36110 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
36120 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
36130 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a  h zeros..    */.
36140 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20      if( (!pPage 
36150 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47  && ((rc = btreeG
36160 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
36170 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d  e, &pPage, 0))!=
36180 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20  0) ).     ||    
36190 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73          ((rc = s
361a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
361b0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
361c0 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0).    ){.   
361d0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
361e0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
361f0 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
36200 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
36210 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
36220 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
36230 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
36240 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77  s auto-vacuum, w
36250 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
36260 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
36270 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
36280 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
36290 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  is free..  */.  
362a0 69 66 28 20 52 45 51 55 49 52 45 5f 50 54 52 4d  if( REQUIRE_PTRM
362b0 41 50 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70  AP ){.    ptrmap
362c0 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
362d0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
362e0 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66   0, &rc);.    if
362f0 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
36300 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
36310 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61   /* Now manipula
36320 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  te the actual da
36330 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
36340 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72   structure. Ther
36350 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70  e are two.  ** p
36360 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66  ossibilities. If
36370 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
36380 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74  s currently empt
36390 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72  y, or if the fir
363a0 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61  st.  ** trunk pa
363b0 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
363c0 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65  ist is full, the
363d0 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c  n this page will
363e0 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e   become a.  ** n
363f0 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  ew free-list tru
36400 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  nk page. Otherwi
36410 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f  se, it will beco
36420 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  me a leaf of the
36430 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
36440 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75  k page in the cu
36450 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e  rrent free-list.
36460 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
36470 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20  s if it.  ** is 
36480 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
36490 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65  the page as a ne
364a0 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  w free-list leaf
364b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ..  */.  if( nFr
364c0 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ee!=0 ){.    u32
364d0 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   nLeaf;         
364e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
364f0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  l number of leaf
36500 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20   cells on trunk 
36510 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72  page */..    iTr
36520 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
36530 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
36540 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  ]);.    rc = btr
36550 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
36560 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
36570 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
36580 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36590 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
365a0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
365b0 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
365c0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
365d0 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [4]);.    assert
365e0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
365f0 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20  e>32 );.    if( 
36600 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74  nLeaf > (u32)pBt
36610 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
36620 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   2 ){.      rc =
36630 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
36640 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
36650 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
36660 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65     }.    if( nLe
36670 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75  af < (u32)pBt->u
36680 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
36690 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
366a0 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
366b0 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72  s room on the tr
366c0 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65  unk page to inse
366d0 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rt the page.    
366e0 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64    ** being freed
366f0 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a   as a new leaf..
36700 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
36710 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
36720 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
36730 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
36740 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
36750 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
36760 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
36770 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
36780 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
36790 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
367a0 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
367b0 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
367c0 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
367d0 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
367e0 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
367f0 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
36800 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
36810 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
36820 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
36830 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
36840 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
36850 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
36860 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
36870 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
36880 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
36890 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
368a0 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
368b0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
368c0 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
368d0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73   continue to res
368e0 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
368f0 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
36900 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
36910 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
36920 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
36930 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
36940 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
36950 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
36960 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
36970 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
36980 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
36990 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
369a0 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
369b0 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
369c0 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
369d0 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
369e0 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  4-8"..      **. 
369f0 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
36a00 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35  -OF: R-19920-115
36a10 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65  76 However, newe
36a20 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
36a30 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20  Lite still.     
36a40 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20   ** avoid using 
36a50 74 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74  the last six ent
36a60 72 69 65 73 20 69 6e 20 74 68 65 20 66 72 65 65  ries in the free
36a70 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
36a80 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a  array in.      *
36a90 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64 61 74  * order that dat
36aa0 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61  abase files crea
36ab0 74 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72  ted by newer ver
36ac0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
36ad0 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  can be.      ** 
36ae0 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65  read by older ve
36af0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
36b00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
36b10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
36b20 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
36b30 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
36b40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36b50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
36b60 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
36b70 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
36b80 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
36b90 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
36ba0 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
36bb0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
36bc0 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42 74  f( pPage && (pBt
36bd0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
36be0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d  _SECURE_DELETE)=
36bf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
36c00 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
36c10 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
36c20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
36c30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
36c40 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeSetHasContent
36c50 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
36c60 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
36c70 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
36c80 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
36c90 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
36ca0 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
36cb0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  gno));.      got
36cc0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
36cd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
36ce0 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73  If control flows
36cf0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
36d00 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20  then it was not 
36d10 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
36d20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  the.  ** the pag
36d30 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  e being freed as
36d40 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20   a leaf page of 
36d50 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
36d60 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
36d70 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  ..  ** Possibly 
36d80 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65  because the free
36d90 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20  -list is empty, 
36da0 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61  or possibly beca
36db0 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  use the .  ** fi
36dc0 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
36dd0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
36de0 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ll. Either way, 
36df0 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
36e00 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  reed.  ** will b
36e10 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69  ecome the new fi
36e20 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
36e30 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
36e40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
36e50 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  e==0 && SQLITE_O
36e60 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65  K!=(rc = btreeGe
36e70 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
36e80 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b  , &pPage, 0)) ){
36e90 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
36ea0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63  ge_out;.  }.  rc
36eb0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
36ec0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
36ed0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
36ee0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36ef0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
36f00 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  ut;.  }.  put4by
36f10 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
36f20 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34   iTrunk);.  put4
36f30 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
36f40 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74  ta[4], 0);.  put
36f50 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
36f60 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29  Data[32], iPage)
36f70 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45  ;.  TRACE(("FREE
36f80 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
36f90 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
36fa0 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  ng %d\n", pPage-
36fb0 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b  >pgno, iTrunk));
36fc0 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a  ..freepage_out:.
36fd0 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
36fe0 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
36ff0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65   = 0;.  }.  rele
37000 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
37010 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
37020 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  runk);.  return 
37030 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rc;.}.static voi
37040 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  d freePage(MemPa
37050 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a  ge *pPage, int *
37060 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
37070 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
37080 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65  .    *pRC = free
37090 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74  Page2(pPage->pBt
370a0 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  , pPage, pPage->
370b0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pgno);.  }.}../*
370c0 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65  .** Free any ove
370d0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
370e0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
370f0 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69  given Cell.  Wri
37100 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20  te the.** local 
37110 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65 20 6e  Cell size (the n
37120 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
37130 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  n the original p
37140 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a  age, omitting.**
37150 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20   overflow) into 
37160 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  *pnSize..*/.stat
37170 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
37180 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
37190 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
371a0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
371b0 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20  ntains the Cell 
371c0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
371d0 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a  ar *pCell,    /*
371e0 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
371f0 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 43 65 6c  he Cell */.  Cel
37200 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
37210 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e        /* Size in
37220 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
37230 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20  the cell */.){. 
37240 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
37250 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
37260 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
37270 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
37280 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50  vfl;.  u32 ovflP
37290 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
372a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
372b0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
372c0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
372d0 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
372e0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
372f0 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 70 49 6e  Info);.  if( pIn
37300 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66  fo->nLocal==pInf
37310 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20  o->nPayload ){. 
37320 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37330 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
37340 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
37350 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
37360 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
37370 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 70 49 6e  .  if( pCell+pIn
37380 66 6f 2d 3e 6e 53 69 7a 65 2d 31 20 3e 20 70 50  fo->nSize-1 > pP
37390 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
373a0 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20  ->maskPage ){.  
373b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
373c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f  CORRUPT_BKPT;  /
373d0 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70  * Cell extends p
373e0 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20  ast end of page 
373f0 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
37400 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
37410 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  ll + pInfo->nSiz
37420 65 20 2d 20 34 29 3b 0a 20 20 61 73 73 65 72 74  e - 4);.  assert
37430 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
37440 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
37450 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
37460 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
37470 20 6e 4f 76 66 6c 20 3d 20 28 70 49 6e 66 6f 2d   nOvfl = (pInfo-
37480 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 70 49 6e 66  >nPayload - pInf
37490 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c  o->nLocal + ovfl
374a0 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76  PageSize - 1)/ov
374b0 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  flPageSize;.  as
374c0 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c  sert( nOvfl>0 ||
374d0 20 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44   .    (CORRUPT_D
374e0 42 20 26 26 20 28 70 49 6e 66 6f 2d 3e 6e 50 61  B && (pInfo->nPa
374f0 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65  yload + ovflPage
37500 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69  Size)<ovflPageSi
37510 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65  ze).  );.  while
37520 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
37530 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b   Pgno iNext = 0;
37540 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
37550 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  vfl = 0;.    if(
37560 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f   ovflPgno<2 || o
37570 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67  vflPgno>btreePag
37580 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
37590 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74       /* 0 is not
375a0 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75   a legal page nu
375b0 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20  mber and page 1 
375c0 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20  cannot be an .  
375d0 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
375e0 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20  page. Therefore 
375f0 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72  if ovflPgno<2 or
37600 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
37610 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66   the .      ** f
37620 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ile the database
37630 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
37640 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
37650 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
37660 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
37670 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20   if( nOvfl ){.  
37680 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
37690 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76  flowPage(pBt, ov
376a0 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20  flPgno, &pOvfl, 
376b0 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69  &iNext);.      i
376c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
376d0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
376e0 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70  ( ( pOvfl || ((p
376f0 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65  Ovfl = btreePage
37700 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c  Lookup(pBt, ovfl
37710 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20  Pgno))!=0) ).   
37720 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
37730 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f  rPageRefcount(pO
37740 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31  vfl->pDbPage)!=1
37750 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
37760 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61   There is no rea
37770 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73  son any cursor s
37780 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75  hould have an ou
37790 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
377a0 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  nce .      ** to
377b0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
377c0 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
377d0 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65   cell that is be
377e0 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61  ing deleted/upda
377f0 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f  ted..      ** So
37800 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
37810 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
37820 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73  eference to this
37830 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a   page, then it .
37840 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f        ** must no
37850 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f  t really be an o
37860 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64  verflow page and
37870 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
37880 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a  st be corrupt. .
37890 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68        ** It is h
378a0 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74  elpful to detect
378b0 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c   this before cal
378c0 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29  ling freePage2()
378d0 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  , as .      ** f
378e0 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a  reePage2() may z
378f0 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ero the page con
37900 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d  tents if secure-
37910 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20  delete mode is. 
37920 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e       ** enabled.
37930 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c   If this 'overfl
37940 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73  ow' page happens
37950 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68   to be a page th
37960 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
37970 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74  caller is iterat
37980 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75  ing through or u
37990 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68  sing in some oth
379a0 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20  er way, this.   
379b0 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f     ** can be pro
379c0 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20  blematic..      
379d0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
379e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
379f0 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
37a00 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
37a10 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f  e2(pBt, pOvfl, o
37a20 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  vflPgno);.    }.
37a30 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29  .    if( pOvfl )
37a40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
37a50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
37a60 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
37a70 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
37a80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66  turn rc;.    ovf
37a90 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20  lPgno = iNext;. 
37aa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
37ab0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
37ac0 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
37ad0 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
37ae0 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
37af0 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
37b00 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
37b10 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
37b20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
37b30 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
37b40 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
37b50 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
37b60 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
37b70 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
37b80 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
37b90 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
37ba0 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
37bb0 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
37bc0 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
37bd0 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
37be0 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
37bf0 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
37c00 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
37c10 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
37c20 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
37c30 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
37c40 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
37c50 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
37c60 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
37c70 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
37c80 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
37c90 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
37ca0 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
37cb0 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
37cc0 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
37cd0 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
37ce0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
37cf0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
37d00 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
37d10 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
37d20 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
37d30 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
37d40 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
37d50 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
37d60 6e 73 74 20 42 74 72 65 65 50 61 79 6c 6f 61 64  nst BtreePayload
37d70 20 2a 70 58 2c 20 20 20 20 20 20 20 20 2f 2a 20   *pX,        /* 
37d80 50 61 79 6c 6f 61 64 20 77 69 74 68 20 77 68 69  Payload with whi
37d90 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  ch to construct 
37da0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
37db0 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
37dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37dd0 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
37de0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
37df0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
37e00 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
37e10 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
37e20 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
37e30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
37e40 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
37e50 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
37e60 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
37e70 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
37e80 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
37e90 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
37ea0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
37eb0 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
37ec0 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
37ed0 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65 72  Header;..  asser
37ee0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
37ef0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
37f00 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
37f10 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
37f20 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
37f30 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
37f40 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
37f50 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
37f60 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
37f70 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
37f80 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
37f90 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
37fa0 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
37fb0 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
37fc0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
37fd0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
37fe0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
37ff0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
38000 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
38010 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
38020 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
38030 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67    nHeader = pPag
38040 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
38050 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
38060 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50 61 79  tKey ){.    nPay
38070 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e 44 61 74 61  load = pX->nData
38080 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20   + pX->nZero;.  
38090 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 44 61    pSrc = pX->pDa
380a0 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 70  ta;.    nSrc = p
380b0 58 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20 61 73  X->nData;.    as
380c0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
380d0 4b 65 79 4c 65 61 66 20 29 3b 20 2f 2a 20 66 69  KeyLeaf ); /* fi
380e0 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20  llInCell() only 
380f0 63 61 6c 6c 65 64 20 66 6f 72 20 6c 65 61 76 65  called for leave
38100 73 20 2a 2f 0a 20 20 20 20 6e 48 65 61 64 65 72  s */.    nHeader
38110 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28   += putVarint32(
38120 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
38130 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
38140 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
38150 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
38160 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 70 58  der], *(u64*)&pX
38170 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65  ->nKey);.  }else
38180 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58  {.    assert( pX
38190 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66 66  ->nKey<=0x7fffff
381a0 66 66 20 26 26 20 70 58 2d 3e 70 4b 65 79 21 3d  ff && pX->pKey!=
381b0 30 20 29 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  0 );.    nSrc = 
381c0 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29  nPayload = (int)
381d0 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 53  pX->nKey;.    pS
381e0 72 63 20 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a 20  rc = pX->pKey;. 
381f0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
38200 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
38210 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c  [nHeader], nPayl
38220 6f 61 64 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  oad);.  }.  .  /
38230 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
38240 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 66 28 20 6e  yload */.  if( n
38250 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
38260 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
38270 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50  n = nHeader + nP
38280 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74  ayload;.    test
38290 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20  case( n==3 );.  
382a0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34    testcase( n==4
382b0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20   );.    if( n<4 
382c0 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e  ) n = 4;.    *pn
382d0 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70  Size = n;.    sp
382e0 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f  aceLeft = nPaylo
382f0 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d  ad;.    pPrior =
38300 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b   pCell;.  }else{
38310 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50  .    int mn = pP
38320 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
38330 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61     n = mn + (nPa
38340 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70  yload - mn) % (p
38350 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
38360 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
38370 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
38380 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
38390 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
383a0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
383b0 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20  +1 );.    if( n 
383c0 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  > pPage->maxLoca
383d0 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20  l ) n = mn;.    
383e0 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20  spaceLeft = n;. 
383f0 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b     *pnSize = n +
38400 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20   nHeader + 4;.  
38410 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c    pPrior = &pCel
38420 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20  l[nHeader+n];.  
38430 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  }.  pPayload = &
38440 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
38450 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
38460 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68  int variables sh
38470 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66  ould be set as f
38480 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a