/ Hex Artifact Content
Login

Artifact ed1faebf703afaccf51ed64a5b50faa9491a6be7129c74bf85e73919fd904c7f:


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 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
3e40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3e50: 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a 0a 2a  _CONCURRENT./*.*
3e60: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3e70: 73 74 72 75 63 74 75 72 65 20 2d 20 42 74 72 65  structure - Btre
3e80: 65 50 74 72 6d 61 70 20 2d 20 73 74 6f 72 65 73  ePtrmap - stores
3e90: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   the in-memory p
3ea0: 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a 20 75 73  ointer map.** us
3eb0: 65 64 20 66 6f 72 20 6e 65 77 6c 79 20 61 6c 6c  ed for newly all
3ec0: 6f 63 61 74 65 64 20 70 61 67 65 73 20 69 6e 20  ocated pages in 
3ed0: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
3ee0: 61 63 74 69 6f 6e 73 2e 20 53 75 63 68 20 70 61  actions. Such pa
3ef0: 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  ges are.** alway
3f00: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61  s allocated in a
3f10: 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f 63   contiguous bloc
3f20: 6b 20 28 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  k (from the end 
3f30: 6f 66 20 74 68 65 20 66 69 6c 65 29 20 73 74 61  of the file) sta
3f40: 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68 20 70 61  rting.** with pa
3f50: 67 65 20 42 74 72 65 65 50 74 72 6d 61 70 2e 69  ge BtreePtrmap.i
3f60: 46 69 72 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65  First..*/.typede
3f70: 66 20 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63  f struct Rollbac
3f80: 6b 45 6e 74 72 79 20 52 6f 6c 6c 62 61 63 6b 45  kEntry RollbackE
3f90: 6e 74 72 79 3b 0a 74 79 70 65 64 65 66 20 73 74  ntry;.typedef st
3fa0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fb0: 20 50 74 72 6d 61 70 45 6e 74 72 79 3b 0a 73 74   PtrmapEntry;.st
3fc0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fd0: 20 7b 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e 74   {.  Pgno parent
3fe0: 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a 7d 3b  ;.  u8 eType;.};
3ff0: 0a 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63 6b  .struct Rollback
4000: 45 6e 74 72 79 20 7b 0a 20 20 50 67 6e 6f 20 70  Entry {.  Pgno p
4010: 67 6e 6f 3b 0a 20 20 50 67 6e 6f 20 70 61 72 65  gno;.  Pgno pare
4020: 6e 74 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a  nt;.  u8 eType;.
4030: 7d 3b 0a 73 74 72 75 63 74 20 42 74 72 65 65 50  };.struct BtreeP
4040: 74 72 6d 61 70 20 7b 0a 20 20 50 67 6e 6f 20 69  trmap {.  Pgno i
4050: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
4060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4070: 73 74 20 6e 65 77 20 70 61 67 65 20 6e 75 6d 62  st new page numb
4080: 65 72 20 61 50 74 72 5b 30 5d 20 2a 2f 0a 0a 20  er aPtr[0] */.. 
4090: 20 69 6e 74 20 6e 50 74 72 41 6c 6c 6f 63 3b 20   int nPtrAlloc; 
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40b0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
40c0: 7a 65 20 6f 66 20 61 50 74 72 5b 5d 20 61 72 72  ze of aPtr[] arr
40d0: 61 79 20 2a 2f 0a 20 20 50 74 72 6d 61 70 45 6e  ay */.  PtrmapEn
40e0: 74 72 79 20 2a 61 50 74 72 3b 20 20 20 20 20 20  try *aPtr;      
40f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
4100: 20 6f 66 20 70 61 72 65 6e 74 20 70 61 67 65 20   of parent page 
4110: 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 69 6e  numbers */..  in
4120: 74 20 6e 53 76 70 74 3b 20 20 20 20 20 20 20 20  t nSvpt;        
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4140: 20 55 73 65 64 20 73 69 7a 65 20 6f 66 20 61 53   Used size of aS
4150: 76 70 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  vpt[] array */. 
4160: 20 69 6e 74 20 6e 53 76 70 74 41 6c 6c 6f 63 3b   int nSvptAlloc;
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
4190: 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d 20 2a 2f  ze of aSvpt[] */
41a0: 0a 20 20 69 6e 74 20 2a 61 53 76 70 74 3b 20 20  .  int *aSvpt;  
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 52 6f 6c     /* First aRol
41d0: 6c 62 61 63 6b 5b 5d 20 65 6e 74 72 79 20 66 6f  lback[] entry fo
41e0: 72 20 73 61 76 65 70 6f 69 6e 74 20 69 20 2a 2f  r savepoint i */
41f0: 0a 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c 62 61 63  ..  int nRollbac
4200: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
4210: 20 20 20 20 2f 2a 20 55 73 65 64 20 73 69 7a 65      /* Used size
4220: 20 6f 66 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20   of aRollback[] 
4230: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
4240: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 3b 20 20  RollbackAlloc;  
4250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
4260: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
4270: 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20 61 72 72 61  aRollback[] arra
4280: 79 20 2a 2f 0a 20 20 52 6f 6c 6c 62 61 63 6b 45  y */.  RollbackE
4290: 6e 74 72 79 20 2a 61 52 6f 6c 6c 62 61 63 6b 3b  ntry *aRollback;
42a0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
42b0: 6f 66 20 72 6f 6c 6c 62 61 63 6b 20 65 6e 74 72  of rollback entr
42c0: 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 21 64  ies */.};../* !d
42d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
42e0: 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a  IT_CONCURRENT).*
42f0: 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 6e 75 6d  *.** If page num
4300: 62 65 72 20 70 67 6e 6f 20 69 73 20 67 72 65 61  ber pgno is grea
4310: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
4320: 6c 20 74 6f 20 42 74 72 65 65 50 74 72 6d 61 70  l to BtreePtrmap
4330: 2e 69 46 69 72 73 74 2c 20 0a 2a 2a 20 73 74 6f  .iFirst, .** sto
4340: 72 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  re an entry for 
4350: 69 74 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  it in the pointe
4360: 72 2d 6d 61 70 20 73 74 72 75 63 74 75 72 65 2e  r-map structure.
4370: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4380: 74 72 65 65 50 74 72 6d 61 70 53 74 6f 72 65 28  treePtrmapStore(
4390: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
43a0: 2c 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 0a 20  ,.  Pgno pgno,. 
43b0: 20 75 38 20 65 54 79 70 65 2c 20 0a 20 20 50 67   u8 eType, .  Pg
43c0: 6e 6f 20 70 61 72 65 6e 74 0a 29 7b 0a 20 20 42  no parent.){.  B
43d0: 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70  treePtrmap *pMap
43e0: 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20   = pBt->pMap;.  
43f0: 69 66 28 20 70 67 6e 6f 3e 3d 70 4d 61 70 2d 3e  if( pgno>=pMap->
4400: 69 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 6e  iFirst ){.    in
4410: 74 20 69 45 6e 74 72 79 20 3d 20 70 67 6e 6f 20  t iEntry = pgno 
4420: 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 3b 0a  - pMap->iFirst;.
4430: 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
4440: 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20 61 73   aPtr[] array as
4450: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
4460: 20 77 68 69 6c 65 28 20 69 45 6e 74 72 79 3e 3d   while( iEntry>=
4470: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20  pMap->nPtrAlloc 
4480: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  ){.      int nNe
4490: 77 20 3d 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c  w = pMap->nPtrAl
44a0: 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e 6e 50 74 72  loc ? pMap->nPtr
44b0: 41 6c 6c 6f 63 2a 32 20 3a 20 31 36 3b 0a 20 20  Alloc*2 : 16;.  
44c0: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
44d0: 2a 61 4e 65 77 20 3d 20 28 50 74 72 6d 61 70 45  *aNew = (PtrmapE
44e0: 6e 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65  ntry*)sqlite3_re
44f0: 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
4500: 20 70 4d 61 70 2d 3e 61 50 74 72 2c 20 6e 4e 65   pMap->aPtr, nNe
4510: 77 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45  w*sizeof(PtrmapE
4520: 6e 74 72 79 29 0a 20 20 20 20 20 20 29 3b 0a 20  ntry).      );. 
4530: 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
4540: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4550: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
4560: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4570: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
4580: 3d 20 28 6e 4e 65 77 2d 70 4d 61 70 2d 3e 6e 50  = (nNew-pMap->nP
4590: 74 72 41 6c 6c 6f 63 29 2a 73 69 7a 65 6f 66 28  trAlloc)*sizeof(
45a0: 50 74 72 6d 61 70 45 6e 74 72 79 29 3b 0a 20 20  PtrmapEntry);.  
45b0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e        memset(&aN
45c0: 65 77 5b 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c  ew[pMap->nPtrAll
45d0: 6f 63 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  oc], 0, nByte);.
45e0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 50          pMap->aP
45f0: 74 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  tr = aNew;.     
4600: 20 20 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c     pMap->nPtrAll
4610: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  oc = nNew;.     
4620: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
4630: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
4640: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f   the rollback lo
4650: 67 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  g if required */
4660: 0a 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e  .    if( pMap->n
4670: 53 76 70 74 3e 30 20 26 26 20 70 4d 61 70 2d 3e  Svpt>0 && pMap->
4680: 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72  aPtr[iEntry].par
4690: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
46a0: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
46b0: 3e 3d 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  >=pMap->nRollbac
46c0: 6b 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  kAlloc ){.      
46d0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61    int nNew = pMa
46e0: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20 3f 20 70  p->nRollback ? p
46f0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2a 32  Map->nRollback*2
4700: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 20 20 52   : 16;.        R
4710: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 2a 61 4e  ollbackEntry *aN
4720: 65 77 20 3d 20 28 52 6f 6c 6c 62 61 63 6b 45 6e  ew = (RollbackEn
4730: 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  try*)sqlite3_rea
4740: 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
4750: 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63    pMap->aRollbac
4760: 6b 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 52  k, nNew*sizeof(R
4770: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 29 0a 20 20  ollbackEntry).  
4780: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
4790: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
47a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
47b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
47c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
47d0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52          pMap->aR
47e0: 6f 6c 6c 62 61 63 6b 20 3d 20 61 4e 65 77 3b 0a  ollback = aNew;.
47f0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e            pMap->
4800: 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 3d  nRollbackAlloc =
4810: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
4820: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
4830: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4840: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d  pMap->nRollback]
4850: 2e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  .pgno = pgno;.  
4860: 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62      pMap->aRollb
4870: 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62  ack[pMap->nRollb
4880: 61 63 6b 5d 2e 70 61 72 65 6e 74 20 3d 20 70 4d  ack].parent = pM
4890: 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d  ap->aPtr[iEntry]
48a0: 2e 70 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 70  .parent;.      p
48b0: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70  Map->aRollback[p
48c0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e  Map->nRollback].
48d0: 65 54 79 70 65 20 3d 20 70 4d 61 70 2d 3e 61 50  eType = pMap->aP
48e0: 74 72 5b 69 45 6e 74 72 79 5d 2e 65 54 79 70 65  tr[iEntry].eType
48f0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4900: 6f 6c 6c 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 7d  ollback++;.    }
4910: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
4920: 74 68 65 20 61 50 74 72 5b 5d 20 61 72 72 61 79  the aPtr[] array
4930: 20 2a 2f 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50   */.    pMap->aP
4940: 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e  tr[iEntry].paren
4950: 74 20 3d 20 70 61 72 65 6e 74 3b 0a 20 20 20 20  t = parent;.    
4960: 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72  pMap->aPtr[iEntr
4970: 79 5d 2e 65 54 79 70 65 20 3d 20 65 54 79 70 65  y].eType = eType
4980: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4990: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
49a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
49b0: 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
49c0: 29 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 73 61 76  ).**.** Open sav
49d0: 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  epoint iSavepoin
49e0: 74 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  t, if it is not 
49f0: 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 0a 2a 2f  already open..*/
4a00: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4a10: 65 50 74 72 6d 61 70 42 65 67 69 6e 28 42 74 53  ePtrmapBegin(BtS
4a20: 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
4a30: 6e 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50  nSvpt){.  BtreeP
4a40: 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
4a50: 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70  t->pMap;.  if( p
4a60: 4d 61 70 20 26 26 20 6e 53 76 70 74 3e 70 4d 61  Map && nSvpt>pMa
4a70: 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20  p->nSvpt ){.    
4a80: 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e  int i;.    if( n
4a90: 53 76 70 74 3e 3d 70 4d 61 70 2d 3e 6e 53 76 70  Svpt>=pMap->nSvp
4aa0: 74 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  tAlloc ){.      
4ab0: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d  int nNew = pMap-
4ac0: 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3f 20 70 4d  >nSvptAlloc ? pM
4ad0: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 2a 32  ap->nSvptAlloc*2
4ae0: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 69 6e 74   : 16;.      int
4af0: 20 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *aNew = sqlite3
4b00: 5f 72 65 61 6c 6c 6f 63 28 70 4d 61 70 2d 3e 61  _realloc(pMap->a
4b10: 53 76 70 74 2c 20 73 69 7a 65 6f 66 28 69 6e 74  Svpt, sizeof(int
4b20: 29 20 2a 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  ) * nNew);.     
4b30: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
4b40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
4b50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4b60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4b70: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 20 3d 20    pMap->aSvpt = 
4b80: 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4d  aNew;.        pM
4b90: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3d  ap->nSvptAlloc =
4ba0: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   nNew;.      }. 
4bb0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
4bc0: 70 4d 61 70 2d 3e 6e 53 76 70 74 3b 20 69 3c 6e  pMap->nSvpt; i<n
4bd0: 53 76 70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Svpt; i++){.    
4be0: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 5d    pMap->aSvpt[i]
4bf0: 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61   = pMap->nRollba
4c00: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  ck;.    }.    pM
4c10: 61 70 2d 3e 6e 53 76 70 74 20 3d 20 6e 53 76 70  ap->nSvpt = nSvp
4c20: 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
4c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4c40: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
4c50: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
4c60: 54 29 0a 2a 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  T).**.** Rollbac
4c70: 6b 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50 4f  k (if op==SAVEPO
4c80: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 6f 72  INT_ROLLBACK) or
4c90: 20 72 65 6c 65 61 73 65 20 28 69 66 20 6f 70 3d   release (if op=
4ca0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
4cb0: 53 45 29 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  SE).** savepoint
4cc0: 20 69 53 76 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   iSvpt..*/.stati
4cd0: 63 20 76 6f 69 64 20 62 74 72 65 65 50 74 72 6d  c void btreePtrm
4ce0: 61 70 45 6e 64 28 42 74 53 68 61 72 65 64 20 2a  apEnd(BtShared *
4cf0: 70 42 74 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74  pBt, int op, int
4d00: 20 69 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65   iSvpt){.  Btree
4d10: 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
4d20: 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20  Bt->pMap;.  if( 
4d30: 70 4d 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65  pMap ){.    asse
4d40: 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
4d50: 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 6f 70  T_ROLLBACK || op
4d60: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
4d70: 41 53 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ASE );.    asser
4d80: 74 28 20 69 53 76 70 74 3e 3d 30 20 7c 7c 20 28  t( iSvpt>=0 || (
4d90: 69 53 76 70 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  iSvpt==-1 && op=
4da0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
4db0: 41 43 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ACK) );.    if( 
4dc0: 69 53 76 70 74 3c 30 20 29 7b 0a 20 20 20 20 20  iSvpt<0 ){.     
4dd0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 30   pMap->nSvpt = 0
4de0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4df0: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  ollback = 0;.   
4e00: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2d 3e     memset(pMap->
4e10: 61 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aPtr, 0, sizeof(
4e20: 50 67 6e 6f 29 20 2a 20 70 4d 61 70 2d 3e 6e 50  Pgno) * pMap->nP
4e30: 74 72 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 65  trAlloc);.    }e
4e40: 6c 73 65 20 69 66 28 20 69 53 76 70 74 3c 70 4d  lse if( iSvpt<pM
4e50: 61 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20  ap->nSvpt ){.   
4e60: 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
4e70: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
4e80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
4e90: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
4ea0: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2d  pMap->nRollback-
4eb0: 31 3b 20 69 69 3e 3d 70 4d 61 70 2d 3e 61 53 76  1; ii>=pMap->aSv
4ec0: 70 74 5b 69 53 76 70 74 5d 3b 20 69 69 2d 2d 29  pt[iSvpt]; ii--)
4ed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 52 6f 6c 6c  {.          Roll
4ee0: 62 61 63 6b 45 6e 74 72 79 20 2a 70 20 3d 20 26  backEntry *p = &
4ef0: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4f00: 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 50  ii];.          P
4f10: 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74  trmapEntry *pEnt
4f20: 72 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72  ry = &pMap->aPtr
4f30: 5b 70 2d 3e 70 67 6e 6f 20 2d 20 70 4d 61 70 2d  [p->pgno - pMap-
4f40: 3e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20  >iFirst];.      
4f50: 20 20 20 20 70 45 6e 74 72 79 2d 3e 70 61 72 65      pEntry->pare
4f60: 6e 74 20 3d 20 70 2d 3e 70 61 72 65 6e 74 3b 0a  nt = p->parent;.
4f70: 20 20 20 20 20 20 20 20 20 20 70 45 6e 74 72 79            pEntry
4f80: 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79  ->eType = p->eTy
4f90: 70 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pe;.        }.  
4fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 61 70      }.      pMap
4fb0: 2d 3e 6e 53 76 70 74 20 3d 20 69 53 76 70 74 20  ->nSvpt = iSvpt 
4fc0: 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  + (op==SAVEPOINT
4fd0: 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
4fe0: 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63    pMap->nRollbac
4ff0: 6b 20 3d 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b  k = pMap->aSvpt[
5000: 69 53 76 70 74 5d 3b 0a 20 20 20 20 7d 0a 20 20  iSvpt];.    }.  
5010: 7d 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64  }.}../* !defined
5020: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e  (SQLITE_OMIT_CON
5030: 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54  CURRENT).**.** T
5040: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
5050: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20  called after an 
5060: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
5070: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64  action is opened
5080: 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
5090: 61 73 65 2e 20 49 74 20 61 6c 6c 6f 63 61 74 65  ase. It allocate
50a0: 73 20 74 68 65 20 42 74 72 65 65 50 74 72 6d 61  s the BtreePtrma
50b0: 70 20 73 74 72 75 63 74 75 72 65 20 75 73 65 64  p structure used
50c0: 20 74 6f 20 74 72 61 63 6b 20 70 6f 69 6e 74 65   to track pointe
50d0: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74  rs.** to allocat
50e0: 65 64 20 70 61 67 65 73 20 61 6e 64 20 7a 65 72  ed pages and zer
50f0: 6f 65 73 20 74 68 65 20 6e 46 72 65 65 2f 69 54  oes the nFree/iT
5100: 72 75 6e 6b 20 66 69 65 6c 64 73 20 69 6e 20 74  runk fields in t
5110: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
5120: 68 65 61 64 65 72 20 6f 6e 20 70 61 67 65 20 31  header on page 1
5130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5140: 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63  btreePtrmapAlloc
5150: 61 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ate(BtShared *pB
5160: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
5170: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
5180: 70 42 74 2d 3e 70 4d 61 70 3d 3d 30 20 29 7b 0a  pBt->pMap==0 ){.
5190: 20 20 20 20 42 74 72 65 65 50 74 72 6d 61 70 20      BtreePtrmap 
51a0: 2a 70 4d 61 70 20 3d 20 73 71 6c 69 74 65 33 5f  *pMap = sqlite3_
51b0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74  malloc(sizeof(Bt
51c0: 72 65 65 50 74 72 6d 61 70 29 29 3b 0a 20 20 20  reePtrmap));.   
51d0: 20 69 66 28 20 70 4d 61 70 3d 3d 30 20 29 7b 0a   if( pMap==0 ){.
51e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
51f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
5200: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
5210: 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
5220: 44 61 74 61 5b 33 32 5d 2c 20 30 2c 20 73 69 7a  Data[32], 0, siz
5230: 65 6f 66 28 75 33 32 29 2a 32 29 3b 0a 20 20 20  eof(u32)*2);.   
5240: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2c 20     memset(pMap, 
5250: 30 2c 20 73 69 7a 65 6f 66 28 42 74 72 65 65 50  0, sizeof(BtreeP
5260: 74 72 6d 61 70 29 29 3b 0a 20 20 20 20 20 20 70  trmap));.      p
5270: 4d 61 70 2d 3e 69 46 69 72 73 74 20 3d 20 70 42  Map->iFirst = pB
5280: 74 2d 3e 6e 50 61 67 65 20 2b 20 31 3b 0a 20 20  t->nPage + 1;.  
5290: 20 20 20 20 70 42 74 2d 3e 70 4d 61 70 20 3d 20      pBt->pMap = 
52a0: 70 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pMap;.    }.  }.
52b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
52c0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
52d0: 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
52e0: 4e 54 29 0a 2a 2a 0a 2a 2a 20 46 72 65 65 20 61  NT).**.** Free a
52f0: 6e 79 20 42 74 72 65 65 50 74 72 6d 61 70 20 73  ny BtreePtrmap s
5300: 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74  tructure allocat
5310: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
5320: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 62 74 72 65   call to.** btre
5330: 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28  ePtrmapAllocate(
5340: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
5350: 64 20 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c  d btreePtrmapDel
5360: 65 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ete(BtShared *pB
5370: 74 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61  t){.  BtreePtrma
5380: 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70  p *pMap = pBt->p
5390: 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20  Map;.  if( pMap 
53a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
53b0: 72 65 65 28 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62  ree(pMap->aRollb
53c0: 61 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ack);.    sqlite
53d0: 33 5f 66 72 65 65 28 70 4d 61 70 2d 3e 61 50 74  3_free(pMap->aPt
53e0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
53f0: 66 72 65 65 28 70 4d 61 70 2d 3e 61 53 76 70 74  free(pMap->aSvpt
5400: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
5410: 72 65 65 28 70 4d 61 70 29 3b 0a 20 20 20 20 70  ree(pMap);.    p
5420: 42 74 2d 3e 70 4d 61 70 20 3d 20 30 3b 0a 20 20  Bt->pMap = 0;.  
5430: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  }.}../*.** Check
5440: 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65   that the pointe
5450: 72 2d 6d 61 70 20 64 6f 65 73 20 6e 6f 74 20 63  r-map does not c
5460: 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69  ontain any entri
5470: 65 73 20 77 69 74 68 20 61 20 70 61 72 65 6e 74  es with a parent
5480: 0a 2a 2a 20 70 61 67 65 20 6f 66 20 30 2e 20 43  .** page of 0. C
5490: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  all sqlite3_log(
54a0: 29 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  ) multiple times
54b0: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 65   to output the e
54c0: 6e 74 69 72 65 0a 2a 2a 20 64 61 74 61 20 73 74  ntire.** data st
54d0: 72 75 63 74 75 72 65 20 69 66 20 69 74 20 64 6f  ructure if it do
54e0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
54f0: 69 64 20 62 74 72 65 65 50 74 72 6d 61 70 43 68  id btreePtrmapCh
5500: 65 63 6b 28 42 74 53 68 61 72 65 64 20 2a 70 42  eck(BtShared *pB
5510: 74 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  t, Pgno nPage){.
5520: 20 20 50 67 6e 6f 20 69 3b 0a 20 20 69 6e 74 20    Pgno i;.  int 
5530: 62 50 72 6f 62 6c 65 6d 20 3d 20 30 3b 0a 20 20  bProblem = 0;.  
5540: 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70 20 3d  BtreePtrmap *p =
5550: 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 0a 20 20 66   pBt->pMap;..  f
5560: 6f 72 28 69 3d 70 2d 3e 69 46 69 72 73 74 3b 20  or(i=p->iFirst; 
5570: 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  i<=nPage; i++){.
5580: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
5590: 2a 70 45 6e 74 72 79 20 3d 20 26 70 2d 3e 61 50  *pEntry = &p->aP
55a0: 74 72 5b 69 2d 70 2d 3e 69 46 69 72 73 74 5d 3b  tr[i-p->iFirst];
55b0: 0a 20 20 20 20 69 66 28 20 70 45 6e 74 72 79 2d  .    if( pEntry-
55c0: 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f  >eType==PTRMAP_O
55d0: 56 45 52 46 4c 4f 57 31 0a 20 20 20 20 20 7c 7c  VERFLOW1.     ||
55e0: 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 3d 3d   pEntry->eType==
55f0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
5600: 0a 20 20 20 20 20 7c 7c 20 70 45 6e 74 72 79 2d  .     || pEntry-
5610: 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42  >eType==PTRMAP_B
5620: 54 52 45 45 0a 20 20 20 20 29 7b 0a 20 20 20 20  TREE.    ){.    
5630: 20 20 69 66 28 20 70 45 6e 74 72 79 2d 3e 70 61    if( pEntry->pa
5640: 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rent==0 ){.     
5650: 20 20 20 62 50 72 6f 62 6c 65 6d 20 3d 20 31 3b     bProblem = 1;
5660: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5670: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5680: 7d 0a 0a 20 20 69 66 28 20 62 50 72 6f 62 6c 65  }..  if( bProble
5690: 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70  m ){.    for(i=p
56a0: 2d 3e 69 46 69 72 73 74 3b 20 69 3c 3d 6e 50 61  ->iFirst; i<=nPa
56b0: 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
56c0: 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e  PtrmapEntry *pEn
56d0: 74 72 79 20 3d 20 26 70 2d 3e 61 50 74 72 5b 69  try = &p->aPtr[i
56e0: 2d 70 2d 3e 69 46 69 72 73 74 5d 3b 0a 20 20 20  -p->iFirst];.   
56f0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
5700: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 0a  QLITE_CORRUPT, .
5710: 20 20 20 20 20 20 20 20 20 20 22 62 74 72 65 65            "btree
5720: 50 74 72 6d 61 70 43 68 65 63 6b 3a 20 70 67 6e  PtrmapCheck: pgn
5730: 6f 3d 25 64 20 65 54 79 70 65 3d 25 64 20 70 61  o=%d eType=%d pa
5740: 72 65 6e 74 3d 25 64 22 2c 20 0a 20 20 20 20 20  rent=%d", .     
5750: 20 20 20 20 20 28 69 6e 74 29 69 2c 20 28 69 6e       (int)i, (in
5760: 74 29 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c  t)pEntry->eType,
5770: 20 28 69 6e 74 29 70 45 6e 74 72 79 2d 3e 70 61   (int)pEntry->pa
5780: 72 65 6e 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  rent.      );.  
5790: 20 20 7d 0a 20 20 20 20 61 62 6f 72 74 28 29 3b    }.    abort();
57a0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 20 20 2f  .  }.}..#else  /
57b0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
57c0: 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 23 20 64 65  NCURRENT */.# de
57d0: 66 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70  fine btreePtrmap
57e0: 41 6c 6c 6f 63 61 74 65 28 78 29 20 53 51 4c 49  Allocate(x) SQLI
57f0: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 62  TE_OK.# define b
5800: 74 72 65 65 50 74 72 6d 61 70 44 65 6c 65 74 65  treePtrmapDelete
5810: 28 78 29 20 0a 23 20 64 65 66 69 6e 65 20 62 74  (x) .# define bt
5820: 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28 78  reePtrmapBegin(x
5830: 2c 79 29 20 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  ,y)  SQLITE_OK.#
5840: 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74 72   define btreePtr
5850: 6d 61 70 45 6e 64 28 78 2c 79 2c 7a 29 20 0a 23  mapEnd(x,y,z) .#
5860: 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74 72   define btreePtr
5870: 6d 61 70 43 68 65 63 6b 28 79 2c 7a 29 20 0a 23  mapCheck(y,z) .#
5880: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5890: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 20  OMIT_CONCURRENT 
58a0: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
58b0: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
58c0: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
58d0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
58e0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
58f0: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
5900: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
5910: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
5920: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5930: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
5940: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
5950: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
5960: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
5970: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
5980: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5990: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
59a0: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
59b0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
59c0: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
59d0: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
59e0: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
59f0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5a00: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
5a10: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
5a20: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
5a30: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
5a40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
5a50: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
5a60: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
5a70: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
5a80: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
5a90: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
5aa0: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
5ab0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
5ac0: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
5ad0: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
5ae0: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
5af0: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
5b00: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
5b10: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
5b20: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
5b30: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
5b40: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
5b50: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
5b60: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
5b70: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
5b80: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
5b90: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
5ba0: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
5bb0: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
5bc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5bd0: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
5be0: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
5bf0: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
5c00: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
5c10: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
5c20: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
5c30: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
5c40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
5c50: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
5c60: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
5c70: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
5c80: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
5c90: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
5ca0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
5cb0: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
5cc0: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
5cd0: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
5ce0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5cf0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
5d00: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
5d10: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
5d20: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
5d30: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
5d40: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
5d50: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
5d60: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
5d70: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5d80: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
5d90: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
5da0: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
5db0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
5dc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
5dd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
5de0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
5df0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
5e00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
5e10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
5e20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
5e30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
5e40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
5e50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
5e60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5e70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5e80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5e90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
5ea0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
5eb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
5ec0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
5ed0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
5ee0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
5ef0: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
5f00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
5f10: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
5f20: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
5f30: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
5f40: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
5f50: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
5f60: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
5f70: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
5f80: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
5f90: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
5fa0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
5fb0: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
5fc0: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
5fd0: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
5fe0: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
5ff0: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
6000: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
6010: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
6020: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
6030: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
6040: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
6050: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
6060: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
6070: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
6080: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
6090: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
60a0: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
60b0: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
60c0: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
60d0: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
60e0: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
60f0: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
6100: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
6110: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
6120: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
6130: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
6140: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
6150: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
6160: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
6170: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
6180: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
6190: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
61a0: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
61b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
61c0: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
61d0: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
61e0: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
61f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
6200: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
6210: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
6220: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
6230: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
6240: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
6250: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
6260: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
6270: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
6280: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
6290: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
62a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
62b0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
62c0: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
62d0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
62e0: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
62f0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
6300: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
6310: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
6320: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
6330: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
6340: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
6350: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
6360: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
6370: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
6380: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
6390: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
63a0: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
63b0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
63c0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
63d0: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
63e0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
63f0: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
6400: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
6410: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
6420: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
6430: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
6440: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
6450: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
6460: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
6470: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
6480: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
6490: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
64a0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
64b0: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
64c0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
64d0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
64e0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
64f0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
6500: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
6510: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
6520: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
6530: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
6540: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
6550: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
6560: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
6570: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
6580: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
6590: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
65a0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
65b0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
65c0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
65d0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
65e0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
65f0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
6600: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
6610: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
6620: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
6630: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
6640: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
6650: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
6660: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
6670: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
6680: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
6690: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
66a0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
66b0: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
66c0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
66d0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
66e0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
66f0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
6700: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
6710: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
6720: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
6730: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
6740: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
6750: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
6760: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
6770: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
6780: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
6790: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
67a0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
67b0: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
67c0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
67d0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
67e0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
67f0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
6800: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
6810: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
6820: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
6830: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
6840: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
6850: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
6860: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
6870: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
6880: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
6890: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
68a0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
68b0: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
68c0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
68d0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
68e0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
68f0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
6900: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
6910: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
6920: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
6930: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
6940: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
6950: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
6960: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
6970: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
6980: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
6990: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
69a0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
69b0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
69c0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
69d0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
69e0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
69f0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
6a00: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
6a10: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
6a20: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
6a30: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
6a40: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
6a50: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
6a60: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
6a70: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
6a80: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
6a90: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
6aa0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
6ab0: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
6ac0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
6ad0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
6ae0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
6af0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
6b00: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
6b10: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
6b20: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
6b30: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
6b40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
6b50: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
6b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
6b70: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
6b80: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
6b90: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
6ba0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6bb0: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
6bc0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
6bd0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
6be0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
6bf0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
6c00: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
6c10: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
6c20: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
6c30: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
6c40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
6c50: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
6c60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
6c70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6c80: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
6c90: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
6ca0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
6cb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
6cc0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
6cd0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
6ce0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6cf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
6d00: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
6d10: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
6d20: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
6d30: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
6d40: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
6d50: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
6d60: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
6d70: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
6d80: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
6d90: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
6da0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
6db0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
6dc0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
6dd0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
6de0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
6df0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
6e00: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
6e10: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
6e20: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
6e30: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
6e40: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
6e50: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
6e60: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
6e70: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
6e80: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
6e90: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
6ea0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
6eb0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
6ec0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
6ed0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
6ee0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
6ef0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
6f00: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
6f10: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
6f20: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
6f30: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
6f40: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
6f50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
6f60: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
6f70: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
6f80: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
6f90: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
6fa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
6fb0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
6fc0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
6fd0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
6fe0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
6ff0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
7000: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
7010: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
7020: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
7030: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
7040: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
7050: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
7060: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
7070: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
7080: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
7090: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
70a0: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
70b0: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
70c0: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
70d0: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
70e0: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
70f0: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
7100: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
7110: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
7120: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
7130: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
7140: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
7150: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
7160: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
7170: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
7180: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
7190: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
71a0: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
71b0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
71c0: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
71d0: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
71e0: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
71f0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
7200: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
7210: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
7220: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
7230: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
7240: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
7250: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
7260: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
7270: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
7280: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
7290: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
72a0: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
72b0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
72c0: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
72d0: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
72e0: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
72f0: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
7300: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
7310: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
7320: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
7330: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
7340: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
7350: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
7360: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
7370: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
7380: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
7390: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
73a0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
73b0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
73c0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
73d0: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
73e0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
73f0: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
7400: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
7410: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
7420: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
7430: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
7440: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
7450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
7460: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
7470: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
7480: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
7490: 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
74a0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
74b0: 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
74c0: 63 6f 72 72 75 70 74 2e 20 49 6e 20 74 68 61 74  corrupt. In that
74d0: 20 63 61 73 65 2c 20 69 74 20 69 73 20 70 6f 73   case, it is pos
74e0: 73 69 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  sible that.    *
74f0: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
7500: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
7510: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 76 65  function may ove
7520: 72 72 65 61 64 20 74 68 65 20 62 75 66 66 65 72  rread the buffer
7530: 20 62 79 0a 20 20 20 20 2a 2a 20 75 70 20 74 6f   by.    ** up to
7540: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 31 20 76   the size of 1 v
7550: 61 72 69 6e 74 20 70 6c 75 73 20 31 20 38 2d 62  arint plus 1 8-b
7560: 79 74 65 20 76 61 6c 75 65 20 77 68 65 6e 20 74  yte value when t
7570: 68 65 20 63 75 72 73 6f 72 20 0a 20 20 20 20 2a  he cursor .    *
7580: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72 65  * position is re
7590: 73 74 6f 72 65 64 2e 20 48 65 6e 63 65 20 74 68  stored. Hence th
75a0: 65 20 31 37 20 62 79 74 65 73 20 6f 66 20 70 61  e 17 bytes of pa
75b0: 64 64 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20  dding allocated 
75c0: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 2a  .    ** below. *
75d0: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
75e0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
75f0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
7600: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
7610: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
7620: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
7630: 2d 3e 6e 4b 65 79 20 2b 20 39 20 2b 20 38 20 29  ->nKey + 9 + 8 )
7640: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
7650: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
7660: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
7670: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
7680: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
7690: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
76a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
76b0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
76c0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
76d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
76e0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
76f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7700: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
7710: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
7720: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
7730: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
7740: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
7750: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
7760: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
7770: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
7780: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
7790: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
77a0: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
77b0: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
77c0: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
77d0: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
77e0: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
77f0: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
7800: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
7810: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
7820: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
7830: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
7840: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
7850: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
7860: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
7870: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
7880: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
7890: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
78a0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
78b0: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
78c0: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
78d0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
78e0: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
78f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
7900: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
7910: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
7920: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
7930: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
7940: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
7950: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
7960: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
7970: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
7980: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
7990: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
79a0: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
79b0: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
79c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
79d0: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
79e0: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
79f0: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
7a00: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
7a10: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
7a20: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
7a30: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
7a40: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
7a50: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
7a60: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
7a70: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
7a80: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
7a90: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
7aa0: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
7ab0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
7ac0: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
7ad0: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
7ae0: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
7af0: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
7b00: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
7b10: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
7b20: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
7b30: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
7b40: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
7b50: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
7b60: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
7b70: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
7b80: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
7b90: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
7ba0: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
7bb0: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
7bc0: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
7bd0: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
7be0: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
7bf0: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
7c00: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7c10: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
7c20: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
7c30: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
7c40: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
7c50: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
7c60: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
7c70: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
7c80: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
7c90: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
7ca0: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
7cb0: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
7cc0: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
7cd0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
7ce0: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
7cf0: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
7d00: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
7d10: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
7d20: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
7d30: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
7d40: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
7d50: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
7d60: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
7d70: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
7d80: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
7d90: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
7da0: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
7db0: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
7dc0: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
7dd0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
7de0: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
7df0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
7e00: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
7e10: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
7e20: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
7e30: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
7e40: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
7e50: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
7e60: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
7e70: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
7e80: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
7e90: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
7ea0: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
7eb0: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
7ec0: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
7ed0: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
7ee0: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
7ef0: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
7f00: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
7f10: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
7f20: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
7f30: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
7f40: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
7f50: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
7f60: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
7f70: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
7f80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7f90: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
7fa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
7fb0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
7fc0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
7fd0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
7fe0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
7ff0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
8000: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
8010: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
8020: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
8030: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
8040: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
8050: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
8060: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
8070: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
8080: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
8090: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
80a0: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
80b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
80c0: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
80d0: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
80e0: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
80f0: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
8100: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
8110: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
8120: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
8130: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
8140: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
8150: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
8160: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
8170: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
8180: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
8190: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
81a0: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
81b0: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
81c0: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
81d0: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
81e0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
81f0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
8200: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
8210: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
8220: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
8230: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
8240: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
8250: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
8260: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
8270: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
8280: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
8290: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
82a0: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
82b0: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
82c0: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
82d0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
82e0: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
82f0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
8300: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
8310: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
8320: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
8330: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
8340: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
8350: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
8360: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
8370: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
8380: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
8390: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
83a0: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
83b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
83c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
83d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
83e0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
83f0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
8400: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
8410: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
8420: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
8430: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
8440: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
8450: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8460: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
8470: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
8480: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
8490: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
84a0: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
84b0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
84c0: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
84d0: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
84e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
84f0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
8500: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
8510: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
8520: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
8530: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
8540: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
8550: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
8560: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
8570: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
8580: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
8590: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
85a0: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
85b0: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
85c0: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
85d0: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
85e0: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
85f0: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
8600: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
8610: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
8620: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
8630: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
8640: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
8650: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
8660: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
8670: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
8680: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
8690: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
86a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
86b0: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
86c0: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
86d0: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
86e0: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
86f0: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
8700: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
8710: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
8720: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
8730: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
8740: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
8750: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8770: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
8780: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
8790: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
87a0: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
87b0: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
87c0: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
87d0: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
87e0: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
87f0: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
8800: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
8810: 64 52 65 63 6f 72 64 28 70 43 75 72 2d 3e 70 4b  dRecord(pCur->pK
8820: 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28  eyInfo);.    if(
8830: 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65   pIdxKey==0 ) re
8840: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
8850: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69  M_BKPT;.    sqli
8860: 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
8870: 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
8880: 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
8890: 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
88a0: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
88b0: 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20  nField==0 ){.   
88c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
88d0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
88e0: 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 64     goto moveto_d
88f0: 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  one;.    }.  }el
8900: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
8910: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
8920: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
8930: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
8940: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
8950: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 6d 6f 76  bias, pRes);.mov
8960: 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69 66 28 20  eto_done:.  if( 
8970: 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 73  pIdxKey ){.    s
8980: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
8990: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
89a0: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20   pIdxKey);.  }. 
89b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
89c0: 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65  *.** Restore the
89d0: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
89e0: 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69  osition it was i
89f0: 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74  n (or as close t
8a00: 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a  o as possible).*
8a10: 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f  * when saveCurso
8a20: 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20  rPosition() was 
8a30: 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61  called. Note tha
8a40: 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65  t this call dele
8a50: 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65  tes the .** save
8a60: 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20  d position info 
8a70: 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75  stored by saveCu
8a80: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20  rsorPosition(), 
8a90: 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  so there can be.
8aa0: 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  ** at most one e
8ab0: 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65  ffective restore
8ac0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
8ad0: 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68   call after each
8ae0: 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50   .** saveCursorP
8af0: 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74  osition()..*/.st
8b00: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65  atic int btreeRe
8b10: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
8b20: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
8b30: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
8b40: 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20   int skipNext;. 
8b50: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
8b60: 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
8b70: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
8b80: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
8b90: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
8ba0: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
8bb0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
8bc0: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
8bd0: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
8be0: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
8bf0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
8c00: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
8c10: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
8c20: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
8c30: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
8c40: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
8c50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8c60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
8c70: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
8c80: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
8c90: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
8ca0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
8cb0: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
8cc0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
8cd0: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
8ce0: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
8cf0: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
8d00: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
8d10: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
8d20: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
8d30: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
8d40: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
8d50: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
8d60: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8d70: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
8d80: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
8d90: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
8da0: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
8db0: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
8dc0: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
8dd0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
8de0: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
8df0: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
8e00: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
8e10: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
8e20: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
8e30: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
8e40: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
8e50: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
8e60: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
8e70: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
8e80: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
8e90: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
8ea0: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
8eb0: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
8ec0: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
8ed0: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
8ee0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
8ef0: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
8f00: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
8f10: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
8f20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
8f30: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
8f40: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
8f50: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
8f60: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
8f70: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
8f80: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
8f90: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
8fa0: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
8fb0: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
8fc0: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
8fd0: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
8fe0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
8ff0: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
9000: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
9010: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
9020: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
9030: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
9040: 49 47 4e 4d 45 4e 54 28 70 43 75 72 29 0a 20 20  IGNMENT(pCur).  
9050: 20 20 20 20 20 7c 7c 20 70 43 75 72 3d 3d 73 71       || pCur==sq
9060: 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65 56 61  lite3BtreeFakeVa
9070: 6c 69 64 43 75 72 73 6f 72 28 29 20 29 3b 0a 20  lidCursor() );. 
9080: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f   assert( offseto
9090: 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53 74 61  f(BtCursor, eSta
90a0: 74 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  te)==0 );.  asse
90b0: 72 74 28 20 73 69 7a 65 6f 66 28 70 43 75 72 2d  rt( sizeof(pCur-
90c0: 3e 65 53 74 61 74 65 29 3d 3d 31 20 29 3b 0a 20  >eState)==1 );. 
90d0: 20 72 65 74 75 72 6e 20 43 55 52 53 4f 52 5f 56   return CURSOR_V
90e0: 41 4c 49 44 20 21 3d 20 2a 28 75 38 2a 29 70 43  ALID != *(u8*)pC
90f0: 75 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ur;.}../*.** Ret
9100: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
9110: 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f 72   a fake BtCursor
9120: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69 6c   object that wil
9130: 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72 0a  l always answer.
9140: 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65 20  ** false to the 
9150: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
9160: 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f 75  orHasMoved() rou
9170: 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68 65  tine above.  The
9180: 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72 20   fake.** cursor 
9190: 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e 6f  returned must no
91a0: 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  t be used with a
91b0: 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20 69  ny other Btree i
91c0: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74 43  nterface..*/.BtC
91d0: 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42 74  ursor *sqlite3Bt
91e0: 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73  reeFakeValidCurs
91f0: 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  or(void){.  stat
9200: 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f 72  ic u8 fakeCursor
9210: 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
9220: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
9230: 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53  tof(BtCursor, eS
9240: 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65  tate)==0 );.  re
9250: 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a 29  turn (BtCursor*)
9260: 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a 0a  &fakeCursor;.}..
9270: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
9280: 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63 75  ne restores a cu
9290: 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73  rsor back to its
92a0: 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74 69   original positi
92b0: 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20 68  on after it.** h
92c0: 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62 79  as been moved by
92d0: 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61 63   some outside ac
92e0: 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73 20  tivity (such as 
92f0: 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e 63  a btree rebalanc
9300: 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61  e or.** a row ha
9310: 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74 65  ving been delete
9320: 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
9330: 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20 0a   the cursor).  .
9340: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
9350: 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65 6e  , the *pDifferen
9360: 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 69  tRow parameter i
9370: 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 63  s false if the c
9380: 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a  ursor is left.**
9390: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78 61   pointing at exa
93a0: 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72 6f  ctly the same ro
93b0: 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52 6f  w.  *pDifferntRo
93c0: 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68 65  w is the row the
93d0: 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70   cursor.** was p
93e0: 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20 62  ointing to has b
93f0: 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f 72  een deleted, for
9400: 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  cing the cursor 
9410: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  to point to some
9420: 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a  .** nearby row..
9430: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
9440: 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
9450: 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 63  e called for a c
9460: 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74 20  ursor that just 
9470: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45  returned.** TRUE
9480: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72   from sqlite3Btr
9490: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
94a0: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
94b0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
94c0: 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a 70  tore(BtCursor *p
94d0: 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66 65  Cur, int *pDiffe
94e0: 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20  rentRow){.  int 
94f0: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
9500: 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Cur!=0 );.  asse
9510: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
9520: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
9530: 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
9540: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
9550: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
9560: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
9570: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65  tRow = 1;.    re
9580: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
9590: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
95a0: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
95b0: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
95c0: 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Row = 1;.  }else
95d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
95e0: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
95f0: 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  );.    *pDiffere
9600: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
9610: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9620: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
9630: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
9640: 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72  R_HINTS./*.** Pr
9650: 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74  ovide hints to t
9660: 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
9670: 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20  particular hint 
9680: 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74  given (and the t
9690: 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65  ype.** and numbe
96a0: 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73  r of the varargs
96b0: 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20   parameters) is 
96c0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
96d0: 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70  e eHintType.** p
96e0: 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74  arameter.  See t
96f0: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  he definitions o
9700: 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54  f the BTREE_HINT
9710: 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65  _* macros for de
9720: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
9730: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
9740: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
9750: 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54  pCur, int eHintT
9760: 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20  ype, ...){.  /* 
9770: 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73  Used only by sys
9780: 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74  tem that substit
9790: 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74  ute their own st
97a0: 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  orage engine */.
97b0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
97c0: 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e  Provide flag hin
97d0: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
97e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
97f0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
9800: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
9810: 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78  pCur, unsigned x
9820: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d  ){.  assert( x==
9830: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c  BTREE_SEEK_EQ ||
9840: 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f   x==BTREE_BULKLO
9850: 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20  AD || x==0 );.  
9860: 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b  pCur->hints = x;
9870: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
9880: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
9890: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
98a0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
98b0: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
98c0: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
98d0: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
98e0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
98f0: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
9900: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
9910: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
9920: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
9930: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
9940: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
9950: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
9960: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
9970: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
9980: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
9990: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
99a0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
99b0: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
99c0: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
99d0: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
99e0: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
99f0: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
9a00: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
9a10: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
9a20: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
9a30: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
9a40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9a50: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
9a60: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
9a70: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
9a80: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
9a90: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
9aa0: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
9ab0: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
9ac0: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
9ad0: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
9ae0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
9af0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
9b00: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
9b10: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
9b20: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
9b30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
9b40: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
9b50: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
9b60: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
9b70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9b80: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
9b90: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
9ba0: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
9bb0: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
9bc0: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
9bd0: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
9be0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
9bf0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
9c00: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
9c10: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
9c20: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
9c30: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
9c40: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
9c50: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
9c60: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
9c70: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
9c80: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
9c90: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
9ca0: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
9cb0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
9cc0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
9cd0: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
9ce0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
9cf0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
9d00: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
9d10: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
9d20: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
9d30: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
9d40: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
9d50: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
9d60: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
9d70: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
9d80: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
9d90: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
9da0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
9db0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
9dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
9dd0: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
9de0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
9df0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
9e00: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
9e10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9e20: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
9e30: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
9e40: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
9e50: 62 65 72 20 69 73 20 6e 65 76 65 72 20 61 64 64  ber is never add
9e60: 65 64 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  ed to a pointer-
9e70: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
9e80: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
9e90: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
9ea0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
9eb0: 74 29 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  t)) );..#ifndef 
9ec0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
9ed0: 55 52 52 45 4e 54 0a 20 20 69 66 28 20 70 42 74  URRENT.  if( pBt
9ee0: 2d 3e 70 4d 61 70 20 29 7b 0a 20 20 20 20 2a 70  ->pMap ){.    *p
9ef0: 52 43 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70  RC = btreePtrmap
9f00: 53 74 6f 72 65 28 70 42 74 2c 20 6b 65 79 2c 20  Store(pBt, key, 
9f10: 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 3b 0a  eType, parent);.
9f20: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9f30: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
9f40: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
9f50: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
9f60: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
9f70: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9f80: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
9f90: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
9fa0: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
9fb0: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
9fc0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
9fd0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
9fe0: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
9ff0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
a000: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a010: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
a020: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
a030: 20 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33   ((char*)sqlite3
a040: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
a050: 62 50 61 67 65 29 29 5b 30 5d 21 3d 30 20 29 7b  bPage))[0]!=0 ){
a060: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
a070: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 65 78  t byte of the ex
a080: 74 72 61 20 64 61 74 61 20 69 73 20 74 68 65 20  tra data is the 
a090: 4d 65 6d 50 61 67 65 2e 69 73 49 6e 69 74 20 62  MemPage.isInit b
a0a0: 79 74 65 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  yte..    ** If t
a0b0: 68 61 74 20 62 79 74 65 20 69 73 20 73 65 74 2c  hat byte is set,
a0c0: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 70   it means this p
a0d0: 61 67 65 20 69 73 20 61 6c 73 6f 20 62 65 69 6e  age is also bein
a0e0: 67 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 61 73  g used.    ** as
a0f0: 20 61 20 62 74 72 65 65 20 70 61 67 65 2e 20 2a   a btree page. *
a100: 2f 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  /.    *pRC = SQL
a110: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a120: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61  ;.    goto ptrma
a130: 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 6f 66  p_exit;.  }.  of
a140: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
a150: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
a160: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
a170: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
a180: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
a190: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
a1a0: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
a1b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
a1c0: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
a1d0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
a1e0: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
a1f0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
a200: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
a210: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
a220: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
a230: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
a240: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
a250: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
a260: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
a270: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
a280: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
a290: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a   parent));.    *
a2a0: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
a2b0: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
a2c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
a2d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a2e0: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
a2f0: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
a300: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
a310: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
a320: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
a330: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
a340: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
a350: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
a360: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
a370: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
a380: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
a390: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a3a0: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
a3b0: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
a3c0: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
a3d0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
a3e0: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
a3f0: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
a400: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
a410: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
a420: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
a430: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
a440: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
a450: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
a460: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
a470: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
a480: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
a490: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
a4a0: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
a4b0: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
a4c0: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
a4d0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
a4e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
a4f0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
a500: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
a510: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
a520: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
a530: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
a540: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
a550: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
a560: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
a570: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
a580: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
a590: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
a5a0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
a5b0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
a5c0: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
a5d0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
a5e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
a5f0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
a600: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
a610: 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
a620: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  rc!=0 ){.    ret
a630: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
a640: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
a650: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
a660: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f  a(pDbPage);..  o
a670: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
a680: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
a690: 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66  , key);.  if( of
a6a0: 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71  fset<0 ){.    sq
a6b0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
a6c0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65  pDbPage);.    re
a6d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a6e0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
a6f0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c  assert( offset <
a700: 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  = (int)pBt->usab
a710: 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73  leSize-5 );.  as
a720: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
a730: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
a740: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
a750: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
a760: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
a770: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
a780: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
a790: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
a7a0: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
a7b0: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
a7c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
a7d0: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 50  _CORRUPT_PGNO(iP
a7e0: 74 72 6d 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  trmap);.  return
a7f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
a800: 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e  else /* if defin
a810: 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed SQLITE_OMIT_A
a820: 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23  UTOVACUUM */.  #
a830: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
a840: 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23  (w,x,y,z,rc).  #
a850: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74  define ptrmapGet
a860: 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45  (w,x,y,z) SQLITE
a870: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74  _OK.  #define pt
a880: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78  rmapPutOvflPtr(x
a890: 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a  , y, rc).#endif.
a8a0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62  ./*.** Given a b
a8b0: 74 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20  tree page and a 
a8c0: 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65  cell index (0 me
a8d0: 61 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65  ans the first ce
a8e0: 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67  ll on.** the pag
a8f0: 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73  e, 1 means the s
a900: 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20  econd cell, and 
a910: 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e  so forth) return
a920: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
a930: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
a940: 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c  t..**.** findCel
a950: 6c 50 61 73 74 50 74 72 28 29 20 64 6f 65 73 20  lPastPtr() does 
a960: 74 68 65 20 73 61 6d 65 20 65 78 63 65 70 74 20  the same except 
a970: 69 74 20 73 6b 69 70 73 20 70 61 73 74 20 74 68  it skips past th
a980: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62  e initial.** 4-b
a990: 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
a9a0: 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72  r found on inter
a9b0: 69 6f 72 20 70 61 67 65 73 2c 20 69 66 20 74 68  ior pages, if th
a9c0: 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a  ere is one..**.*
a9d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
a9e0: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
a9f0: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
aa00: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
aa10: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
aa20: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29  ne findCell(P,I)
aa30: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
aa40: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
aa50: 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67  e & get2byteAlig
aa60: 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49  ned(&(P)->aCellI
aa70: 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65  dx[2*(I)]))).#de
aa80: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73  fine findCellPas
aa90: 74 50 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28  tPtr(P,I) \.  ((
aaa0: 50 29 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20  P)->aDataOfst + 
aab0: 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26  ((P)->maskPage &
aac0: 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64   get2byteAligned
aad0: 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b  (&(P)->aCellIdx[
aae0: 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a  2*(I)]))).../*.*
aaf0: 2a 20 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e  * This is common
ab00: 20 74 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67   tail processing
ab10: 20 66 6f 72 20 62 74 72 65 65 50 61 72 73 65 43   for btreeParseC
ab20: 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20  ellPtr() and.** 
ab30: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
ab40: 72 49 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65  rIndex() for the
ab50: 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 63   case when the c
ab60: 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74  ell does not fit
ab70: 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20   entirely.** on 
ab80: 61 20 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20  a single B-tree 
ab90: 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65  page.  Make nece
aba0: 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74  ssary adjustment
abb0: 73 20 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66  s to the CellInf
abc0: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  o.** structure..
abd0: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
abe0: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62  _NOINLINE void b
abf0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a  treeParseCellAdj
ac00: 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c  ustSizeForOverfl
ac10: 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ow(.  MemPage *p
ac20: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
ac30: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
ac40: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
ac50: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
ac60: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
ac70: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
ac80: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
ac90: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
aca0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
acb0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
acc0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79  .  /* If the pay
acd0: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
ace0: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
acf0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
ad00: 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20  we have.  ** to 
ad10: 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20  decide how much 
ad20: 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
ad30: 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f   and how much to
ad40: 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a   spill onto.  **
ad50: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
ad60: 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69    The strategy i
ad70: 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68  s to minimize th
ad80: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73  e amount of unus
ad90: 65 64 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e  ed.  ** space on
ada0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
adb0: 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68  while keeping th
adc0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61  e amount of loca
add0: 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69  l storage.  ** i
ade0: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
adf0: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
ae00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69  .  **.  ** Warni
ae10: 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68  ng:  changing th
ae20: 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70  e way overflow p
ae30: 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69  ayload is distri
ae40: 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a  buted in any.  *
ae50: 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c  * way will resul
ae60: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  t in an incompat
ae70: 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  ible file format
ae80: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e  ..  */.  int min
ae90: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d  Local;  /* Minim
aea0: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
aeb0: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
aec0: 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f  y */.  int maxLo
aed0: 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  cal;  /* Maximum
aee0: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
aef0: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
af00: 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73  */.  int surplus
af10: 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  ;   /* Overflow 
af20: 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c  payload availabl
af30: 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72  e for local stor
af40: 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63  age */..  minLoc
af50: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
af60: 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c  ocal;.  maxLocal
af70: 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   = pPage->maxLoc
af80: 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20  al;.  surplus = 
af90: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66  minLocal + (pInf
afa0: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69  o->nPayload - mi
afb0: 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e  nLocal)%(pPage->
afc0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
afd0: 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  4);.  testcase( 
afe0: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
aff0: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
b000: 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63   surplus==maxLoc
b010: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75  al+1 );.  if( su
b020: 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61  rplus <= maxLoca
b030: 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  l ){.    pInfo->
b040: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75  nLocal = (u16)su
b050: 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rplus;.  }else{.
b060: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
b070: 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61  l = (u16)minLoca
b080: 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e  l;.  }.  pInfo->
b090: 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70  nSize = (u16)(&p
b0a0: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70  Info->pPayload[p
b0b0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20  Info->nLocal] - 
b0c0: 70 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f  pCell) + 4;.}../
b0d0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
b0e0: 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
b0f0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
b100: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78  of the MemPage.x
b110: 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d  ParseCell().** m
b120: 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  ethod..**.** Par
b130: 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  se a cell conten
b140: 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c  t block and fill
b150: 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   in the CellInfo
b160: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
b170: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
b180: 50 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20  Ptr()        => 
b190: 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65    table btree le
b1a0: 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65  af nodes.** btre
b1b0: 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c  eParseCellNoPayl
b1c0: 6f 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c  oad()  =>   tabl
b1d0: 65 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c  e btree internal
b1e0: 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50   nodes.** btreeP
b1f0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
b200: 28 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20  ()   =>   index 
b210: 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a  btree nodes.**.*
b220: 2a 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20  * There is also 
b230: 61 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69  a wrapper functi
b240: 6f 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  on btreeParseCel
b250: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
b260: 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67  or.** all MemPag
b270: 65 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74  e types and that
b280: 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20   references the 
b290: 63 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61  cell by index ra
b2a0: 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20  ther than.** by 
b2b0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
b2c0: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
b2d0: 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f  seCellPtrNoPaylo
b2e0: 61 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ad(.  MemPage *p
b2f0: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
b300: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
b310: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
b320: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
b330: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
b340: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
b350: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
b360: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
b370: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
b380: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
b390: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b3a0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
b3b0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
b3c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b3d0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a  age->leaf==0 );.
b3e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b3f0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34  >childPtrSize==4
b400: 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
b410: 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45  TE_DEBUG.  UNUSE
b420: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67  D_PARAMETER(pPag
b430: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e  e);.#endif.  pIn
b440: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20  fo->nSize = 4 + 
b450: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
b460: 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  [4], (u64*)&pInf
b470: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66  o->nKey);.  pInf
b480: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b  o->nPayload = 0;
b490: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c  .  pInfo->nLocal
b4a0: 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70   = 0;.  pInfo->p
b4b0: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72  Payload = 0;.  r
b4c0: 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20  eturn;.}.static 
b4d0: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
b4e0: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
b4f0: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
b500: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
b510: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
b520: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
b530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
b540: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
b550: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
b560: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
b570: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
b580: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
b590: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  /.){.  u8 *pIter
b5a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b5b0: 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  * For scanning t
b5c0: 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a  hrough pCell */.
b5d0: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
b5e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b5f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
b600: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
b610: 20 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20    u64 iKey;     
b620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
b630: 72 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65  racted Key value
b640: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
b650: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b660: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
b670: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
b680: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
b690: 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d   || pPage->leaf=
b6a0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
b6b0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
b6c0: 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  f );.  assert( p
b6d0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
b6e0: 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72  ze==0 );.  pIter
b6f0: 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20   = pCell;..  /* 
b700: 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
b710: 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61  f code is equiva
b720: 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  lent to:.  **.  
b730: 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  **     pIter += 
b740: 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  getVarint32(pIte
b750: 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  r, nPayload);.  
b760: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65  **.  ** The code
b770: 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61   is inlined to a
b780: 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20  void a function 
b790: 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61  call..  */.  nPa
b7a0: 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a  yload = *pIter;.
b7b0: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d    if( nPayload>=
b7c0: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
b7d0: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d  pEnd = &pIter[8]
b7e0: 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26  ;.    nPayload &
b7f0: 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a  = 0x7f;.    do{.
b800: 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d        nPayload =
b810: 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c   (nPayload<<7) |
b820: 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37   (*++pIter & 0x7
b830: 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  f);.    }while( 
b840: 28 2a 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26  (*pIter)>=0x80 &
b850: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
b860: 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a    }.  pIter++;..
b870: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c    /* The next bl
b880: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65  ock of code is e
b890: 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20  quivalent to:.  
b8a0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65  **.  **     pIte
b8b0: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70  r += getVarint(p
b8c0: 49 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e  Iter, (u64*)&pIn
b8d0: 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a  fo->nKey);.  **.
b8e0: 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73    ** The code is
b8f0: 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69   inlined to avoi
b900: 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  d a function cal
b910: 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d  l..  */.  iKey =
b920: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69   *pIter;.  if( i
b930: 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  Key>=0x80 ){.   
b940: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74   u8 *pEnd = &pIt
b950: 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20  er[7];.    iKey 
b960: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69  &= 0x7f;.    whi
b970: 6c 65 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65  le(1){.      iKe
b980: 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20  y = (iKey<<7) | 
b990: 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66  (*++pIter & 0x7f
b9a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70  );.      if( (*p
b9b0: 49 74 65 72 29 3c 30 78 38 30 20 29 20 62 72 65  Iter)<0x80 ) bre
b9c0: 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ak;.      if( pI
b9d0: 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20  ter>=pEnd ){.   
b9e0: 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65       iKey = (iKe
b9f0: 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72  y<<8) | *++pIter
ba00: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
ba10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ba20: 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20   }.  pIter++;.. 
ba30: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a   pInfo->nKey = *
ba40: 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70  (i64*)&iKey;.  p
ba50: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
ba60: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
ba70: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70  fo->pPayload = p
ba80: 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Iter;.  testcase
ba90: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
baa0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
bab0: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
bac0: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
bad0: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
bae0: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
baf0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
bb00: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
bb10: 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61  (easy) common ca
bb20: 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74  se where the ent
bb30: 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73  ire payload fits
bb40: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  .    ** on the l
bb50: 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f  ocal page.  No o
bb60: 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69  verflow is requi
bb70: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
bb80: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
bb90: 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28  Payload + (u16)(
bba0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
bbb0: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e      if( pInfo->n
bbc0: 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e  Size<4 ) pInfo->
bbd0: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70  nSize = 4;.    p
bbe0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
bbf0: 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  u16)nPayload;.  
bc00: 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65  }else{.    btree
bc10: 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53  ParseCellAdjustS
bc20: 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70  izeForOverflow(p
bc30: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e  Page, pCell, pIn
bc40: 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  fo);.  }.}.stati
bc50: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
bc60: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20  eCellPtrIndex(. 
bc70: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
bc80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
bc90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
bca0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
bcb0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
bcc0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
bcd0: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
bce0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
bcf0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
bd00: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
bd10: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38  cture */.){.  u8
bd20: 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
bd30: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61        /* For sca
bd40: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43  nning through pC
bd50: 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ell */.  u32 nPa
bd60: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
bd70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
bd80: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
bd90: 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  oad */..  assert
bda0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
bdb0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
bdc0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
bdd0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
bde0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
bdf0: 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  af==1 );.  asser
be00: 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
be10: 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74  Leaf==0 );.  pIt
be20: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61  er = pCell + pPa
be30: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
be40: 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a  ;.  nPayload = *
be50: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61  pIter;.  if( nPa
be60: 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20  yload>=0x80 ){. 
be70: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
be80: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61  Iter[8];.    nPa
be90: 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20  yload &= 0x7f;. 
bea0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61     do{.      nPa
beb0: 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61  yload = (nPayloa
bec0: 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  d<<7) | (*++pIte
bed0: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
bee0: 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e  while( *(pIter)>
bef0: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
bf00: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
bf10: 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  er++;.  pInfo->n
bf20: 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  Key = nPayload;.
bf30: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
bf40: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
bf50: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
bf60: 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63  = pIter;.  testc
bf70: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
bf80: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
bf90: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
bfa0: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
bfb0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
bfc0: 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
bfd0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
bfe0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
bff0: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
c000: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
c010: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
c020: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
c030: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
c040: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
c050: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
c060: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
c070: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31  = nPayload + (u1
c080: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
c090: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f  );.    if( pInfo
c0a0: 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66  ->nSize<4 ) pInf
c0b0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
c0c0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
c0d0: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
c0e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74  .  }else{.    bt
c0f0: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
c100: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
c110: 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  w(pPage, pCell, 
c120: 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74  pInfo);.  }.}.st
c130: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
c140: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
c150: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
c160: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
c170: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
c180: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c1a0: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
c1b0: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
c1c0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
c1d0: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
c1e0: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
c1f0: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
c200: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
c210: 6c 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c  l(pPage, findCel
c220: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c  l(pPage, iCell),
c230: 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pInfo);.}../*.*
c240: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
c250: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70  routines are imp
c260: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
c270: 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c  the MemPage.xCel
c280: 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e  lSize.** method.
c290: 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  .**.** Compute t
c2a0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
c2b0: 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20  of bytes that a 
c2c0: 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68  Cell needs in th
c2d0: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61  e cell.** data a
c2e0: 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65  rea of the btree
c2f0: 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75  -page.  The retu
c300: 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64  rn number includ
c310: 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  es the cell.** d
c320: 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74  ata header and t
c330: 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  he local payload
c340: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76  , but not any ov
c350: 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a  erflow page or.*
c360: 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  * the space used
c370: 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   by the cell poi
c380: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c  nter..**.** cell
c390: 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64  SizePtrNoPayload
c3a0: 28 29 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65  ()    =>   table
c3b0: 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a   internal nodes.
c3c0: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29  ** cellSizePtr()
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20               => 
c3e0: 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65    all index node
c3f0: 73 20 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e  s & table leaf n
c400: 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75  odes.*/.static u
c410: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
c420: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
c430: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
c440: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
c450: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
c460: 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Size; /* For loo
c470: 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20  ping over bytes 
c480: 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  of pCell */.  u8
c490: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
c4c0: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
c4d0: 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20  */.  u32 nSize; 
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c500: 20 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72   Size value to r
c510: 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66  eturn */..#ifdef
c520: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
c530: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  /* The value ret
c540: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
c550: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  nction should al
c560: 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65  ways be the same
c570: 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65   as.  ** the (Ce
c580: 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61  llInfo.nSize) va
c590: 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69  lue found by doi
c5a0: 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20  ng a full parse 
c5b0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  of the.  ** cell
c5c0: 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55  . If SQLITE_DEBU
c5d0: 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  G is defined, an
c5e0: 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65   assert() at the
c5f0: 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20   bottom of.  ** 
c600: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65  this function ve
c610: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73  rifies that this
c620: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f   invariant is no
c630: 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20  t violated. */. 
c640: 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69   CellInfo debugi
c650: 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  nfo;.  pPage->xP
c660: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
c670: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
c680: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53  o);.#endif..  nS
c690: 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  ize = *pIter;.  
c6a0: 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20  if( nSize>=0x80 
c6b0: 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  ){.    pEnd = &p
c6c0: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69  Iter[8];.    nSi
c6d0: 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ze &= 0x7f;.    
c6e0: 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20  do{.      nSize 
c6f0: 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28  = (nSize<<7) | (
c700: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
c710: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28  ;.    }while( *(
c720: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
c730: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
c740: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69  }.  pIter++;.  i
c750: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
c760: 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72   ){.    /* pIter
c770: 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74   now points at t
c780: 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  he 64-bit intege
c790: 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76  r key value, a v
c7a0: 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a  ariable length .
c7b0: 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
c7c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
c7d0: 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20  ock moves pIter 
c7e0: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
c7f0: 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a  first byte.    *
c800: 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
c810: 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e  f the key value.
c820: 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26   */.    pEnd = &
c830: 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68  pIter[9];.    wh
c840: 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26  ile( (*pIter++)&
c850: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
c860: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74  nd );.  }.  test
c870: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
c880: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
c890: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
c8a0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
c8b0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53  al+1 );.  if( nS
c8c0: 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize<=pPage->maxL
c8d0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a  ocal ){.    nSiz
c8e0: 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72  e += (u32)(pIter
c8f0: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69   - pCell);.    i
c900: 66 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69  f( nSize<4 ) nSi
c910: 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b  ze = 4;.  }else{
c920: 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61  .    int minLoca
c930: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
c940: 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  cal;.    nSize =
c950: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69   minLocal + (nSi
c960: 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25  ze - minLocal) %
c970: 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73   (pPage->pBt->us
c980: 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
c990: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69     testcase( nSi
c9a0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
c9b0: 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  cal );.    testc
c9c0: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
c9d0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
c9e0: 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70  .    if( nSize>p
c9f0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
ca00: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
ca10: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a  minLocal;.    }.
ca20: 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b      nSize += 4 +
ca30: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
ca40: 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73  Cell);.  }.  ass
ca50: 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75  ert( nSize==debu
ca60: 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43  ginfo.nSize || C
ca70: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72  ORRUPT_DB );.  r
ca80: 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65  eturn (u16)nSize
ca90: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63  ;.}.static u16 c
caa0: 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
cab0: 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  oad(MemPage *pPa
cac0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
cad0: 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43    u8 *pIter = pC
cae0: 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20  ell + 4; /* For 
caf0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
cb00: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
cb10: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
cb20: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d          /* End m
cb30: 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74  ark for a varint
cb40: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
cb50: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
cb60: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
cb70: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
cb80: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
cb90: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
cba0: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
cbb0: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
cbc0: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
cbd0: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
cbe0: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
cbf0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
cc00: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
cc10: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
cc20: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
cc30: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
cc40: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
cc50: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
cc60: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
cc70: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
cc80: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
cc90: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
cca0: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
ccb0: 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
ccc0: 52 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a  RAMETER(pPage);.
ccd0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
cce0: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
ccf0: 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45  rSize==4 );.  pE
cd00: 6e 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a  nd = pIter + 9;.
cd10: 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72    while( (*pIter
cd20: 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65  ++)&0x80 && pIte
cd30: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65  r<pEnd );.  asse
cd40: 72 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53  rt( debuginfo.nS
cd50: 69 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72  ize==(u16)(pIter
cd60: 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52   - pCell) || COR
cd70: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74  RUPT_DB );.  ret
cd80: 75 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20  urn (u16)(pIter 
cd90: 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69  - pCell);.}...#i
cda0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
cdb0: 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74  G./* This variat
cdc0: 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50  ion on cellSizeP
cdd0: 74 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73  tr() is used ins
cde0: 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20  ide of assert() 
cdf0: 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e  statements.** on
ce00: 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31  ly. */.static u1
ce10: 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61  6 cellSize(MemPa
ce20: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
ce30: 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20  Cell){.  return 
ce40: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
ce50: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
ce60: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b  (pPage, iCell));
ce70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
ce80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ce90: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
cea0: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
ceb0: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
cec0: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
ced0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
cee0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
cef0: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
cf00: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
cf10: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
cf20: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
cf30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
cf40: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
cf50: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
cf60: 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a  u8 *pCell, int *
cf70: 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  pRC){.  CellInfo
cf80: 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52   info;.  if( *pR
cf90: 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  C ) return;.  as
cfa0: 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29  sert( pCell!=0 )
cfb0: 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
cfc0: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
cfd0: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
cfe0: 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e  ( info.nLocal<in
cff0: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20  fo.nPayload ){. 
d000: 20 20 20 50 67 6e 6f 20 6f 76 66 6c 3b 0a 20 20     Pgno ovfl;.  
d010: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54    if( SQLITE_WIT
d020: 48 49 4e 28 70 50 61 67 65 2d 3e 61 44 61 74 61  HIN(pPage->aData
d030: 45 6e 64 2c 20 70 43 65 6c 6c 2c 20 70 43 65 6c  End, pCell, pCel
d040: 6c 2b 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29  l+info.nLocal) )
d050: 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 53  {.      *pRC = S
d060: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d070: 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
d080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 76 66 6c  ;.    }.    ovfl
d090: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
d0a0: 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d  ll[info.nSize-4]
d0b0: 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
d0c0: 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66  (pPage->pBt, ovf
d0d0: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
d0e0: 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
d0f0: 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  , pRC);.  }.}.#e
d100: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
d110: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
d120: 20 67 69 76 65 6e 2e 20 54 68 69 73 20 72 6f 75   given. This rou
d130: 74 69 6e 65 20 72 65 6f 72 67 61 6e 69 7a 65 73  tine reorganizes
d140: 20 63 65 6c 6c 73 20 77 69 74 68 69 6e 20 74 68   cells within th
d150: 65 0a 2a 2a 20 70 61 67 65 20 73 6f 20 74 68 61  e.** page so tha
d160: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66  t there are no f
d170: 72 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e 20 74 68  ree-blocks on th
d180: 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6c 69 73  e free-block lis
d190: 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  t..**.** Paramet
d1a0: 65 72 20 6e 4d 61 78 46 72 61 67 20 69 73 20 74  er nMaxFrag is t
d1b0: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
d1c0: 74 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20  t of fragmented 
d1d0: 73 70 61 63 65 20 74 68 61 74 20 6d 61 79 20 62  space that may b
d1e0: 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20  e.** present in 
d1f0: 74 68 65 20 70 61 67 65 20 61 66 74 65 72 20 74  the page after t
d200: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
d210: 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45  rns..**.** EVIDE
d220: 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d  NCE-OF: R-44582-
d230: 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79  60138 SQLite may
d240: 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69   from time to ti
d250: 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a  me reorganize a.
d260: 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73  ** b-tree page s
d270: 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  o that there are
d280: 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f   no freeblocks o
d290: 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73  r fragment bytes
d2a0: 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20  , all.** unused 
d2b0: 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69  bytes are contai
d2c0: 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c  ned in the unall
d2d0: 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67  ocated space reg
d2e0: 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  ion, and all.** 
d2f0: 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64  cells are packed
d300: 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20   tightly at the 
d310: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
d320: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
d330: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65  efragmentPage(Me
d340: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
d350: 74 20 6e 4d 61 78 46 72 61 67 29 7b 0a 20 20 69  t nMaxFrag){.  i
d360: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
d370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
d380: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
d390: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
d3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
d3b0: 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68  ress of the i-th
d3c0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68   cell */.  int h
d3d0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
d3e0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
d3f0: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
d400: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65  er */.  int size
d410: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d420: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
d430: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73  cell */.  int us
d440: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  ableSize;       
d450: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d460: 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f  f usable bytes o
d470: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  n a page */.  in
d480: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
d490: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
d4a0: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70  et to the cell p
d4b0: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
d4c0: 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20    int cbrk;     
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d4e0: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
d4f0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
d500: 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
d530: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ls on the page *
d540: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
d550: 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  r *data;       /
d560: 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20  * The page data 
d570: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
d580: 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20  ar *temp;       
d590: 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72  /* Temp area for
d5a0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
d5b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d5c0: 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a   *src;        /*
d5d0: 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65   Source of conte
d5e0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
d5f0: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
d600: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
d610: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
d620: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
d630: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
d640: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
d650: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
d660: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d670: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
d680: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
d690: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
d6a0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
d6b0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d6c0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d6d0: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
d6e0: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
d6f0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
d700: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
d710: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d720: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
d730: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
d740: 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73  .  temp = 0;.  s
d750: 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67  rc = data = pPag
d760: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
d770: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
d780: 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  et;.  cellOffset
d790: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
d7a0: 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  fset;.  nCell = 
d7b0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
d7c0: 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67  assert( nCell==g
d7d0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
d7e0: 72 2b 33 5d 29 20 29 3b 0a 20 20 69 43 65 6c 6c  r+3]) );.  iCell
d7f0: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
d800: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20  et + 2*nCell;.  
d810: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
d820: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d830: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  ize;..  /* This 
d840: 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 20 70 61  block handles pa
d850: 67 65 73 20 77 69 74 68 20 74 77 6f 20 6f 72 20  ges with two or 
d860: 66 65 77 65 72 20 66 72 65 65 20 62 6c 6f 63 6b  fewer free block
d870: 73 20 61 6e 64 20 6e 4d 61 78 46 72 61 67 0a 20  s and nMaxFrag. 
d880: 20 2a 2a 20 6f 72 20 66 65 77 65 72 20 66 72 61   ** or fewer fra
d890: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 2e 20 49  gmented bytes. I
d8a0: 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
d8b0: 73 20 66 61 73 74 65 72 20 74 6f 20 6d 6f 76 65  s faster to move
d8c0: 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 28 6f   the.  ** two (o
d8d0: 72 20 6f 6e 65 29 20 62 6c 6f 63 6b 73 20 6f 66  r one) blocks of
d8e0: 20 63 65 6c 6c 73 20 75 73 69 6e 67 20 6d 65 6d   cells using mem
d8f0: 6d 6f 76 65 28 29 20 61 6e 64 20 61 64 64 20 74  move() and add t
d900: 68 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a  he required.  **
d910: 20 6f 66 66 73 65 74 73 20 74 6f 20 65 61 63 68   offsets to each
d920: 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
d930: 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72  cell-pointer arr
d940: 61 79 20 74 68 61 6e 20 69 74 20 69 73 20 74 6f  ay than it is to
d950: 20 0a 20 20 2a 2a 20 72 65 63 6f 6e 73 74 72 75   .  ** reconstru
d960: 63 74 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  ct the entire pa
d970: 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 69  ge.  */.  if( (i
d980: 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 3c 3d  nt)data[hdr+7]<=
d990: 6e 4d 61 78 46 72 61 67 20 29 7b 0a 20 20 20 20  nMaxFrag ){.    
d9a0: 69 6e 74 20 69 46 72 65 65 20 3d 20 67 65 74 32  int iFree = get2
d9b0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
d9c0: 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ]);..    /* If t
d9d0: 68 65 20 69 6e 69 74 69 61 6c 20 66 72 65 65 62  he initial freeb
d9e0: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 77 65 72 65  lock offset were
d9f0: 20 6f 75 74 20 6f 66 20 62 6f 75 6e 64 73 2c 20   out of bounds, 
da00: 74 68 61 74 20 77 6f 75 6c 64 0a 20 20 20 20 2a  that would.    *
da10: 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 74 65  * have been dete
da20: 63 74 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cted by btreeIni
da30: 74 50 61 67 65 28 29 20 77 68 65 6e 20 69 74 20  tPage() when it 
da40: 77 61 73 20 63 6f 6d 70 75 74 69 6e 67 20 74 68  was computing th
da50: 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
da60: 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 6f 6e  of free bytes on
da70: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
da80: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 3c    assert( iFree<
da90: 3d 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  =usableSize-4 );
daa0: 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 20 29  .    if( iFree )
dab0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46 72 65  {.      int iFre
dac0: 65 32 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  e2 = get2byte(&d
dad0: 61 74 61 5b 69 46 72 65 65 5d 29 3b 0a 20 20 20  ata[iFree]);.   
dae0: 20 20 20 69 66 28 20 69 46 72 65 65 32 3e 75 73     if( iFree2>us
daf0: 61 62 6c 65 53 69 7a 65 2d 34 20 29 20 72 65 74  ableSize-4 ) ret
db00: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
db10: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
db20: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 69 46 72        if( 0==iFr
db30: 65 65 32 20 7c 7c 20 28 64 61 74 61 5b 69 46 72  ee2 || (data[iFr
db40: 65 65 32 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b  ee2]==0 && data[
db50: 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29 7b  iFree2+1]==0) ){
db60: 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 45 6e  .        u8 *pEn
db70: 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  d = &data[cellOf
db80: 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b  fset + nCell*2];
db90: 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 41 64  .        u8 *pAd
dba0: 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  dr;.        int 
dbb0: 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  sz2 = 0;.       
dbc0: 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32 62 79   int sz = get2by
dbd0: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32  te(&data[iFree+2
dbe0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ]);.        int 
dbf0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
dc00: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
dc10: 20 20 20 20 20 20 69 66 28 20 74 6f 70 3e 3d 69        if( top>=i
dc20: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
dc30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
dc40: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
dc50: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
dc60: 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65         if( iFree
dc70: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  2 ){.          i
dc80: 66 28 20 69 46 72 65 65 2b 73 7a 3e 69 46 72 65  f( iFree+sz>iFre
dc90: 65 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e2 ) return SQLI
dca0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
dcb0: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
dcc0: 20 20 73 7a 32 20 3d 20 67 65 74 32 62 79 74 65    sz2 = get2byte
dcd0: 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d  (&data[iFree2+2]
dce0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
dcf0: 20 69 46 72 65 65 32 2b 73 7a 32 20 3e 20 75 73   iFree2+sz2 > us
dd00: 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74 75 72  ableSize ) retur
dd10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
dd20: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
dd30: 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28          memmove(
dd40: 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b 73  &data[iFree+sz+s
dd50: 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72 65 65  z2], &data[iFree
dd60: 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69 46  +sz], iFree2-(iF
dd70: 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20 20  ree+sz));.      
dd80: 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20      sz += sz2;. 
dd90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dda0: 20 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a   cbrk = top+sz;.
ddb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ddc0: 63 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f 70 29  cbrk+(iFree-top)
ddd0: 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29   <= usableSize )
dde0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76  ;.        memmov
ddf0: 65 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  e(&data[cbrk], &
de00: 64 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72 65 65  data[top], iFree
de10: 2d 74 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 66  -top);.        f
de20: 6f 72 28 70 41 64 64 72 3d 26 64 61 74 61 5b 63  or(pAddr=&data[c
de30: 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41 64 64  ellOffset]; pAdd
de40: 72 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b 3d 32  r<pEnd; pAddr+=2
de50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  ){.          pc 
de60: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
de70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
de80: 20 70 63 3c 69 46 72 65 65 20 29 7b 20 70 75 74   pc<iFree ){ put
de90: 32 62 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b  2byte(pAddr, pc+
dea0: 73 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  sz); }.         
deb0: 20 65 6c 73 65 20 69 66 28 20 70 63 3c 69 46 72   else if( pc<iFr
dec0: 65 65 32 20 29 7b 20 70 75 74 32 62 79 74 65 28  ee2 ){ put2byte(
ded0: 70 41 64 64 72 2c 20 70 63 2b 73 7a 32 29 3b 20  pAddr, pc+sz2); 
dee0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
def0: 20 20 20 20 67 6f 74 6f 20 64 65 66 72 61 67 6d      goto defragm
df00: 65 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ent_out;.      }
df10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63 62  .    }.  }..  cb
df20: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
df30: 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75  .  iCellLast = u
df40: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
df50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
df60: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
df70: 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54  *pAddr;     /* T
df80: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69  he i-th cell poi
df90: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64  nter */.    pAdd
dfa0: 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  r = &data[cellOf
dfb0: 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20  fset + i*2];.   
dfc0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
dfd0: 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63  Addr);.    testc
dfe0: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69  ase( pc==iCellFi
dff0: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
e000: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
e010: 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  st );.    /* The
e020: 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61  se conditions ha
e030: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
e040: 76 65 72 69 66 69 65 64 20 69 6e 20 62 74 72 65  verified in btre
e050: 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20  eInitPage().    
e060: 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c  ** if PRAGMA cel
e070: 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e  l_size_check=ON.
e080: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
e090: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
e0a0: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
e0b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
e0c0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
e0d0: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  E(pPage);.    }.
e0e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d      assert( pc>=
e0f0: 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63  iCellFirst && pc
e100: 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  <=iCellLast );. 
e110: 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65 2d     size = pPage-
e120: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
e130: 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20  , &src[pc]);.   
e140: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20   cbrk -= size;. 
e150: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
e160: 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a  lFirst || pc+siz
e170: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
e180: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e190: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
e1a0: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
e1b0: 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b     assert( cbrk+
e1c0: 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65  size<=usableSize
e1d0: 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46   && cbrk>=iCellF
e1e0: 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  irst );.    test
e1f0: 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d  case( cbrk+size=
e200: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
e210: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
e220: 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65  size==usableSize
e230: 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65   );.    put2byte
e240: 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20  (pAddr, cbrk);. 
e250: 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29     if( temp==0 )
e260: 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20  {.      int x;. 
e270: 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d 70       if( cbrk==p
e280: 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  c ) continue;.  
e290: 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74      temp = sqlit
e2a0: 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
e2b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
e2c0: 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  ger);.      x = 
e2d0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
e2e0: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65  dr+5]);.      me
e2f0: 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26  mcpy(&temp[x], &
e300: 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73  data[x], (cbrk+s
e310: 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20 20  ize) - x);.     
e320: 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20   src = temp;.   
e330: 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64   }.    memcpy(&d
e340: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b  ata[cbrk], &src[
e350: 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a  pc], size);.  }.
e360: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
e370: 30 3b 0a 0a 20 64 65 66 72 61 67 6d 65 6e 74 5f  0;.. defragment_
e380: 6f 75 74 3a 0a 20 20 69 66 28 20 64 61 74 61 5b  out:.  if( data[
e390: 68 64 72 2b 37 5d 2b 63 62 72 6b 2d 69 43 65 6c  hdr+7]+cbrk-iCel
e3a0: 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e  lFirst!=pPage->n
e3b0: 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Free ){.    retu
e3c0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e3d0: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
e3e0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72   }.  assert( cbr
e3f0: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
e400: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
e410: 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b  a[hdr+5], cbrk);
e420: 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d  .  data[hdr+1] =
e430: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32   0;.  data[hdr+2
e440: 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  ] = 0;.  memset(
e450: 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74  &data[iCellFirst
e460: 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c  ], 0, cbrk-iCell
e470: 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74  First);.  assert
e480: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
e490: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
e4a0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  >pDbPage) );.  r
e4b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e4c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
e4d0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f   the free-list o
e4e0: 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73  n page pPg for s
e4f0: 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20  pace to store a 
e500: 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73  cell nByte bytes
e510: 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20   in.** size. If 
e520: 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  one can be found
e530: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
e540: 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20  er to the space 
e550: 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a  and remove it.**
e560: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
e570: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ist..**.** If no
e580: 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20   suitable space 
e590: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20  can be found on 
e5a0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72  the free-list, r
e5b0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
e5c0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e5d0: 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75  may detect corru
e5e0: 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67  ption within pPg
e5f0: 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e  .  If corruption
e600: 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20   is.** detected 
e610: 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74  then *pRc is set
e620: 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   to SQLITE_CORRU
e630: 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72  PT and NULL is r
e640: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
e650: 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65  lots on the free
e660: 20 6c 69 73 74 20 74 68 61 74 20 61 72 65 20 62   list that are b
e670: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62  etween 1 and 3 b
e680: 79 74 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e  ytes larger than
e690: 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62   nByte.** will b
e6a0: 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64  e ignored if add
e6b0: 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 73 70  ing the extra sp
e6c0: 61 63 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d  ace to the fragm
e6d0: 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a  entation count.*
e6e0: 2a 20 63 61 75 73 65 73 20 74 68 65 20 66 72 61  * causes the fra
e6f0: 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74  gmentation count
e700: 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a   to exceed 60..*
e710: 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67  /.static u8 *pag
e720: 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67  eFindSlot(MemPag
e730: 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74  e *pPg, int nByt
e740: 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20  e, int *pRc){.  
e750: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
e760: 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  pPg->hdrOffset;.
e770: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
e780: 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
e790: 0a 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68  .  int iAddr = h
e7a0: 64 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63  dr + 1;.  int pc
e7b0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
e7c0: 74 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e  ta[iAddr]);.  in
e7d0: 74 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c  t x;.  int usabl
e7e0: 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74  eSize = pPg->pBt
e7f0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
e800: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
e810: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
e820: 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f  the free slot */
e830: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 30  ..  assert( pc>0
e840: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3c   );.  while( pc<
e850: 3d 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b  =usableSize-4 ){
e860: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
e870: 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33  -OF: R-22710-533
e880: 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e 64  28 The third and
e890: 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66   fourth bytes of
e8a0: 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65   each.    ** fre
e8b0: 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69  eblock form a bi
e8c0: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
e8d0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69   which is the si
e8e0: 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c  ze of the freebl
e8f0: 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79  ock.    ** in by
e900: 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74  tes, including t
e910: 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72  he 4-byte header
e920: 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20  . */.    size = 
e930: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
e940: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  pc+2]);.    if( 
e950: 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74  (x = size - nByt
e960: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74  e)>=0 ){.      t
e970: 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b  estcase( x==4 );
e980: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e990: 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69   x==3 );.      i
e9a0: 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61  f( size+pc > usa
e9b0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
e9c0: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
e9d0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
e9e0: 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  g);.        retu
e9f0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
ea00: 65 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20  e if( x<4 ){.   
ea10: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
ea20: 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30  -OF: R-11498-580
ea30: 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  22 In a well-for
ea40: 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
ea50: 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20   the total.     
ea60: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
ea70: 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e  bytes in fragmen
ea80: 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65  ts may not excee
ea90: 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d 60. */.       
eaa0: 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37   if( aData[hdr+7
eab0: 5d 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b  ]>57 ) return 0;
eac0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  ..        /* Rem
ead0: 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f  ove the slot fro
eae0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
eaf0: 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62   Update the numb
eb00: 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  er of.        **
eb10: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
eb20: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
eb30: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  e. */.        me
eb40: 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64  mcpy(&aData[iAdd
eb50: 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20  r], &aData[pc], 
eb60: 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74  2);.        aDat
eb70: 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29  a[hdr+7] += (u8)
eb80: 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  x;.      }else{.
eb90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
eba0: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
ebb0: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
ebc0: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
ebd0: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
ebe0: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72    ** for the por
ebf0: 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65  tion used by the
ec00: 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   new allocation.
ec10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32   */.        put2
ec20: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
ec30: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ], x);.      }. 
ec40: 20 20 20 20 20 72 65 74 75 72 6e 20 26 61 44 61       return &aDa
ec50: 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20  ta[pc + x];.    
ec60: 7d 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70 63  }.    iAddr = pc
ec70: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
ec80: 79 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b  yte(&aData[pc]);
ec90: 0a 20 20 20 20 69 66 28 20 70 63 3c 69 41 64 64  .    if( pc<iAdd
eca0: 72 2b 73 69 7a 65 20 29 20 62 72 65 61 6b 3b 0a  r+size ) break;.
ecb0: 20 20 7d 0a 20 20 69 66 28 20 70 63 20 29 7b 0a    }.  if( pc ){.
ecc0: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
ecd0: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
ece0: 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
ecf0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
ed00: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
ed10: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f  tes of space fro
ed20: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54  m within the B-T
ed30: 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a  ree page passed.
ed40: 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
ed50: 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20  argument. Write 
ed60: 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69  into *pIdx the i
ed70: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
ed80: 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74  >aData[].** of t
ed90: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
eda0: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
edb0: 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20  . Return either 
edc0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20  SQLITE_OK or.** 
edd0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75  an error code (u
ede0: 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f  sually SQLITE_CO
edf0: 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  RRUPT)..**.** Th
ee00: 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74  e caller guarant
ee10: 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ees that there i
ee20: 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  s sufficient spa
ee30: 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ce to make the.*
ee40: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54  * allocation.  T
ee50: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
ee60: 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67  t need to defrag
ee70: 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  ment in order to
ee80: 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68   bring.** all th
ee90: 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72  e space together
eea0: 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73  , however.  This
eeb0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76   routine will av
eec0: 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65  oid using.** the
eed0: 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73   first two bytes
eee0: 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70   past the cell p
eef0: 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63  ointer area sinc
ef00: 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69  e presumably thi
ef10: 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  s.** allocation 
ef20: 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e  is being made in
ef30: 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74   order to insert
ef40: 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20   a new cell, so 
ef50: 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  we will.** also 
ef60: 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61  end up needing a
ef70: 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
ef80: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
ef90: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
efa0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
efb0: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
efc0: 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  Idx){.  const in
efd0: 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
efe0: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  drOffset;    /* 
eff0: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
f000: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
f010: 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
f020: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
f030: 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ata;      /* Loc
f040: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
f050: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e  e->aData */.  in
f060: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f080: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
f090: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
f0a0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72   area */.  int r
f0b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0d0: 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72  /* Integer retur
f0e0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
f0f0: 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  gap;        /* F
f100: 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70  irst byte of gap
f110: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f   between cell po
f120: 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20  inters and cell 
f130: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20  content */.  .  
f140: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
f150: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
f160: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
f170: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
f180: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
f190: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f1a0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
f1b0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
f1c0: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
f1d0: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
f1e0: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
f1f0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
f200: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
f210: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
f220: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
f230: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
f240: 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67  yte < (int)(pPag
f250: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
f260: 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65  ze-8) );..  asse
f270: 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  rt( pPage->cellO
f280: 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31  ffset == hdr + 1
f290: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
f2a0: 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61  f );.  gap = pPa
f2b0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
f2c0: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
f2d0: 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d  .  assert( gap<=
f2e0: 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56  65536 );.  /* EV
f2f0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33  IDENCE-OF: R-293
f300: 35 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20  56-02391 If the 
f310: 64 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20  database uses a 
f320: 36 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20  65536-byte page 
f330: 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  size.  ** and th
f340: 65 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  e reserved space
f350: 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73   is zero (the us
f360: 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65  ual value for re
f370: 73 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20  served space).  
f380: 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c  ** then the cell
f390: 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20   content offset 
f3a0: 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  of an empty page
f3b0: 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35   wants to be 655
f3c0: 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72  36..  ** However
f3d0: 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69  , that integer i
f3e0: 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62  s too large to b
f3f0: 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d  e stored in a 2-
f400: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20  byte unsigned.  
f410: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61  ** integer, so a
f420: 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75   value of 0 is u
f430: 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65  sed in its place
f440: 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74  . */.  top = get
f450: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
f460: 35 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  5]);.  assert( t
f470: 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e  op<=(int)pPage->
f480: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
f490: 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79  ); /* Prevent by
f4a0: 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
f4b0: 29 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74  ) */.  if( gap>t
f4c0: 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f  op ){.    if( to
f4d0: 70 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70  p==0 && pPage->p
f4e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d  Bt->usableSize==
f4f0: 36 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74  65536 ){.      t
f500: 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20  op = 65536;.    
f510: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
f520: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f530: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
f540: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
f550: 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  If there is enou
f560: 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e  gh space between
f570: 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72   gap and top for
f580: 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70   one more cell p
f590: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61  ointer.  ** arra
f5a0: 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20  y entry offset, 
f5b0: 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c  and if the freel
f5c0: 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ist is not empty
f5d0: 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68  , then search th
f5e0: 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20  e.  ** freelist 
f5f0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72  looking for a fr
f600: 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75  ee slot big enou
f610: 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  gh to satisfy th
f620: 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a  e request..  */.
f630: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
f640: 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  2==top );.  test
f650: 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70  case( gap+1==top
f660: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
f670: 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  gap==top );.  if
f680: 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c  ( (data[hdr+2] |
f690: 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26  | data[hdr+1]) &
f6a0: 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a  & gap+2<=top ){.
f6b0: 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d      u8 *pSpace =
f6c0: 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50   pageFindSlot(pP
f6d0: 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29  age, nByte, &rc)
f6e0: 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65  ;.    if( pSpace
f6f0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
f700: 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26  ( pSpace>=data &
f710: 26 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  & (pSpace - data
f720: 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20  )<65536 );.     
f730: 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70   *pIdx = (int)(p
f740: 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20  Space - data);. 
f750: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f760: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
f770: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
f780: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f790: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
f7a0: 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f  request could no
f7b0: 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75  t be fulfilled u
f7c0: 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20  sing a freelist 
f7d0: 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a  slot.  Check.  *
f7e0: 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72  * to see if defr
f7f0: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e  agmentation is n
f800: 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
f810: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
f820: 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20  +nByte==top );. 
f830: 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65   if( gap+2+nByte
f840: 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65  >top ){.    asse
f850: 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
f860: 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  >0 || CORRUPT_DB
f870: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   );.    rc = def
f880: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
f890: 65 2c 20 4d 49 4e 28 34 2c 20 70 50 61 67 65 2d  e, MIN(4, pPage-
f8a0: 3e 6e 46 72 65 65 20 2d 20 28 32 2b 6e 42 79 74  >nFree - (2+nByt
f8b0: 65 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  e)));.    if( rc
f8c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
f8d0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
f8e0: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
f8f0: 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  r+5]);.    asser
f900: 74 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c 3d  t( gap+2+nByte<=
f910: 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  top );.  }...  /
f920: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
f930: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
f940: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
f950: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
f960: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
f970: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
f980: 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50    The btreeInitP
f990: 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61  age() call has a
f9a0: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69  lready.  ** vali
f9b0: 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69  dated the freeli
f9c0: 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20  st.  Given that 
f9d0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
f9e0: 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a  valid, there.  *
f9f0: 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74  * is no way that
fa00: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
fa10: 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74  can extend off t
fa20: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
fa30: 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73  ge..  ** The ass
fa40: 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69  ert() below veri
fa50: 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  fies the previou
fa60: 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f  s sentence..  */
fa70: 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b  .  top -= nByte;
fa80: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
fa90: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
faa0: 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42    assert( top+nB
fab0: 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  yte <= (int)pPag
fac0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
fad0: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
fae0: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
faf0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
fb00: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
fb10: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
fb20: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
fb30: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
fb40: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
fb50: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
fb60: 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  is pPage->aData[
fb70: 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  iStart].** and t
fb80: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
fb90: 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79  lock is iSize by
fba0: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63  tes..**.** Adjac
fbb0: 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61  ent freeblocks a
fbc0: 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a  re coalesced..**
fbd0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76  .** Note that ev
fbe0: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72  en though the fr
fbf0: 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73  eeblock list was
fc00: 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65   checked by btre
fc10: 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20  eInitPage(),.** 
fc20: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c  that routine wil
fc30: 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  l not detect ove
fc40: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c  rlap between cel
fc50: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
fc60: 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69  .  Nor.** does i
fc70: 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f  t detect cells o
fc80: 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  r freeblocks tha
fc90: 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20  t encrouch into 
fca0: 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74  the reserved byt
fcb0: 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
fcc0: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53   of the page.  S
fcd0: 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20  o do additional 
fce0: 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b  corruption check
fcf0: 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a  s inside this.**
fd00: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74   routine and ret
fd10: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fd20: 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65  PT if any proble
fd30: 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f  ms are found..*/
fd40: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
fd50: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
fd60: 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74  Page, u16 iStart
fd70: 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20  , u16 iSize){.  
fd80: 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20  u16 iPtr;       
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fda0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
fdb0: 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20   of ptr to next 
fdc0: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
fdd0: 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20  16 iFreeBlk;    
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdf0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
fe00: 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
fe10: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64  block */.  u8 hd
fe20: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe40: 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20   /* Page header 
fe50: 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20  size.  0 or 100 
fe60: 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20  */.  u8 nFrag = 
fe70: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
fe80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
fe90: 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d  duction in fragm
fea0: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31  entation */.  u1
feb0: 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53  6 iOrigSize = iS
fec0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
fed0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
fee0: 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a  value of iSize *
fef0: 2f 0a 20 20 75 31 36 20 78 3b 20 20 20 20 20 20  /.  u16 x;      
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
ff20: 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
ff30: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 75 33  ent area */.  u3
ff40: 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20  2 iEnd = iStart 
ff50: 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  + iSize;        
ff60: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
ff70: 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61 72  e past the iStar
ff80: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e  t buffer */.  un
ff90: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
ffa0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
ffb0: 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74  ;   /* Page cont
ffc0: 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
ffd0: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
ffe0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
fff0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
10000 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
10010 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
10020 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
10030 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68  iStart>=pPage->h
10040 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65  drOffset+6+pPage
10050 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29  ->childPtrSize )
10060 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
10070 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c  UPT_DB || iEnd <
10080 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
10090 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73  ableSize );.  as
100a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
100b0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
100c0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
100d0 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d   assert( iSize>=
100e0 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  4 );   /* Minimu
100f0 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
10100 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53   */.  assert( iS
10110 74 61 72 74 3c 3d 70 50 61 67 65 2d 3e 70 42 74  tart<=pPage->pBt
10120 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
10130 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74  ;..  /* The list
10140 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d   of freeblocks m
10150 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64  ust be in ascend
10160 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64  ing order.  Find
10170 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20   the .  ** spot 
10180 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65 72  on the list wher
10190 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20  e iStart should 
101a0 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a  be inserted..  *
101b0 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  /.  hdr = pPage-
101c0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50  >hdrOffset;.  iP
101d0 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  tr = hdr + 1;.  
101e0 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d  if( data[iPtr+1]
101f0 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74 72  ==0 && data[iPtr
10200 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65  ]==0 ){.    iFre
10210 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68  eBlk = 0;  /* Sh
10220 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63  ortcut for the c
10230 61 73 65 20 77 68 65 6e 20 74 68 65 20 66 72 65  ase when the fre
10240 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a  elist is empty *
10250 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  /.  }else{.    w
10260 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20  hile( (iFreeBlk 
10270 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
10280 5b 69 50 74 72 5d 29 29 3c 69 53 74 61 72 74 20  [iPtr]))<iStart 
10290 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72  ){.      if( iFr
102a0 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a  eeBlk<iPtr+4 ){.
102b0 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65          if( iFre
102c0 65 42 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b  eBlk==0 ) break;
102d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
102e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
102f0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
10300 20 20 7d 0a 20 20 20 20 20 20 69 50 74 72 20 3d    }.      iPtr =
10310 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d   iFreeBlk;.    }
10320 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c  .    if( iFreeBl
10330 6b 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  k>pPage->pBt->us
10340 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20  ableSize-4 ){.  
10350 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10360 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10370 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
10380 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c   assert( iFreeBl
10390 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42  k>iPtr || iFreeB
103a0 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20  lk==0 );.  .    
103b0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
103c0 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65  :.    **    iFre
103d0 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72  eBlk:   First fr
103e0 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53  eeblock after iS
103f0 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  tart, or zero if
10400 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20   none.    **    
10410 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20  iPtr:       The 
10420 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69  address of a poi
10430 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b  nter to iFreeBlk
10440 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
10450 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
10460 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62  FreeBlk should b
10470 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  e coalesced onto
10480 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61   the end of iSta
10490 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rt..    */.    i
104a0 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69  f( iFreeBlk && i
104b0 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20  End+3>=iFreeBlk 
104c0 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d  ){.      nFrag =
104d0 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64   iFreeBlk - iEnd
104e0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
104f0 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75  >iFreeBlk ) retu
10500 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10510 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
10520 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65       iEnd = iFre
10530 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28  eBlk + get2byte(
10540 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32  &data[iFreeBlk+2
10550 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  ]);.      if( iE
10560 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  nd > pPage->pBt-
10570 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
10580 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
10590 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
105a0 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
105b0 7d 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20  }.      iSize = 
105c0 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20  iEnd - iStart;. 
105d0 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20       iFreeBlk = 
105e0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
105f0 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d  FreeBlk]);.    }
10600 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50  .  .    /* If iP
10610 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72  tr is another fr
10620 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73  eeblock (that is
10630 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74  , if iPtr is not
10640 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20   the freelist.  
10650 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20    ** pointer in 
10660 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 29  the page header)
10670 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73   then check to s
10680 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68 6f  ee if iStart sho
10690 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f  uld be.    ** co
106a0 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
106b0 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20   end of iPtr..  
106c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74    */.    if( iPt
106d0 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20  r>hdr+1 ){.     
106e0 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69   int iPtrEnd = i
106f0 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28 26  Ptr + get2byte(&
10700 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20  data[iPtr+2]);. 
10710 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64       if( iPtrEnd
10720 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20  +3>=iStart ){.  
10730 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
10740 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75 72  d>iStart ) retur
10750 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
10760 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
10770 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69        nFrag += i
10780 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b  Start - iPtrEnd;
10790 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d  .        iSize =
107a0 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20   iEnd - iPtr;.  
107b0 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69        iStart = i
107c0 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Ptr;.      }.   
107d0 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67   }.    if( nFrag
107e0 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72  >data[hdr+7] ) r
107f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10800 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
10810 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37  ;.    data[hdr+7
10820 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a  ] -= nFrag;.  }.
10830 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26    x = get2byte(&
10840 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
10850 69 66 28 20 69 53 74 61 72 74 3c 3d 78 20 29 7b  if( iStart<=x ){
10860 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  .    /* The new 
10870 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20  freeblock is at 
10880 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
10890 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
108a0 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73  t area,.    ** s
108b0 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68  o just extend th
108c0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
108d0 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20  rea rather than 
108e0 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20  create another. 
108f0 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65     ** freelist e
10900 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  ntry */.    if( 
10910 69 53 74 61 72 74 3c 78 20 7c 7c 20 69 50 74 72  iStart<x || iPtr
10920 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e  !=hdr+1 ) return
10930 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10940 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
10950 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
10960 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b  hdr+1], iFreeBlk
10970 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
10980 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45  &data[hdr+5], iE
10990 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nd);.  }else{.  
109a0 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
109b0 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e  new freeblock in
109c0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
109d0 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  */.    put2byte(
109e0 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74  &data[iPtr], iSt
109f0 61 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  art);.  }.  if( 
10a00 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46  pPage->pBt->btsF
10a10 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f  lags & BTS_FAST_
10a20 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20 2f 2a  SECURE ){.    /*
10a30 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   Overwrite delet
10a40 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
10a50 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74  ith zeros when t
10a60 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
10a70 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  .    ** option i
10a80 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 20  s enabled */.   
10a90 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53   memset(&data[iS
10aa0 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29  tart], 0, iSize)
10ab0 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65  ;.  }.  put2byte
10ac0 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
10ad0 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 70 75 74  iFreeBlk);.  put
10ae0 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
10af0 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20  rt+2], iSize);. 
10b00 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
10b10 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65   iOrigSize;.  re
10b20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10b30 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
10b40 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
10b50 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
10b60 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
10b70 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
10b80 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
10b90 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
10ba0 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
10bb0 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  dingly..**.** On
10bc0 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
10bd0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
10be0 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e  e supported.  An
10bf0 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ything different
10c00 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20  .** indicates a 
10c10 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
10c20 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   files:.**.**   
10c30 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
10c40 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  TA.**         PT
10c50 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46  F_ZERODATA | PTF
10c60 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20  _LEAF.**        
10c70 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
10c80 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20  PTF_INTKEY.**   
10c90 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
10ca0 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20  TA | PTF_INTKEY 
10cb0 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74  | PTF_LEAF.*/.st
10cc0 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46  atic int decodeF
10cd0 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  lags(MemPage *pP
10ce0 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74  age, int flagByt
10cf0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
10d00 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f  pBt;     /* A co
10d10 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74  py of pPage->pBt
10d20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
10d30 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d  Page->hdrOffset=
10d40 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  =(pPage->pgno==1
10d50 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
10d60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10d70 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
10d80 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
10d90 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
10da0 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e  = (u8)(flagByte>
10db0 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54  >3);  assert( PT
10dc0 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29  F_LEAF == 1<<3 )
10dd0 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20  ;.  flagByte &= 
10de0 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61  ~PTF_LEAF;.  pPa
10df0 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
10e00 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65   = 4-4*pPage->le
10e10 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65  af;.  pPage->xCe
10e20 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
10e30 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50  ePtr;.  pBt = pP
10e40 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
10e50 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
10e60 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
10e70 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20  TKEY) ){.    /* 
10e80 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
10e90 37 32 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c  7291-35328 A val
10ea0 75 65 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d  ue of 5 (0x05) m
10eb0 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
10ec0 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72   an.    ** inter
10ed0 69 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65  ior table b-tree
10ee0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
10ef0 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44  sert( (PTF_LEAFD
10f00 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d  ATA|PTF_INTKEY)=
10f10 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  =5 );.    /* EVI
10f20 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30  DENCE-OF: R-2690
10f30 30 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65 20  0-09176 A value 
10f40 6f 66 20 31 33 20 28 30 78 30 64 29 20 6d 65 61  of 13 (0x0d) mea
10f50 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
10f60 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62  .    ** leaf tab
10f70 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
10f80 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
10f90 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
10fa0 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
10fb0 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61  )==13 );.    pPa
10fc0 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a  ge->intKey = 1;.
10fd0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
10fe0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61  eaf ){.      pPa
10ff0 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
11000 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   1;.      pPage-
11010 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74  >xParseCell = bt
11020 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b  reeParseCellPtr;
11030 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11040 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
11050 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  eaf = 0;.      p
11060 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
11070 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  = cellSizePtrNoP
11080 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50  ayload;.      pP
11090 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
110a0 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
110b0 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20  PtrNoPayload;.  
110c0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d    }.    pPage->m
110d0 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
110e0 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
110f0 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
11100 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
11110 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
11120 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
11130 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
11140 45 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37  E-OF: R-43316-37
11150 33 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32  308 A value of 2
11160 20 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68   (0x02) means th
11170 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20  e page is an.   
11180 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64   ** interior ind
11190 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
111a0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
111b0 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32  PTF_ZERODATA)==2
111c0 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
111d0 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d  NCE-OF: R-59615-
111e0 34 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66  42828 A value of
111f0 20 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73   10 (0x0a) means
11200 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20   the page is a. 
11210 20 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78     ** leaf index
11220 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
11230 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
11240 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c  F_ZERODATA|PTF_L
11250 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20  EAF)==10 );.    
11260 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
11270 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  0;.    pPage->in
11280 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20  tKeyLeaf = 0;.  
11290 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
112a0 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
112b0 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20  CellPtrIndex;.  
112c0 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
112d0 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  l = pBt->maxLoca
112e0 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  l;.    pPage->mi
112f0 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
11300 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b  nLocal;.  }else{
11310 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
11320 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34  -OF: R-47608-564
11330 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c  69 Any other val
11340 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65  ue for the b-tre
11350 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20  e page type is. 
11360 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20     ** an error. 
11370 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
11380 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
11390 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
113a0 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
113b0 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61  ayload = pBt->ma
113c0 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20  x1bytePayload;. 
113d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
113e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
113f0 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c  ialize the auxil
11400 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  iary information
11410 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63   for a disk bloc
11420 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
11430 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
11440 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65  cess.  If we see
11450 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64   that the page d
11460 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
11470 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  in a well-formed
11480 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
11490 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20  then return .** 
114a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
114b0 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74   Note that a ret
114c0 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b  urn of SQLITE_OK
114d0 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61   does not.** gua
114e0 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
114f0 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72  page is well-for
11500 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68  med.  It only sh
11510 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66  ows that.** we f
11520 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
11530 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  any corruption..
11540 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
11550 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50  reeInitPage(MemP
11560 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
11570 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
11580 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
11590 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
115a0 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
115b0 5d 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20  ] */.  u8 hdr;  
115c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
115d0 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
115e0 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
115f0 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
11600 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c          /* Equal
11610 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61   to pPage->aData
11620 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
11630 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
11640 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
11650 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
11660 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
11670 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
11680 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
11690 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36 20  h page */.  u16 
116a0 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
116b0 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
116c0 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
116d0 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
116e0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  r */.  int nFree
116f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
11700 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
11710 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
11720 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
11730 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
11740 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
11750 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
11760 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72  /.  int iCellFir
11770 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20  st;    /* First 
11780 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f  allowable cell o
11790 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
117a0 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  et */.  int iCel
117b0 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61  lLast;     /* La
117c0 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
117d0 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
117e0 66 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  fset */..  asser
117f0 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
11800 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
11810 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20  age->pBt->db!=0 
11820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11830 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11840 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
11850 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
11860 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c  pPage->pgno==sql
11870 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
11880 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
11890 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
118a0 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65   pPage == sqlite
118b0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
118c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
118d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
118e0 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69  e->aData == sqli
118f0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
11900 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
11910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
11920 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  ge->isInit==0 );
11930 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ..  pBt = pPage-
11940 3e 70 42 74 3b 0a 20 20 68 64 72 20 3d 20 70 50  >pBt;.  hdr = pP
11950 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
11960 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
11970 61 44 61 74 61 3b 0a 20 20 2f 2a 20 45 56 49 44  aData;.  /* EVID
11980 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34  ENCE-OF: R-28594
11990 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62  -02890 The one-b
119a0 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73  yte flag at offs
119b0 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a  et 0 indicating.
119c0 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20    ** the b-tree 
119d0 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20  page type. */.  
119e0 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28  if( decodeFlags(
119f0 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d  pPage, data[hdr]
11a00 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
11a10 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11a20 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  AGE(pPage);.  }.
11a30 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
11a40 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
11a50 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
11a60 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
11a70 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
11a80 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
11a90 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
11aa0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
11ab0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
11ac0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
11ad0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
11ae0 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
11af0 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65   hdr + 8 + pPage
11b00 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
11b10 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
11b20 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65  d = &data[usable
11b30 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
11b40 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
11b50 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20  [cellOffset];.  
11b60 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74  pPage->aDataOfst
11b70 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
11b80 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
11b90 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
11ba0 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54   R-58015-48175 T
11bb0 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
11bc0 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20  ger at offset 5 
11bd0 64 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a 20  designates.  ** 
11be0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
11bf0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
11c00 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65  ea. A zero value
11c10 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65   for this intege
11c20 72 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72 70  r is.  ** interp
11c30 72 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20  reted as 65536. 
11c40 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62  */.  top = get2b
11c50 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
11c60 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20 45  [hdr+5]);.  /* E
11c70 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
11c80 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77  002-32774 The tw
11c90 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
11ca0 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73  t offset 3 gives
11cb0 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
11cc0 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
11cd0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61 67   page. */.  pPag
11ce0 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
11cf0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
11d00 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
11d10 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
11d20 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20  t) ){.    /* To 
11d30 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
11d40 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
11d50 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
11d60 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72  corrupt */.    r
11d70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
11d80 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
11d90 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  ;.  }.  testcase
11da0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
11db0 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a  MX_CELL(pBt) );.
11dc0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
11dd0 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20  : R-24089-57979 
11de0 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69  If a page contai
11df0 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69  ns no cells (whi
11e00 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20  ch is only.  ** 
11e10 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72  possible for a r
11e20 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74 61  oot page of a ta
11e30 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ble that contain
11e40 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20  s no rows) then 
11e50 74 68 65 0a 20 20 2a 2a 20 6f 66 66 73 65 74 20  the.  ** offset 
11e60 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
11e70 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71  ent area will eq
11e80 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a  ual the page siz
11e90 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 2a 2a  e minus the.  **
11ea0 20 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76   bytes of reserv
11eb0 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 61  ed space. */.  a
11ec0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
11ed0 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73  ell>0 || top==us
11ee0 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52  ableSize || CORR
11ef0 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 2f 2a 20  UPT_DB );..  /* 
11f00 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61  A malformed data
11f10 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20  base page might 
11f20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61 64  cause us to read
11f30 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20   past the end.  
11f40 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20  ** of page when 
11f50 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20  parsing a cell. 
11f60 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
11f70 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
11f80 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65  of code checks e
11f90 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61  arly to see if a
11fa0 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20   cell extends.  
11fb0 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
11fc0 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  of a page bounda
11fd0 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51  ry and causes SQ
11fe0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20  LITE_CORRUPT to 
11ff0 62 65 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 65  be .  ** returne
12000 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  d if it does..  
12010 2a 2f 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  */.  iCellFirst 
12020 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
12030 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
12040 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
12050 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 69  bleSize - 4;.  i
12060 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67  f( pBt->db->flag
12070 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53  s & SQLITE_CellS
12080 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 69 6e 74  izeCk ){.    int
12090 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
120a0 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  * Index into the
120b0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
120c0 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ray */.    int s
120d0 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z;           /* 
120e0 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
120f0 2f 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  /..    if( !pPag
12100 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
12110 61 73 74 2d 2d 3b 0a 20 20 20 20 66 6f 72 28 69  ast--;.    for(i
12120 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
12130 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
12140 70 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c 69  pc = get2byteAli
12150 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f  gned(&data[cellO
12160 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
12170 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
12180 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
12190 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
121a0 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
121b0 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
121c0 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
121d0 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
121e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
121f0 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
12200 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
12210 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e      sz = pPage->
12220 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  xCellSize(pPage,
12230 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
12240 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
12250 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
12260 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 2b 73  ;.      if( pc+s
12270 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  z>usableSize ){.
12280 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
12290 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
122a0 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
122b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
122c0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
122d0 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 7d  iCellLast++;.  }
122e0 20 20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65    ..  /* Compute
122f0 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
12300 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
12310 65 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d  e.  ** EVIDENCE-
12320 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35  OF: R-23588-3445
12330 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  0 The two-byte i
12340 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
12350 20 31 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a   1 gives the.  *
12360 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66  * start of the f
12370 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f  irst freeblock o
12380 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69  n the page, or i
12390 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20  s zero if there 
123a0 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65  are no.  ** free
123b0 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63 20  blocks. */.  pc 
123c0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
123d0 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65  [hdr+1]);.  nFre
123e0 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  e = data[hdr+7] 
123f0 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20  + top;  /* Init 
12400 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65  nFree to non-fre
12410 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63  eblock free spac
12420 65 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30 20  e */.  if( pc>0 
12430 29 7b 0a 20 20 20 20 75 33 32 20 6e 65 78 74 2c  ){.    u32 next,
12440 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70   size;.    if( p
12450 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a  c<iCellFirst ){.
12460 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
12470 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32  E-OF: R-55530-52
12480 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  930 In a well-fo
12490 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
124a0 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20  , there will.   
124b0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20     ** always be 
124c0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c  at least one cel
124d0 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  l before the fir
124e0 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20  st freeblock..  
124f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
12500 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
12510 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 20  PT_PAGE(pPage); 
12520 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
12530 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ( 1 ){.      if(
12540 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
12550 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65  .        /* Free
12560 62 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65 6e  block off the en
12570 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  d of the page */
12580 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12590 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
125a0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
125b0 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d    }.      next =
125c0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
125d0 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65  pc]);.      size
125e0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
125f0 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
12600 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20  nFree = nFree + 
12610 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
12620 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20  next<=pc+size+3 
12630 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
12640 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a  c = next;.    }.
12650 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 29      if( next>0 )
12660 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62  {.      /* Freeb
12670 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63 65  lock not in asce
12680 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
12690 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
126a0 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
126b0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
126c0 20 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 28 75    if( pc+size>(u
126d0 6e 73 69 67 6e 65 64 20 69 6e 74 29 75 73 61 62  nsigned int)usab
126e0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
126f0 2f 2a 20 4c 61 73 74 20 66 72 65 65 62 6c 6f 63  /* Last freebloc
12700 6b 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 70  k extends past p
12710 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20  age end */.     
12720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
12730 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
12740 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
12750 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
12760 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e  t, nFree contain
12770 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
12780 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
12790 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
127a0 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
127b0 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
127c0 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
127d0 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65   within.  ** the
127e0 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
127f0 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67  ea. If this is g
12800 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
12810 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a 2a  usable-size.  **
12820 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68   of the page, th
12830 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74  en the page must
12840 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54   be corrupted. T
12850 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20  his check also. 
12860 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65   ** serves to ve
12870 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66  rify that the of
12880 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
12890 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  t of the cell-co
128a0 6e 74 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61 2c  ntent.  ** area,
128b0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
128c0 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c  e page header, l
128d0 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  ies within the p
128e0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
128f0 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65  nFree>usableSize
12900 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
12910 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
12920 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
12930 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
12940 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43  (u16)(nFree - iC
12950 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 70 50 61  ellFirst);.  pPa
12960 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
12970 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12980 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
12990 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73   up a raw page s
129a0 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  o that it looks 
129b0 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20  like a database 
129c0 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  page holding.** 
129d0 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  no entries..*/.s
129e0 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50  tatic void zeroP
129f0 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
12a00 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ge, int flags){.
12a10 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
12a20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
12a30 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  Data;.  BtShared
12a40 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
12a50 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70  Bt;.  u8 hdr = p
12a60 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
12a70 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20  .  u16 first;.. 
12a80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12a90 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
12aa0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
12ab0 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a  =pPage->pgno );.
12ac0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12ad0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
12ae0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
12af0 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
12b00 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12b10 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
12b20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
12b30 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73  == data );.  ass
12b40 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
12b50 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
12b60 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
12b70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12b80 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
12b90 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
12ba0 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
12bb0 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52  & BTS_FAST_SECUR
12bc0 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  E ){.    memset(
12bd0 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70  &data[hdr], 0, p
12be0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
12bf0 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74   hdr);.  }.  dat
12c00 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66  a[hdr] = (char)f
12c10 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20  lags;.  first = 
12c20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54  hdr + ((flags&PT
12c30 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20  F_LEAF)==0 ? 12 
12c40 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  : 8);.  memset(&
12c50 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20  data[hdr+1], 0, 
12c60 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37  4);.  data[hdr+7
12c70 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74  ] = 0;.  put2byt
12c80 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
12c90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
12ca0 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
12cb0 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
12cc0 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74  ableSize - first
12cd0 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73  );.  decodeFlags
12ce0 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  (pPage, flags);.
12cf0 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
12d00 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70  set = first;.  p
12d10 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
12d20 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62   &data[pBt->usab
12d30 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65  leSize];.  pPage
12d40 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61  ->aCellIdx = &da
12d50 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61  ta[first];.  pPa
12d60 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20  ge->aDataOfst = 
12d70 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69  &data[pPage->chi
12d80 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50  ldPtrSize];.  pP
12d90 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
12da0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   0;.  assert( pB
12db0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
12dc0 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
12dd0 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50  e<=65536 );.  pP
12de0 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
12df0 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
12e00 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67  ize - 1);.  pPag
12e10 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  e->nCell = 0;.  
12e20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
12e30 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  1;.}.../*.** Con
12e40 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62  vert a DbPage ob
12e50 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20  tained from the 
12e60 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d  pager into a Mem
12e70 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  Page used by.** 
12e80 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e  the btree layer.
12e90 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
12ea0 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f  ge *btreePageFro
12eb0 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a  mDbPage(DbPage *
12ec0 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67  pDbPage, Pgno pg
12ed0 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42  no, BtShared *pB
12ee0 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
12ef0 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
12f00 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
12f10 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
12f20 20 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67    if( pgno!=pPag
12f30 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  e->pgno ){.    p
12f40 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71  Page->aData = sq
12f50 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
12f60 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
12f70 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d  pPage->pDbPage =
12f80 20 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50   pDbPage;.    pP
12f90 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
12fa0 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20      pPage->pgno 
12fb0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67  = pgno;.    pPag
12fc0 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70  e->hdrOffset = p
12fd0 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
12fe0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
12ff0 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71  pPage->aData==sq
13000 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
13010 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  a(pDbPage) );.  
13020 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
13030 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
13040 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
13050 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
13060 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
13070 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
13080 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
13090 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73  needed.  See als
130a0 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  o: btreeGetUnuse
130b0 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  dPage()..**.** I
130c0 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f  f the PAGER_GET_
130d0 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69  NOCONTENT flag i
130e0 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20  s set, it means 
130f0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
13100 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65  are.** about the
13110 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
13120 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d  page at this tim
13130 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f  e.  So do not go
13140 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20   to the disk.** 
13150 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e  to fetch the con
13160 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c  tent.  Just fill
13170 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
13180 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e  with zeros for n
13190 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65  ow..** If in the
131a0 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20   future we call 
131b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
131c0 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65  e() on this page
131d0 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20  , that.** means 
131e0 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20  we have started 
131f0 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20  to be concerned 
13200 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e  about content an
13210 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65  d the disk.** re
13220 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
13230 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
13240 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
13250 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53  eeGetPage(.  BtS
13260 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
13270 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
13280 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
13290 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
132a0 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
132b0 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
132c0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
132d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
132e0 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
132f0 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
13300 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
13310 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
13320 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
13330 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
13340 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
13350 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
13360 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ..  assert( flag
13370 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  s==0 || flags==P
13380 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
13390 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  NT || flags==PAG
133a0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
133b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
133c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
133d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
133e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
133f0 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
13400 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65  r, pgno, (DbPage
13410 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61  **)&pDbPage, fla
13420 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  gs);.  if( rc ) 
13430 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70  return rc;.  *pp
13440 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
13450 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
13460 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
13470 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13480 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
13490 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f  rieve a page fro
134a0 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
134b0 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  e. If the reques
134c0 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a  ted page is not.
134d0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
134e0 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65  e pager cache re
134f0 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69  turn NULL. Initi
13500 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
13510 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
13520 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
13530 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
13540 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
13550 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75   *btreePageLooku
13560 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
13570 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44   Pgno pgno){.  D
13580 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
13590 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
135a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
135b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44  ->mutex) );.  pD
135c0 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  bPage = sqlite3P
135d0 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e  agerLookup(pBt->
135e0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
135f0 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a   if( pDbPage ){.
13600 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
13610 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
13620 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
13630 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
13640 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
13650 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
13660 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13670 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74  e in pages. If t
13680 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
13690 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65   of.** error, re
136a0 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20  turn ((unsigned 
136b0 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74  int)-1)..*/.stat
136c0 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67  ic Pgno btreePag
136d0 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20  ecount(BtShared 
136e0 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pBt){.  return 
136f0 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33  pBt->nPage;.}.u3
13700 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  2 sqlite3BtreeLa
13710 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29  stPage(Btree *p)
13720 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
13730 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
13740 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
13750 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61  t( ((p->pBt->nPa
13760 67 65 29 26 30 78 38 30 30 30 30 30 30 30 29 3d  ge)&0x80000000)=
13770 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  =0 );.  return b
13780 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d  treePagecount(p-
13790 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pBt);.}../*.** 
137a0 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
137b0 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
137c0 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a  itialize it..**.
137d0 2a 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74 68  ** If pCur!=0 th
137e0 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62  en the page is b
137f0 65 69 6e 67 20 66 65 74 63 68 65 64 20 61 73 20  eing fetched as 
13800 70 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f  part of a moveTo
13810 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e  Child().** call.
13820 20 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20    Do additional 
13830 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
13840 6f 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  on the page in t
13850 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64  his case..** And
13860 20 69 66 20 74 68 65 20 66 65 74 63 68 20 66 61   if the fetch fa
13870 69 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ils, this routin
13880 65 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74  e must decrement
13890 20 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a   pCur->iPage..**
138a0 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73 20  .** The page is 
138b0 66 65 74 63 68 65 64 20 61 73 20 72 65 61 64 2d  fetched as read-
138c0 77 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75  write unless pCu
138d0 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e  r is not NULL an
138e0 64 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f  d is.** a read-o
138f0 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  nly cursor..**.*
13900 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
13910 63 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61  curs, then *ppPa
13920 67 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ge is undefined.
13930 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69   It.** may remai
13940 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20  n unchanged, or 
13950 69 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  it may be set to
13960 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75   an invalid valu
13970 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13980 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
13990 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
139a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
139b0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
139c0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
139d0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
139f0 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
13a00 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d  ge to get */.  M
13a10 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13a30 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
13a40 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f   pointer here */
13a50 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
13a60 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
13a70 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
13a80 72 65 63 65 69 76 65 20 74 68 65 20 70 61 67 65  receive the page
13a90 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  , or NULL */.  i
13aa0 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20  nt bReadOnly    
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13ac0 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
13ad0 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29  d-only page */.)
13ae0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
13af0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
13b00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13b10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
13b20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
13b30 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
13b40 70 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 70  ppPage==&pCur->p
13b50 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
13b60 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65  ( pCur==0 || bRe
13b70 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75  adOnly==pCur->cu
13b80 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a 20  rPagerFlags );. 
13b90 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30   assert( pCur==0
13ba0 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   || pCur->iPage>
13bb0 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f  0 );..  if( pgno
13bc0 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
13bd0 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  pBt) ){.    rc =
13be0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
13bf0 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67  BKPT;.    goto g
13c00 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
13c10 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ror;.  }.  rc = 
13c20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
13c30 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
13c40 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44  o, (DbPage**)&pD
13c50 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79  bPage, bReadOnly
13c60 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
13c70 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
13c80 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
13c90 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28 4d  }.  *ppPage = (M
13ca0 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
13cb0 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
13cc0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a 70  Page);.  if( (*p
13cd0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
13ce0 30 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61  0 ){.    btreePa
13cf0 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
13d00 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
13d10 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
13d20 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
13d30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
13d40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13d50 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
13d60 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f  pPage);.      go
13d70 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
13d80 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
13d90 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70   }.  assert( (*p
13da0 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67  pPage)->pgno==pg
13db0 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
13dc0 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61  (*ppPage)->aData
13dd0 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
13de0 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
13df0 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61 69  ;..  /* If obtai
13e00 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61 67  ning a child pag
13e10 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20  e for a cursor, 
13e20 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20 74  we must verify t
13e30 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 0a  hat the page is.
13e40 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20    ** compatible 
13e50 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70 61  with the root pa
13e60 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ge. */.  if( pCu
13e70 72 20 26 26 20 28 28 2a 70 70 50 61 67 65 29 2d  r && ((*ppPage)-
13e80 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70  >nCell<1 || (*pp
13e90 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70  Page)->intKey!=p
13ea0 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20  Cur->curIntKey) 
13eb0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
13ec0 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
13ed0 70 67 6e 6f 29 3b 0a 20 20 20 20 72 65 6c 65 61  pgno);.    relea
13ee0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
13ef0 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64  .    goto getAnd
13f00 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a  InitPage_error;.
13f10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
13f20 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49  ITE_OK;..getAndI
13f30 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20  nitPage_error:. 
13f40 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20   if( pCur ){.   
13f50 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
13f60 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20      pCur->pPage 
13f70 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
13f80 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 7d  Cur->iPage];.  }
13f90 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
13fa0 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
13fb0 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d  ( pgno!=0 || rc=
13fc0 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
13fd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
13fe0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13ff0 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
14000 54 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20 74 68 65  T./* .** Set the
14010 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4d 65   value of the Me
14020 6d 50 61 67 65 2e 70 67 6e 6f 52 6f 6f 74 20 76  mPage.pgnoRoot v
14030 61 72 69 61 62 6c 65 2c 20 69 66 20 69 74 20 65  ariable, if it e
14040 78 69 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  xists..*/.static
14050 20 76 6f 69 64 20 73 65 74 4d 65 6d 70 61 67 65   void setMempage
14060 52 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50  Root(MemPage *pP
14070 67 2c 20 75 33 32 20 70 67 6e 6f 52 6f 6f 74 29  g, u32 pgnoRoot)
14080 7b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 52 6f 6f  {.  pPg->pgnoRoo
14090 74 20 3d 20 70 67 6e 6f 52 6f 6f 74 3b 0a 7d 0a  t = pgnoRoot;.}.
140a0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
140b0 65 74 4d 65 6d 70 61 67 65 52 6f 6f 74 28 78 2c  etMempageRoot(x,
140c0 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  y).#endif../*.**
140d0 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
140e0 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
140f0 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
14100 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
14110 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47  * call to btreeG
14120 65 74 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  etPage..**.** Pa
14130 67 65 31 20 69 73 20 61 20 73 70 65 63 69 61 6c  ge1 is a special
14140 20 63 61 73 65 20 61 6e 64 20 6d 75 73 74 20 62   case and must b
14150 65 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  e released using
14160 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
14170 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
14180 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74  d releasePageNot
14190 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Null(MemPage *pP
141a0 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
141b0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
141c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
141d0 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
141e0 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  ( pPage->pDbPage
141f0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
14200 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
14210 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
14220 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
14230 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
14240 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
14250 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
14260 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
14270 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
14280 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14290 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
142a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
142b0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
142c0 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62  tNull(pPage->pDb
142d0 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Page);.}.static 
142e0 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
142f0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
14300 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 20  {.  if( pPage ) 
14310 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
14320 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 73 74 61  ll(pPage);.}.sta
14330 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
14340 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67 65 20  PageOne(MemPage 
14350 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  *pPage){.  asser
14360 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20  t( pPage!=0 );. 
14370 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
14380 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
14390 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
143a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
143b0 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a  ->pDbPage!=0 );.
143c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
143d0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
143e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
143f0 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
14400 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
14410 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
14420 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
14430 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
14440 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14450 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
14460 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
14470 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
14480 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28 70  erUnrefPageOne(p
14490 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
144a0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20  }../*.** Get an 
144b0 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a  unused page..**.
144c0 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75  ** This works ju
144d0 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65 74  st like btreeGet
144e0 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65 20  Page() with the 
144f0 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20  addition:.**.** 
14500 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67 65    *  If the page
14510 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75   is already in u
14520 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  se for some othe
14530 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64  r purpose, immed
14540 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72  iately.**      r
14550 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72 65  elease it and re
14560 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
14570 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a  URRUPT error..**
14580 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65 20     *  Make sure 
14590 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67 20  the isInit flag 
145a0 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74  is clear.*/.stat
145b0 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 55  ic int btreeGetU
145c0 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74 53  nusedPage(.  BtS
145d0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
145e0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
145f0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
14600 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14610 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
14620 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
14630 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
14640 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
14650 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
14660 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
14670 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
14680 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
14690 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
146a0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
146b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 62  .){.  int rc = b
146c0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
146d0 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66   pgno, ppPage, f
146e0 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d  lags);.  if( rc=
146f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14700 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
14710 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28  erPageRefcount((
14720 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
14730 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65  e)>1 ){.      re
14740 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
14750 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67  e);.      *ppPag
14760 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
14770 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
14780 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
14790 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73     (*ppPage)->is
147a0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Init = 0;.  }els
147b0 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
147c0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
147d0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44   rc;.}.../*.** D
147e0 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
147f0 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  , when the pager
14800 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61   reloads informa
14810 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61  tion into the ca
14820 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  che.** so that t
14830 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74  he cache is rest
14840 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
14850 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68  inal state at th
14860 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
14870 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  e transaction, f
14880 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73  or each page res
14890 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69  tored this routi
148a0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
148b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
148c0 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20   needs to reset 
148d0 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73  the extra data s
148e0 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e  ection at the en
148f0 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d of the.** page
14900 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
14910 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61  he restored data
14920 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14930 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61   pageReinit(DbPa
14940 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65  ge *pData){.  Me
14950 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
14960 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
14970 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
14980 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
14990 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
149a0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
149b0 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20  nt(pData)>0 );. 
149c0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
149d0 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
149e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
149f0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
14a00 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
14a10 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
14a20 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
14a30 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
14a40 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20  nt(pData)>1 ){. 
14a50 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69       /* pPage mi
14a60 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72  ght not be a btr
14a70 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67  ee page;  it mig
14a80 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ht be an overflo
14a90 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
14aa0 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f  or ptrmap page o
14ab0 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20  r a free page.  
14ac0 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20  In those cases, 
14ad0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
14ae0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62      ** call to b
14af0 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77  treeInitPage() w
14b00 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72  ill likely retur
14b10 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
14b20 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  ..      ** But n
14b30 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62  o harm is done b
14b40 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20  y this.  And it 
14b50 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e  is very importan
14b60 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  t that.      ** 
14b70 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
14b80 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
14b90 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
14ba0 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
14bb0 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
14bc0 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
14bd0 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
14be0 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
14bf0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
14c00 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
14c10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
14c20 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
14c30 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a  r for a btree..*
14c40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
14c50 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
14c60 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ler(void *pArg){
14c70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14c80 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
14c90 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
14ca0 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
14cb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
14cc0 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
14cd0 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
14ce0 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
14cf0 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
14d00 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
14d10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
14d40 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
14d50 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  ));.}../*.** Ope
14d60 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
14d70 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
14d80 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
14d90 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
14da0 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
14db0 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
14dc0 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
14dd0 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
14de0 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
14df0 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
14e00 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
14e10 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
14e20 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
14e30 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
14e40 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
14e50 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
14e60 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
14e70 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
14e80 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
14e90 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
14ea0 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
14eb0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
14ec0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
14ed0 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
14ee0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
14ef0 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
14f00 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
14f10 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
14f20 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
14f30 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
14f40 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
14f50 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
14f60 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
14f70 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
14f80 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
14f90 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
14fa0 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
14fb0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
14fc0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
14fd0 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
14fe0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
14ff0 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
15000 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
15010 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
15020 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
15030 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
15040 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
15050 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
15060 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
15070 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
15080 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
15090 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
150a0 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
150b0 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
150c0 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
150d0 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
150e0 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
150f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
15100 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
15110 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
15120 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
15130 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
15140 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
15150 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
15160 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
15170 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
15180 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
15190 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
151a0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
151b0 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
151c0 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
151d0 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
151e0 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
151f0 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
15200 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
15210 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
15220 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
15230 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
15240 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
15250 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
15260 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
15270 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
15280 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
15290 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
152a0 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
152b0 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
152c0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
152d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
152e0 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
152f0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15300 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
15310 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
15320 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
15330 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
15340 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15350 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
15360 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
15370 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
15380 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
15390 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
153a0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
153b0 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
153c0 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
153d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
153e0 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
153f0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
15400 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
15410 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
15420 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
15430 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
15440 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
15450 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
15460 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
15470 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
15480 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
15490 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
154a0 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
154b0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
154c0 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
154d0 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
154e0 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
154f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
15500 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
15510 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
15520 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
15530 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
15540 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
15550 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
15560 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
15570 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
15580 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
15590 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
155a0 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
155b0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
155c0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
155d0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
155e0 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
155f0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
15600 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
15610 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
15620 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15630 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
15640 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
15650 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
15660 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
15670 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
15680 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
15690 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
156a0 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
156b0 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
156c0 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
156d0 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
156e0 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
156f0 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
15700 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
15710 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
15720 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
15730 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
15740 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
15750 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
15760 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
15770 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
15780 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
15790 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
157a0 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
157b0 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
157c0 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
157d0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
157e0 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
157f0 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
15800 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
15810 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
15820 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
15830 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
15840 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
15850 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
15860 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
15870 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
15880 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15890 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
158a0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
158b0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  RANS_NONE;.  p->
158c0 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66  db = db;.#ifndef
158d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
158e0 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c  RED_CACHE.  p->l
158f0 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ock.pBtree = p;.
15900 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65    p->lock.iTable
15910 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69   = 1;.#endif..#i
15920 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
15930 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
15940 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
15950 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
15960 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  KIO).  /*.  ** I
15970 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20  f this Btree is 
15980 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
15990 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72  shared cache, tr
159a0 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a  y to find an.  *
159b0 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61  * existing BtSha
159c0 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20  red object that 
159d0 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74  we can share wit
159e0 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54  h.  */.  if( isT
159f0 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d  empDb==0 && (isM
15a00 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46  emdb==0 || (vfsF
15a10 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
15a20 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20  _URI)!=0) ){.   
15a30 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20   if( vfsFlags & 
15a40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
15a50 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20  EDCACHE ){.     
15a60 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d   int nFilename =
15a70 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
15a80 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20  (zFilename)+1;. 
15a90 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61       int nFullPa
15aa0 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
15ab0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
15ac0 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61     char *zFullPa
15ad0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
15ae0 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c  Malloc(MAX(nFull
15af0 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61  Pathname,nFilena
15b00 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  me));.      MUTE
15b10 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
15b20 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
15b30 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d  red; )..      p-
15b40 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
15b50 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50       if( !zFullP
15b60 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
15b70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15b80 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
15b90 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
15ba0 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
15bb0 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20      if( isMemdb 
15bc0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
15bd0 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  y(zFullPathname,
15be0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c   zFilename, nFil
15bf0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  ename);.      }e
15c00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
15c10 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
15c20 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
15c30 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c50 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c              nFul
15c60 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  lPathname, zFull
15c70 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
15c80 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
15c90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
15ca0 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
15cb0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
15cc0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
15cd0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
15ce0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
15cf0 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
15d00 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20  _THREADSAFE.    
15d10 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71    mutexOpen = sq
15d20 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
15d30 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
15d40 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20  TIC_OPEN);.     
15d50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
15d60 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b  nter(mutexOpen);
15d70 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
15d80 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
15d90 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
15da0 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
15db0 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  R);.      sqlite
15dc0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
15dd0 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64  texShared);.#end
15de0 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74  if.      for(pBt
15df0 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64  =GLOBAL(BtShared
15e00 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
15e10 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20  acheList); pBt; 
15e20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b  pBt=pBt->pNext){
15e30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15e40 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
15e50 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
15e60 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
15e70 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65  ame, sqlite3Page
15e80 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
15e90 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20  Pager, 0)).     
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
15eb0 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
15ec0 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
15ed0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
15ee0 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
15ef0 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44    for(iDb=db->nD
15f00 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62  b-1; iDb>=0; iDb
15f10 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
15f20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e   Btree *pExistin
15f30 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  g = db->aDb[iDb]
15f40 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20  .pBt;.          
15f50 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20    if( pExisting 
15f60 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42  && pExisting->pB
15f70 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
15f80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
15f90 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
15fa0 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
15fb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
15fc0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
15fd0 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  xOpen);.        
15fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
15ff0 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
16000 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
16010 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
16020 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
16030 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
16040 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
16050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16060 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
16070 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
16080 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
16090 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
160a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
160b0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
160c0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
160d0 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
160e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
160f0 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
16100 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
16110 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
16120 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
16130 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
16140 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
16150 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
16160 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
16170 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
16180 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
16190 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
161a0 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
161b0 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
161c0 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
161d0 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
161e0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
161f0 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
16200 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
16210 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
16220 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
16230 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
16240 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
16250 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
16260 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
16270 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
16280 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
16290 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
162a0 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
162b0 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
162c0 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
162d0 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
162e0 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
162f0 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
16300 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
16310 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
16320 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
16330 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
16340 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
16350 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20  of(i64)==8 );.  
16360 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
16370 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20  (u64)==8 );.    
16380 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
16390 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
163a0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
163b0 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
163c0 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
163d0 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
163e0 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
163f0 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
16400 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
16410 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
16420 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
16430 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
16440 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
16450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
16460 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
16470 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
16480 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
16490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
164a0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
164b0 66 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61 67  f(MemPage), flag
164c0 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67  s, vfsFlags, pag
164d0 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66  eReinit);.    if
164e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
164f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16500 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
16510 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64  t(pBt->pPager, d
16520 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20  b->szMmap);.    
16530 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
16540 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
16550 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
16560 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
16570 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
16580 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
16590 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
165a0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
165b0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
165c0 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  pBt->openFlags =
165d0 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20   (u8)flags;.    
165e0 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  pBt->db = db;.  
165f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
16600 74 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74  tBusyHandler(pBt
16610 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49  ->pPager, btreeI
16620 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
16630 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70  , pBt);.    p->p
16640 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
16650 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
16660 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  0;.    pBt->pPag
16670 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  e1 = 0;.    if( 
16680 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
16690 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
166a0 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  er) ) pBt->btsFl
166b0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
166c0 4f 4e 4c 59 3b 0a 23 69 66 20 64 65 66 69 6e 65  ONLY;.#if define
166d0 64 28 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  d(SQLITE_SECURE_
166e0 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74 2d  DELETE).    pBt-
166f0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
16700 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
16710 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
16720 4c 49 54 45 5f 46 41 53 54 5f 53 45 43 55 52 45  LITE_FAST_SECURE
16730 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74  _DELETE).    pBt
16740 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
16750 53 5f 4f 56 45 52 57 52 49 54 45 3b 0a 23 65 6e  S_OVERWRITE;.#en
16760 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  dif.    /* EVIDE
16770 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
16780 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
16790 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
167a0 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
167b0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
167c0 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
167d0 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
167e0 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
167f0 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
16800 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
16810 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16820 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  le. */.    pBt->
16830 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48  pageSize = (zDbH
16840 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20  eader[16]<<8) | 
16850 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c  (zDbHeader[17]<<
16860 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  16);.    if( pBt
16870 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
16880 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
16890 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
168a0 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
168b0 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
168c0 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
168d0 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
168e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
168f0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
16900 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
16910 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
16920 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
16930 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
16940 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
16950 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
16960 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
16970 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
16980 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
16990 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
169a0 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
169b0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
169c0 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
169d0 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
169e0 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
169f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
16a00 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
16a10 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
16a20 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
16a30 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
16a40 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
16a50 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
16a60 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
16a70 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
16a80 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16a90 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
16aa0 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
16ab0 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
16ac0 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
16ad0 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
16ae0 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
16af0 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
16b00 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
16b10 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
16b20 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
16b30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
16b40 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
16b50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16b60 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
16b70 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20  : R-37497-42412 
16b80 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
16b90 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20  reserved region 
16ba0 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  is.      ** dete
16bb0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
16bc0 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
16bd0 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
16be0 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
16bf0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  .      ** into t
16c00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16c10 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
16c20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
16c30 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
16c40 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
16c50 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
16c60 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53  FIXED;.#ifndef S
16c70 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
16c80 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
16c90 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
16ca0 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
16cb0 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
16cc0 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
16cd0 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
16ce0 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
16cf0 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
16d00 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
16d10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
16d20 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
16d30 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
16d40 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
16d50 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
16d60 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
16d70 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
16d80 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
16d90 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
16da0 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
16db0 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
16dc0 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
16dd0 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
16de0 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
16df0 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
16e00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16e10 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
16e20 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
16e30 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
16e40 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
16e50 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
16e60 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
16e70 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
16e80 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
16e90 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20      pBt->nRef = 
16ea0 31 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68  1;.    if( p->sh
16eb0 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
16ec0 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
16ed0 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
16ee0 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20  xShared; ).     
16ef0 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75   MUTEX_LOGIC( mu
16f00 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
16f10 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
16f20 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
16f30 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20  C_MASTER);).    
16f40 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
16f50 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74  EADSAFE && sqlit
16f60 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
16f70 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
16f80 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20       pBt->mutex 
16f90 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
16fa0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
16fb0 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
16fc0 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
16fd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
16fe0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
16ff0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
17000 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
17010 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
17020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
17030 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
17040 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
17050 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
17060 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
17070 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
17080 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
17090 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
170a0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
170b0 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
170c0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
170d0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
170e0 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
170f0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
17100 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
17110 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
17120 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
17130 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
17140 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
17150 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
17160 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
17170 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
17180 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
17190 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
171a0 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
171b0 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
171c0 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
171d0 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
171e0 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
171f0 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
17200 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
17210 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
17220 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
17230 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
17240 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
17250 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
17260 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64     if( (pSib = d
17270 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d  b->aDb[i].pBt)!=
17280 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61  0 && pSib->shara
17290 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ble ){.        w
172a0 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65  hile( pSib->pPre
172b0 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62  v ){ pSib = pSib
172c0 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20  ->pPrev; }.     
172d0 20 20 20 69 66 28 20 28 75 70 74 72 29 70 2d 3e     if( (uptr)p->
172e0 70 42 74 3c 28 75 70 74 72 29 70 53 69 62 2d 3e  pBt<(uptr)pSib->
172f0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
17300 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
17310 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
17320 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
17330 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
17340 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
17350 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
17360 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
17370 20 26 26 20 28 75 70 74 72 29 70 53 69 62 2d 3e   && (uptr)pSib->
17380 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70 74 72  pNext->pBt<(uptr
17390 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  )p->pBt ){.     
173a0 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53         pSib = pS
173b0 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
173c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
173d0 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
173e0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
173f0 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53     p->pPrev = pS
17400 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ib;.          if
17410 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
17420 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
17430 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
17440 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17450 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74       pSib->pNext
17460 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = p;.        }.
17470 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17480 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17490 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72  .#endif.  *ppBtr
174a0 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f  ee = p;..btree_o
174b0 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  pen_out:.  if( r
174c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
174d0 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70      if( pBt && p
174e0 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  Bt->pPager ){.  
174f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
17500 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
17510 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r, 0);.    }.   
17520 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
17530 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
17540 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
17550 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  Btree = 0;.  }el
17560 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
17570 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20  file *pFile;..  
17580 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
17590 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
175a0 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
175b0 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
175c0 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20  size to the.    
175d0 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
175e0 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f  . Except, when o
175f0 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69  pening on an exi
17600 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
17610 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a  er-cache,.    **
17620 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
17630 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
17640 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
17650 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
17660 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d  Schema(p, 0, 0)=
17670 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
17680 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
17690 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  size(p->pBt->pPa
176a0 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ger, SQLITE_DEFA
176b0 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b  ULT_CACHE_SIZE);
176c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c  .    }..    pFil
176d0 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
176e0 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
176f0 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  );.    if( pFile
17700 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
17710 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
17720 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69  eControlHint(pFi
17730 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  le, SQLITE_FCNTL
17740 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29 26 70 42  _PDB, (void*)&pB
17750 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  t->db);.    }.  
17760 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65  }.  if( mutexOpe
17770 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
17780 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17790 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29  eld(mutexOpen) )
177a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
177b0 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
177c0 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  pen);.  }.  asse
177d0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
177e0 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  K || sqlite3Btre
177f0 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74  eConnectionCount
17800 28 2a 70 70 42 74 72 65 65 29 3e 30 20 29 3b 0a  (*ppBtree)>0 );.
17810 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17820 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
17830 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
17840 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
17850 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
17860 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
17870 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
17880 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
17890 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
178a0 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
178b0 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
178c0 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
178d0 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
178e0 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
178f0 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
17900 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
17910 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
17920 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
17930 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
17940 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
17950 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f  CACHE.  MUTEX_LO
17960 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
17970 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20  ex *pMaster; ). 
17980 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
17990 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
179a0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
179b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
179c0 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
179d0 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ) );.  MUTEX_LOG
179e0 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
179f0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
17a00 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
17a10 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
17a20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
17a30 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
17a40 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
17a50 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
17a60 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
17a70 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
17a80 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
17a90 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
17aa0 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
17ab0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
17ac0 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
17ad0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
17ae0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
17af0 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
17b00 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
17b10 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
17b20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
17b30 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
17b40 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
17b50 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
17b60 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
17b70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
17b80 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
17b90 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
17ba0 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
17bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17bc0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
17bd0 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
17be0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
17bf0 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
17c00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
17c10 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
17c20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
17c30 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
17c40 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
17c50 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
17c60 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
17c70 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
17c80 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
17c90 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
17ca0 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
17cb0 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
17cc0 73 20 77 69 74 68 20 61 20 34 2d 62 79 74 65 20  s with a 4-byte 
17cd0 70 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66  prefix for a lef
17ce0 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74  t-child.** point
17cf0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
17d00 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  id allocateTempS
17d10 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
17d20 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d  Bt){.  if( !pBt-
17d30 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
17d40 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
17d50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
17d60 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53  lloc( pBt->pageS
17d70 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  ize );..    /* O
17d80 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f  ne of the uses o
17d90 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  f pBt->pTmpSpace
17da0 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65   is to format ce
17db0 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  lls before.    *
17dc0 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d  * inserting them
17dd0 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67   into a leaf pag
17de0 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c  e (function fill
17df0 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20  InCell()). If.  
17e00 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c    ** a cell is l
17e10 65 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73  ess than 4 bytes
17e20 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20   in size, it is 
17e30 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
17e40 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20  bytes.    ** by 
17e50 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74  the various rout
17e60 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75  ines that manipu
17e70 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c  late binary cell
17e80 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20  s. Which.    ** 
17e90 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69  can mean that fi
17ea0 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20  llInCell() only 
17eb0 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20  initializes the 
17ec0 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20  first 2 or 3.   
17ed0 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d   ** bytes of pTm
17ee0 70 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74  pSpace, but that
17ef0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
17f00 65 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  es are copied fr
17f10 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74  om.    ** it int
17f20 6f 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  o a database pag
17f30 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  e. This is not a
17f40 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65  ctually a proble
17f50 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a  m, but it.    **
17f60 20 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61   does cause a va
17f70 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65  lgrind error whe
17f80 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74  n the 1 or 2 byt
17f90 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65  es of unitialize
17fa0 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69  d .    ** data i
17fb0 73 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74  s passed to syst
17fc0 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e  em call write().
17fd0 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69   So to avoid thi
17fe0 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20  s error,.    ** 
17ff0 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34  zero the first 4
18000 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73   bytes of temp s
18010 70 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a  pace here..    *
18020 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20  *.    ** Also:  
18030 50 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74  Provide four byt
18040 65 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65  es of initialize
18050 64 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 74  d space before t
18060 68 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e  he.    ** beginn
18070 69 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65  ing of pTmpSpace
18080 20 61 73 20 61 6e 20 61 72 65 61 20 61 76 61 69   as an area avai
18090 6c 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64  lable to prepend
180a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74   the.    ** left
180b0 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74  -child pointer t
180c0 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
180d0 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a  of a cell..    *
180e0 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  /.    if( pBt->p
180f0 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
18100 20 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54    memset(pBt->pT
18110 6d 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a  mpSpace, 0, 8);.
18120 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53        pBt->pTmpS
18130 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d  pace += 4;.    }
18140 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
18150 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70  ee the pBt->pTmp
18160 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  Space allocation
18170 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18180 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74  freeTempSpace(Bt
18190 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
181a0 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
181b0 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
181c0 54 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20  TmpSpace -= 4;. 
181d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
181e0 65 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ee(pBt->pTmpSpac
181f0 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d  e);.    pBt->pTm
18200 70 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a  pSpace = 0;.  }.
18210 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
18220 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
18230 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
18240 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
18250 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
18260 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
18270 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
18280 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
18290 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
182a0 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
182b0 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
182c0 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
182d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
182e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
182f0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
18300 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18310 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  r(p);.  pCur = p
18320 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
18330 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
18340 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
18350 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
18360 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
18370 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
18380 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
18390 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
183a0 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
183b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
183c0 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
183d0 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
183e0 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
183f0 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
18400 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
18410 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
18420 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
18430 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
18440 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
18450 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
18460 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
18470 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b  ack(p, SQLITE_OK
18480 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  , 0);.  sqlite3B
18490 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20  treeLeave(p);.. 
184a0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
184b0 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74   still other out
184c0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
184d0 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65  ces to the share
184e0 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72  d-btree.  ** str
184f0 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e  ucture, return n
18500 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65  ow. The remainde
18510 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  r of this proced
18520 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a  ure cleans .  **
18530 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62   up the shared-b
18540 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tree..  */.  ass
18550 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
18560 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b  ck==0 && p->lock
18570 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ed==0 );.  if( !
18580 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72  p->sharable || r
18590 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
185a0 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20  List(pBt) ){.   
185b0 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e   /* The pBt is n
185c0 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20  o longer on the 
185d0 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f  sharing list, so
185e0 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20   we can access. 
185f0 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74     ** it without
18600 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20   having to hold 
18610 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a  the mutex..    *
18620 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f  *.    ** Clean o
18630 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ut and delete th
18640 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
18650 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
18660 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
18670 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  sor );.    sqlit
18680 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
18690 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 29  ->pPager, p->db)
186a0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
186b0 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
186c0 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
186d0 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
186e0 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
186f0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
18700 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
18710 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
18720 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
18730 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
18740 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
18750 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18760 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
18770 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
18780 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
18790 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
187a0 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
187b0 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
187c0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
187d0 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
187e0 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
187f0 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
18800 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
18810 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
18820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18830 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
18840 6e 67 65 20 74 68 65 20 22 73 6f 66 74 22 20 6c  nge the "soft" l
18850 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
18860 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
18870 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75  he cache..** Unu
18880 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69  sed and unmodifi
18890 65 64 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  ed pages will be
188a0 20 72 65 63 79 63 6c 65 64 20 77 68 65 6e 20 74   recycled when t
188b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
188c0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
188d0 68 65 20 65 78 63 65 65 64 73 20 74 68 69 73 20  he exceeds this 
188e0 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42 75 74  soft limit.  But
188f0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
18900 0a 2a 2a 20 63 61 63 68 65 20 69 73 20 61 6c 6c  .** cache is all
18910 6f 77 65 64 20 74 6f 20 67 72 6f 77 20 6c 61 72  owed to grow lar
18920 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 6c 69  ger than this li
18930 6d 69 74 20 69 66 20 69 74 20 63 6f 6e 74 61 69  mit if it contai
18940 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  ns.** dirty page
18950 73 20 6f 72 20 70 61 67 65 73 20 73 74 69 6c 6c  s or pages still
18960 20 69 6e 20 61 63 74 69 76 65 20 75 73 65 2e 0a   in active use..
18970 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18980 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
18990 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
189a0 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
189b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
189c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
189d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
189e0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
189f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
18a00 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
18a10 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
18a20 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
18a30 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
18a40 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18a50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18a60 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
18a70 6e 67 65 20 74 68 65 20 22 73 70 69 6c 6c 22 20  nge the "spill" 
18a80 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
18a90 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
18aa0 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66  the cache..** If
18ab0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
18ac0 61 67 65 73 20 65 78 63 65 65 64 73 20 74 68 69  ages exceeds thi
18ad0 73 20 6c 69 6d 69 74 20 64 75 72 69 6e 67 20 61  s limit during a
18ae0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
18af0 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  on,.** the pager
18b00 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20 74   might attempt t
18b10 6f 20 22 73 70 69 6c 6c 22 20 70 61 67 65 73 20  o "spill" pages 
18b20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65  to the journal e
18b30 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72  arly in.** order
18b40 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f   to free up memo
18b50 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  ry..**.** The va
18b60 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
18b70 74 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c  the current spil
18b80 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f  l size.  If zero
18b90 20 69 73 20 70 61 73 73 65 64 0a 2a 2a 20 61 73   is passed.** as
18ba0 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f   an argument, no
18bb0 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
18bc0 65 20 74 6f 20 74 68 65 20 73 70 69 6c 6c 20 73  e to the spill s
18bd0 69 7a 65 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a  ize setting, so.
18be0 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61 67 65 20  ** using mxPage 
18bf0 6f 66 20 30 20 69 73 20 61 20 77 61 79 20 74 6f  of 0 is a way to
18c00 20 71 75 65 72 79 20 74 68 65 20 63 75 72 72 65   query the curre
18c10 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a  nt spill size..*
18c20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18c30 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 42  eeSetSpillSize(B
18c40 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
18c50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
18c60 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
18c70 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73    int res;.  ass
18c80 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
18c90 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
18ca0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
18cb0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
18cc0 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  .  res = sqlite3
18cd0 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a  PagerSetSpillsiz
18ce0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
18cf0 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
18d00 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18d10 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
18d20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
18d30 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
18d40 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
18d50 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74  it on the amount
18d60 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18d70 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62   file that may b
18d80 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70  e.** memory mapp
18d90 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
18da0 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69  e3BtreeSetMmapLi
18db0 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71  mit(Btree *p, sq
18dc0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
18dd0 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ap){.  BtShared 
18de0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
18df0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18e00 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
18e10 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
18e20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
18e30 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
18e40 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
18e50 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d  pBt->pPager, szM
18e60 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  map);.  sqlite3B
18e70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18e80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18e90 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
18ea0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
18eb0 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ZE>0 */../*.** C
18ec0 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61  hange the way da
18ed0 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20  ta is synced to 
18ee0 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  disk in order to
18ef0 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63   increase or dec
18f00 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c  rease.** how wel
18f10 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  l the database r
18f20 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75  esists damage du
18f30 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
18f40 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  and power.** fai
18f50 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20  lures.  Level 1 
18f60 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
18f70 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20  synchronous (no 
18f80 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e  syncs() occur an
18f90 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20  d.** there is a 
18fa0 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
18fb0 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76   of damage)  Lev
18fc0 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61  el 2 is the defa
18fd0 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69  ult.  There.** i
18fe0 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74  s a very low but
18ff0 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62   non-zero probab
19000 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e  ility of damage.
19010 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65    Level 3 reduce
19020 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69  s the.** probabi
19030 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74  lity of damage t
19040 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20  o near zero but 
19050 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72  with a write per
19060 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
19070 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  on..*/.#ifndef S
19080 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
19090 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c  _PRAGMAS.int sql
190a0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
190b0 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20  rFlags(.  Btree 
190c0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
190d0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f   /* The btree to
190e0 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20   set the safety 
190f0 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e  level on */.  un
19100 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
19110 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
19120 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f  PAGER_* flags */
19130 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
19140 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
19150 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
19160 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
19170 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
19180 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
19190 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
191a0 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
191b0 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29  pPager, pgFlags)
191c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
191d0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
191e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
191f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
19200 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
19210 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20   pages size and 
19220 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
19230 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72  served bytes per
19240 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66   page..** Or, if
19250 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68   the page size h
19260 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
19270 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51  fixed, return SQ
19280 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a  LITE_READONLY .*
19290 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  * without changi
192a0 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a  ng anything..**.
192b0 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  ** The page size
192c0 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
192d0 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31   of 2 between 51
192e0 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66  2 and 65536.  If
192f0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a   the page.** siz
19300 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20  e supplied does 
19310 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f  not meet this co
19320 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68  nstraint then th
19330 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
19340 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a  ot.** changed..*
19350 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20  *.** Page sizes 
19360 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  are constrained 
19370 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  to be a power of
19380 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65   two so that the
19390 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68   region.** of th
193a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
193b0 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
193c0 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50   (beginning at P
193d0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20  ENDING_BYTE,.** 
193e0 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
193f0 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e  ast the 1GB boun
19400 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30  dary, 0x40000000
19410 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72  ) needs to occur
19420 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e  .** at the begin
19430 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a  ning of a page..
19440 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
19450 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c  er nReserve is l
19460 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
19470 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
19480 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79  f reserved.** by
19490 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20  tes per page is 
194a0 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
194b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69  **.** If the iFi
194c0 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54  x!=0 then the BT
194d0 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
194e0 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20   flag is set so 
194f0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69  that the page si
19500 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61  ze.** and autova
19510 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f  cuum mode can no
19520 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67   longer be chang
19530 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
19540 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
19550 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
19560 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e   pageSize, int n
19570 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69  Reserve, int iFi
19580 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  x){.  int rc = S
19590 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68  QLITE_OK;.  BtSh
195a0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
195b0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52  Bt;.  assert( nR
195c0 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52  eserve>=-1 && nR
195d0 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
195e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
195f0 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54  er(p);.#if SQLIT
19600 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
19610 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e  ( nReserve>pBt->
19620 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29  optimalReserve )
19630 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73   pBt->optimalRes
19640 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65  erve = (u8)nRese
19650 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  rve;.#endif.  if
19660 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
19670 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
19680 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  IXED ){.    sqli
19690 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
196a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
196b0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
196c0 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  }.  if( nReserve
196d0 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72  <0 ){.    nReser
196e0 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ve = pBt->pageSi
196f0 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
19700 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Size;.  }.  asse
19710 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
19720 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
19730 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69   );.  if( pageSi
19740 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
19750 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
19760 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20  PAGE_SIZE &&.   
19770 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d       ((pageSize-
19780 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20  1)&pageSize)==0 
19790 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
197a0 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
197b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
197c0 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
197d0 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
197e0 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69  ze = (u32)pageSi
197f0 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  ze;.    freeTemp
19800 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a  Space(pBt);.  }.
19810 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
19820 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
19830 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
19840 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
19850 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73  erve);.  pBt->us
19860 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
19870 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29  pageSize - (u16)
19880 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20  nReserve;.  if( 
19890 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46  iFix ) pBt->btsF
198a0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
198b0 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71  SIZE_FIXED;.  sq
198c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
198d0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
198e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
198f0 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
19900 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  efined page size
19910 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19920 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
19930 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
19940 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
19950 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Size;.}../*.** T
19960 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19970 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
19980 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
19990 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  e(), except that
199a0 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20   it.** may only 
199b0 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20  be called if it 
199c0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
199d0 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  at the b-tree mu
199e0 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  tex is already.*
199f0 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  * held..**.** Th
19a00 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20  is is useful in 
19a10 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  one special case
19a20 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41   in the backup A
19a30 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74  PI code where it
19a40 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61   is.** known tha
19a50 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74  t the shared b-t
19a60 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c  ree mutex is hel
19a70 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78  d, but the mutex
19a80 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   on the .** data
19a90 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
19aa0 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e   owns *p is not.
19ab0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66   In this case if
19ac0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
19ad0 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20  er().** were to 
19ae0 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69  be called, it mi
19af0 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  ght collide with
19b00 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72   some other oper
19b10 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  ation on the.** 
19b20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
19b30 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61  that owns *p, ca
19b40 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20  using undefined 
19b50 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74  behavior..*/.int
19b60 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
19b70 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42  ReserveNoMutex(B
19b80 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
19b90 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  n;.  assert( sql
19ba0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
19bb0 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  p->pBt->mutex) )
19bc0 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  ;.  n = p->pBt->
19bd0 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42  pageSize - p->pB
19be0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
19bf0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
19c00 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
19c10 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
19c20 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
19c30 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  nd of every page
19c40 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74   that.** are int
19c50 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e  entually left un
19c60 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  used.  This is t
19c70 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70  he "reserved" sp
19c80 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73  ace that is.** s
19c90 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79  ometimes used by
19ca0 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a   extensions..**.
19cb0 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53  ** If SQLITE_HAS
19cc0 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e 65  _MUTEX is define
19cd0 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d then the numbe
19ce0 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  r returned is th
19cf0 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20  e.** greater of 
19d00 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 65  the current rese
19d10 72 76 65 64 20 73 70 61 63 65 20 61 6e 64 20 74  rved space and t
19d20 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65  he maximum reque
19d30 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20  sted.** reserve 
19d40 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  space..*/.int sq
19d50 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f 70 74  lite3BtreeGetOpt
19d60 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72 65  imalReserve(Btre
19d70 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
19d80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
19d90 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
19da0 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
19db0 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a  erveNoMutex(p);.
19dc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
19dd0 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c  S_CODEC.  if( n<
19de0 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  p->pBt->optimalR
19df0 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e  eserve ) n = p->
19e00 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
19e10 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  rve;.#endif.  sq
19e20 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
19e30 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
19e40 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  }.../*.** Set th
19e50 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
19e60 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62  ount for a datab
19e70 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ase if mxPage is
19e80 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f   positive..** No
19e90 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
19ea0 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30  e if mxPage is 0
19eb0 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   or negative..**
19ec0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
19ed0 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  he value of mxPa
19ee0 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d  ge, return the m
19ef0 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
19f00 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
19f10 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75  3BtreeMaxPageCou
19f20 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
19f30 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
19f40 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
19f50 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
19f60 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
19f70 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74  PageCount(p->pBt
19f80 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
19f90 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
19fa0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
19fb0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
19fc0 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
19fd0 73 20 66 6f 72 20 74 68 65 20 42 54 53 5f 53 45  s for the BTS_SE
19fe0 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20  CURE_DELETE and 
19ff0 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 66 6c  BTS_OVERWRITE fl
1a000 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6e 65  ags:.**.**    ne
1a010 77 46 6c 61 67 3d 3d 30 20 20 20 20 20 20 20 42  wFlag==0       B
1a020 6f 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44  oth BTS_SECURE_D
1a030 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f 56  ELETE and BTS_OV
1a040 45 52 57 52 49 54 45 20 61 72 65 20 63 6c 65 61  ERWRITE are clea
1a050 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  red.**    newFla
1a060 67 3d 3d 31 20 20 20 20 20 20 20 42 54 53 5f 53  g==1       BTS_S
1a070 45 43 55 52 45 5f 44 45 4c 45 54 45 20 73 65 74  ECURE_DELETE set
1a080 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49   and BTS_OVERWRI
1a090 54 45 20 69 73 20 63 6c 65 61 72 65 64 0a 2a 2a  TE is cleared.**
1a0a0 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 32 20 20      newFlag==2  
1a0b0 20 20 20 20 20 42 54 53 5f 53 45 43 55 52 45 5f       BTS_SECURE_
1a0c0 44 45 4c 45 54 45 20 63 6c 65 61 72 65 64 20 61  DELETE cleared a
1a0d0 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  nd BTS_OVERWRITE
1a0e0 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 6e 65   is set.**    ne
1a0f0 77 46 6c 61 67 3d 3d 28 2d 31 29 20 20 20 20 4e  wFlag==(-1)    N
1a100 6f 20 63 68 61 6e 67 65 73 0a 2a 2a 0a 2a 2a 20  o changes.**.** 
1a110 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
1a120 73 20 61 73 20 61 20 71 75 65 72 79 20 69 66 20  s as a query if 
1a130 6e 65 77 46 6c 61 67 20 69 73 20 6c 65 73 73 20  newFlag is less 
1a140 74 68 61 6e 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20  than zero.**.** 
1a150 57 69 74 68 20 42 54 53 5f 4f 56 45 52 57 52 49  With BTS_OVERWRI
1a160 54 45 20 73 65 74 2c 20 64 65 6c 65 74 65 64 20  TE set, deleted 
1a170 63 6f 6e 74 65 6e 74 20 69 73 20 6f 76 65 72 77  content is overw
1a180 72 69 74 74 65 6e 20 62 79 20 7a 65 72 6f 73 2c  ritten by zeros,
1a190 20 62 75 74 0a 2a 2a 20 66 72 65 65 6c 69 73 74   but.** freelist
1a1a0 20 6c 65 61 66 20 70 61 67 65 73 20 61 72 65 20   leaf pages are 
1a1b0 6e 6f 74 20 77 72 69 74 74 65 6e 20 62 61 63 6b  not written back
1a1c0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1a1d0 2e 20 20 54 68 75 73 20 69 6e 2d 70 61 67 65 0a  .  Thus in-page.
1a1e0 2a 2a 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65  ** deleted conte
1a1f0 6e 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 62  nt is cleared, b
1a200 75 74 20 66 72 65 65 6c 69 73 74 20 64 65 6c 65  ut freelist dele
1a210 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ted content is n
1a220 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42  ot..**.** With B
1a230 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
1a240 2c 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 6c  , operation is l
1a250 69 6b 65 20 42 54 53 5f 4f 56 45 52 57 52 49 54  ike BTS_OVERWRIT
1a260 45 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74  E with the addit
1a270 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 66 72 65 65  ion.** that free
1a280 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20  list leaf pages 
1a290 61 72 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b  are written back
1a2a0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1a2b0 73 65 2c 20 69 6e 63 72 65 61 73 69 6e 67 0a 2a  se, increasing.*
1a2c0 2a 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  * the amount of 
1a2d0 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74  disk I/O..*/.int
1a2e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63   sqlite3BtreeSec
1a2f0 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20  ureDelete(Btree 
1a300 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29  *p, int newFlag)
1a310 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28  {.  int b;.  if(
1a320 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
1a330 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1a340 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
1a350 72 74 28 20 42 54 53 5f 4f 56 45 52 57 52 49 54  rt( BTS_OVERWRIT
1a360 45 3d 3d 42 54 53 5f 53 45 43 55 52 45 5f 44 45  E==BTS_SECURE_DE
1a370 4c 45 54 45 2a 32 20 29 3b 0a 20 20 61 73 73 65  LETE*2 );.  asse
1a380 72 74 28 20 42 54 53 5f 46 41 53 54 5f 53 45 43  rt( BTS_FAST_SEC
1a390 55 52 45 3d 3d 28 42 54 53 5f 4f 56 45 52 57 52  URE==(BTS_OVERWR
1a3a0 49 54 45 7c 42 54 53 5f 53 45 43 55 52 45 5f 44  ITE|BTS_SECURE_D
1a3b0 45 4c 45 54 45 29 20 29 3b 0a 20 20 69 66 28 20  ELETE) );.  if( 
1a3c0 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20  newFlag>=0 ){.  
1a3d0 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61    p->pBt->btsFla
1a3e0 67 73 20 26 3d 20 7e 42 54 53 5f 46 41 53 54 5f  gs &= ~BTS_FAST_
1a3f0 53 45 43 55 52 45 3b 0a 20 20 20 20 70 2d 3e 70  SECURE;.    p->p
1a400 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1a410 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
1a420 45 2a 6e 65 77 46 6c 61 67 3b 0a 20 20 7d 0a 20  E*newFlag;.  }. 
1a430 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74   b = (p->pBt->bt
1a440 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53  sFlags & BTS_FAS
1a450 54 5f 53 45 43 55 52 45 29 2f 42 54 53 5f 53 45  T_SECURE)/BTS_SE
1a460 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 73  CURE_DELETE;.  s
1a470 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1a480 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
1a490 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
1a4a0 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
1a4b0 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  m' property of t
1a4c0 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
1a4d0 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27  the 'autoVacuum'
1a4e0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
1a4f0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
1a500 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
1a510 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   is enabled. If 
1a520 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64  zero, it.** is d
1a530 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66  isabled. The def
1a540 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
1a550 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70  he auto-vacuum p
1a560 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64  roperty is .** d
1a570 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
1a580 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1a590 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f  AUTOVACUUM macro
1a5a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a5b0 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75  BtreeSetAutoVacu
1a5c0 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  um(Btree *p, int
1a5d0 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69   autoVacuum){.#i
1a5e0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
1a5f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
1a600 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
1a610 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74  ONLY;.#else.  Bt
1a620 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1a630 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
1a640 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
1a650 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61   av = (u8)autoVa
1a660 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  cuum;..  sqlite3
1a670 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1a680 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
1a690 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
1a6a0 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20  ZE_FIXED)!=0 && 
1a6b0 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
1a6c0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1a6d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1a6e0 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
1a6f0 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
1a700 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
1a710 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
1a720 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
1a730 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
1a740 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1a750 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
1a760 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
1a770 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
1a780 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
1a790 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
1a7a0 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
1a7b0 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
1a7c0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1a7d0 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
1a7e0 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
1a7f0 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
1a800 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
1a810 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1a820 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
1a830 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
1a840 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
1a850 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1a860 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
1a870 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
1a880 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
1a890 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
1a8a0 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
1a8b0 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
1a8c0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
1a8d0 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
1a8e0 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
1a8f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1a900 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1a910 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
1a920 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65  /*.** If the use
1a930 72 20 68 61 73 20 6e 6f 74 20 73 65 74 20 74 68  r has not set th
1a940 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 66  e safety-level f
1a950 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
1a960 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75   connection.** u
1a970 73 69 6e 67 20 22 50 52 41 47 4d 41 20 73 79 6e  sing "PRAGMA syn
1a980 63 68 72 6f 6e 6f 75 73 22 2c 20 61 6e 64 20 69  chronous", and i
1a990 66 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76  f the safety-lev
1a9a0 65 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  el is not alread
1a9b0 79 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20  y.** set to the 
1a9c0 76 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20  value passed to 
1a9d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
1a9e0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
1a9f0 6d 65 74 65 72 2c 0a 2a 2a 20 73 65 74 20 69 74  meter,.** set it
1aa00 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49   so..*/.#if SQLI
1aa10 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48  TE_DEFAULT_SYNCH
1aa20 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44  RONOUS!=SQLITE_D
1aa30 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48  EFAULT_WAL_SYNCH
1aa40 52 4f 4e 4f 55 53 20 5c 0a 20 20 20 20 26 26 20  RONOUS \.    && 
1aa50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1aa60 4f 4d 49 54 5f 57 41 4c 29 0a 73 74 61 74 69 63  OMIT_WAL).static
1aa70 20 76 6f 69 64 20 73 65 74 44 65 66 61 75 6c 74   void setDefault
1aa80 53 79 6e 63 46 6c 61 67 28 42 74 53 68 61 72 65  SyncFlag(BtShare
1aa90 64 20 2a 70 42 74 2c 20 75 38 20 73 61 66 65 74  d *pBt, u8 safet
1aaa0 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73 71 6c 69  y_level){.  sqli
1aab0 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 70  te3 *db;.  Db *p
1aac0 44 62 3b 0a 20 20 69 66 28 20 28 64 62 3d 70 42  Db;.  if( (db=pB
1aad0 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70 44  t->db)!=0 && (pD
1aae0 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29 7b  b=db->aDb)!=0 ){
1aaf0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d  .    while( pDb-
1ab00 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e  >pBt==0 || pDb->
1ab10 70 42 74 2d 3e 70 42 74 21 3d 70 42 74 20 29 7b  pBt->pBt!=pBt ){
1ab20 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20 69 66   pDb++; }.    if
1ab30 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74 3d  ( pDb->bSyncSet=
1ab40 3d 30 20 0a 20 20 20 20 20 26 26 20 70 44 62 2d  =0 .     && pDb-
1ab50 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d 73  >safety_level!=s
1ab60 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a 20 20 20  afety_level .   
1ab70 20 20 26 26 20 70 44 62 21 3d 26 64 62 2d 3e 61    && pDb!=&db->a
1ab80 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b 0a 20 20  Db[1] .    ){.  
1ab90 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
1aba0 6c 65 76 65 6c 20 3d 20 73 61 66 65 74 79 5f 6c  level = safety_l
1abb0 65 76 65 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  evel;.      sqli
1abc0 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
1abd0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a 20 20  (pBt->pPager,.  
1abe0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66          pDb->saf
1abf0 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62 2d  ety_level | (db-
1ac00 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46  >flags & PAGER_F
1ac10 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20 20  LAGS_MASK));.   
1ac20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
1ac30 20 64 65 66 69 6e 65 20 73 65 74 44 65 66 61 75   define setDefau
1ac40 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 73  ltSyncFlag(pBt,s
1ac50 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a 23 65 6e  afety_level).#en
1ac60 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  dif../* Forward 
1ac70 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73  declaration */.s
1ac80 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74  tatic int newDat
1ac90 61 62 61 73 65 28 42 74 53 68 61 72 65 64 2a 29  abase(BtShared*)
1aca0 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  ;.../*.** Get a 
1acb0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
1acc0 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
1acd0 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
1ace0 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
1acf0 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
1ad00 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
1ad10 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1ad20 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1ad30 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
1ad40 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
1ad50 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
1ad60 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
1ad70 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
1ad80 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
1ad90 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
1ada0 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
1adb0 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
1adc0 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
1add0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
1ade0 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
1adf0 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69  emory. .*/.stati
1ae00 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28  c int lockBtree(
1ae10 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1ae20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1ae30 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1ae40 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
1ae50 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d  nctions */.  Mem
1ae60 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20  Page *pPage1;   
1ae70 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74    /* Page 1 of t
1ae80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ae90 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
1aea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1aeb0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1aec0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
1aed0 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65  .  int nPageFile
1aee0 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
1aef0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1af00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1af10 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65  */.  int nPageHe
1af20 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  ader;     /* Num
1af30 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1af40 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63 63  the database acc
1af50 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f  ording to hdr */
1af60 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1af70 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1af80 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1af90 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
1afa0 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  ge1==0 );.  rc =
1afb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
1afc0 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61  redLock(pBt->pPa
1afd0 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
1afe0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1aff0 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74  rn rc;.  rc = bt
1b000 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1b010 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
1b020 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b030 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1b040 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
1b050 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
1b060 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
1b070 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
1b080 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
1b090 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b0a0 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20  .  */.  nPage = 
1b0b0 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67 65  nPageHeader = ge
1b0c0 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
1b0d0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
1b0e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1b0f0 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1b100 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b  er, &nPageFile);
1b110 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
1b120 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38  || memcmp(24+(u8
1b130 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
1b140 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d   92+(u8*)pPage1-
1b150 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a  >aData,4)!=0 ){.
1b160 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
1b170 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  eFile;.  }.  if(
1b180 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73   (pBt->db->flags
1b190 20 26 20 53 51 4c 49 54 45 5f 52 65 73 65 74 44   & SQLITE_ResetD
1b1a0 61 74 61 62 61 73 65 29 21 3d 30 20 29 7b 0a 20  atabase)!=0 ){. 
1b1b0 20 20 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20     nPage = 0;.  
1b1c0 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20  }.  if( nPage>0 
1b1d0 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53  ){.    u32 pageS
1b1e0 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61  ize;.    u32 usa
1b1f0 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
1b200 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
1b210 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
1b220 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
1b230 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1b240 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39  OF: R-43737-3999
1b250 39 20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51  9 Every valid SQ
1b260 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69  Lite database fi
1b270 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a  le begins.    **
1b280 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
1b290 69 6e 67 20 31 36 20 62 79 74 65 73 20 28 69 6e  ing 16 bytes (in
1b2a0 20 68 65 78 29 3a 20 35 33 20 35 31 20 34 63 20   hex): 53 51 4c 
1b2b0 36 39 20 37 34 20 36 35 20 32 30 20 36 36 20 36  69 74 65 20 66 6
1b2c0 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36  f 72 6d.    ** 6
1b2d0 31 20 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a  1 74 20 33 00. *
1b2e0 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
1b2f0 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
1b300 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
1b310 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
1b320 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
1b330 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1b340 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
1b350 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
1b360 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
1b370 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
1b380 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
1b390 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
1b3a0 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
1b3b0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
1b3c0 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ed;.    }.#else.
1b3d0 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
1b3e0 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>2 ){.      pBt
1b3f0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1b400 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
1b410 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
1b420 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [19]>2 ){.      
1b430 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
1b440 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
1b450 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69     /* If the wri
1b460 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65  te version is se
1b470 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74  t to 2, this dat
1b480 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20  abase should be 
1b490 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20  accessed.    ** 
1b4a0 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20  in WAL mode. If 
1b4b0 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61  the log is not a
1b4c0 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65  lready open, ope
1b4d0 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a  n it now. Then .
1b4e0 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51      ** return SQ
1b4f0 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75  LITE_OK and retu
1b500 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c  rn without popul
1b510 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70  ating BtShared.p
1b520 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68  Page1..    ** Th
1b530 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73  e caller detects
1b540 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20   this and calls 
1b550 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
1b560 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20  ain. This is.   
1b570 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20   ** required as 
1b580 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  the version of p
1b590 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20  age 1 currently 
1b5a0 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66  in the page1 buf
1b5b0 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  fer.    ** may n
1b5c0 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74  ot be the latest
1b5d0 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65   version - there
1b5e0 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20   may be a newer 
1b5f0 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20  one in the log. 
1b600 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
1b610 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  */.    if( page1
1b620 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d  [19]==2 && (pBt-
1b630 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1b640 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20  NO_WAL)==0 ){.  
1b650 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d      int isOpen =
1b660 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
1b670 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
1b680 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
1b690 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  &isOpen);.      
1b6a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b6b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
1b6c0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
1b6d0 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  led;.      }else
1b6e0 7b 0a 20 20 20 20 20 20 20 20 73 65 74 44 65 66  {.        setDef
1b6f0 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74  aultSyncFlag(pBt
1b700 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
1b710 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  _WAL_SYNCHRONOUS
1b720 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +1);.        if(
1b730 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20   isOpen==0 ){.  
1b740 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1b750 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
1b760 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1b770 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b780 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b790 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b7a0 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65 6c 73  NOTADB;.    }els
1b7b0 65 7b 0a 20 20 20 20 20 20 73 65 74 44 65 66 61  e{.      setDefa
1b7c0 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c  ultSyncFlag(pBt,
1b7d0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1b7e0 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a  SYNCHRONOUS+1);.
1b7f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1b800 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1b810 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33 20  : R-15465-20813 
1b820 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20  The maximum and 
1b830 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65 64  minimum embedded
1b840 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20   payload.    ** 
1b850 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74 68  fractions and th
1b860 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66  e leaf payload f
1b870 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d  raction values m
1b880 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20 61  ust be 64, 32, a
1b890 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20  nd 32..    **.  
1b8a0 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
1b8b0 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
1b8c0 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
1b8d0 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
1b8e0 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
1b8f0 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
1b900 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
1b910 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
1b920 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
1b930 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
1b940 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
1b950 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1b960 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1b970 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e   }.    /* EVIDEN
1b980 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33  CE-OF: R-51873-3
1b990 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69  9618 The page si
1b9a0 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ze for a databas
1b9b0 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  e file is.    **
1b9c0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
1b9d0 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65  he 2-byte intege
1b9e0 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20  r located at an 
1b9f0 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74  offset of 16 byt
1ba00 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  es from.    ** t
1ba10 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
1ba20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ba30 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53 69  e. */.    pageSi
1ba40 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c  ze = (page1[16]<
1ba50 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d  <8) | (page1[17]
1ba60 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56  <<16);.    /* EV
1ba70 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30  IDENCE-OF: R-250
1ba80 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69 7a  08-21688 The siz
1ba90 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20 61  e of a page is a
1baa0 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20 20   power of two.  
1bab0 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31 32    ** between 512
1bac0 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c 75   and 65536 inclu
1bad0 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sive. */.    if(
1bae0 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
1baf0 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20  ageSize)!=0.    
1bb00 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c   || pageSize>SQL
1bb10 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
1bb20 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  E .     || pageS
1bb30 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b  ize<=256 .    ){
1bb40 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
1bb50 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
1bb60 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1bb70 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
1bb80 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  =0 );.    /* EVI
1bb90 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31  DENCE-OF: R-5931
1bba0 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65 73  0-51205 The "res
1bbb0 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69 7a  erved space" siz
1bbc0 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65 0a  e in the 1-byte.
1bbd0 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61      ** integer a
1bbe0 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20 74  t offset 20 is t
1bbf0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1bc00 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
1bc10 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a  he end of.    **
1bc20 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72 65   each page to re
1bc30 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e 73  serve for extens
1bc40 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  ions. .    **.  
1bc50 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
1bc60 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20  : R-37497-42412 
1bc70 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
1bc80 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20  reserved region 
1bc90 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
1bca0 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d  ined by the one-
1bcb0 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e  byte unsigned in
1bcc0 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61  teger found at a
1bcd0 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20  n offset of 20. 
1bce0 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
1bcf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
1bd00 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62  der. */.    usab
1bd10 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  leSize = pageSiz
1bd20 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20  e - page1[20];. 
1bd30 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65     if( (u32)page
1bd40 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
1bd50 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
1bd60 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
1bd70 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
1bd80 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
1bd90 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
1bda0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
1bdb0 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
1bdc0 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
1bdd0 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
1bde0 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
1bdf0 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
1be00 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
1be10 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
1be20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
1be30 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
1be40 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1be50 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
1be60 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
1be70 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
1be80 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
1be90 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
1bea0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1beb0 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
1bec0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70  pPage1);.      p
1bed0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
1bee0 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
1bef0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
1bf00 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
1bf10 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
1bf20 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20  (pBt);.      rc 
1bf30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
1bf40 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
1bf50 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
1bf60 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf80 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69            pageSi
1bf90 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  ze-usableSize);.
1bfa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1bfb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
1bfc0 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65 53 63  qlite3WritableSc
1bfd0 68 65 6d 61 28 70 42 74 2d 3e 64 62 29 3d 3d 30  hema(pBt->db)==0
1bfe0 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46   && nPage>nPageF
1bff0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ile ){.      rc 
1c000 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1c010 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
1c020 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
1c030 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  led;.    }.    /
1c040 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1c050 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77  -28312-64704 How
1c060 65 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65  ever, the usable
1c070 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c   size is not all
1c080 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  owed to.    ** b
1c090 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e  e less than 480.
1c0a0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1c0b0 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
1c0c0 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74  e is 512, then t
1c0d0 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76  he.    ** reserv
1c0e0 65 64 20 73 70 61 63 65 20 73 69 7a 65 20 63 61  ed space size ca
1c0f0 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20  nnot exceed 32. 
1c100 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c  */.    if( usabl
1c110 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20  eSize<480 ){.   
1c120 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
1c130 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
1c140 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
1c150 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
1c160 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
1c170 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  ze = usableSize;
1c180 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c190 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1c1a0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
1c1b0 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
1c1c0 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d  &page1[36 + 4*4]
1c1d0 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d  )?1:0);.    pBt-
1c1e0 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
1c1f0 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
1c200 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
1c210 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
1c220 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
1c230 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
1c240 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
1c250 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
1c260 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
1c270 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
1c280 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
1c290 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
1c2a0 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
1c2b0 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
1c2c0 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
1c2d0 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
1c2e0 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
1c2f0 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
1c300 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
1c310 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
1c320 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
1c330 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
1c340 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
1c350 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
1c360 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
1c370 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
1c380 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
1c390 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
1c3a0 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
1c3b0 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
1c3c0 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
1c3d0 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
1c3e0 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72  ointer, a header
1c3f0 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
1c400 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
1c410 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
1c420 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
1c430 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
1c440 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
1c450 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
1c460 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
1c470 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >maxLocal = (u16
1c480 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
1c490 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20  ze-12)*64/255 - 
1c4a0 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  23);.  pBt->minL
1c4b0 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
1c4c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
1c4d0 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*32/255 - 23);.
1c4e0 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
1c4f0 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
1c500 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20  leSize - 35);.  
1c510 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28  pBt->minLeaf = (
1c520 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
1c530 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
1c540 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42   - 23);.  if( pB
1c550 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20  t->maxLocal>127 
1c560 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  ){.    pBt->max1
1c570 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32  bytePayload = 12
1c580 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
1c590 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
1c5a0 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e  load = (u8)pBt->
1c5b0 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  maxLocal;.  }.  
1c5c0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
1c5d0 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
1c5e0 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
1c5f0 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
1c600 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d  = pPage1;.  pBt-
1c610 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
1c620 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c630 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
1c640 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
1c650 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
1c660 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
1c670 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
1c680 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
1c690 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
1c6a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1c6b0 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70  ursors open on p
1c6c0 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20  Bt. This is for 
1c6d0 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  use.** in assert
1c6e0 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  () expressions, 
1c6f0 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f  so it is only co
1c700 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47  mpiled if NDEBUG
1c710 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e   is not.** defin
1c720 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77  ed..**.** Only w
1c730 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
1c740 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e   counted if wrOn
1c750 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49 66 20  ly is true.  If 
1c760 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c  wrOnly is.** fal
1c770 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73  se then all curs
1c780 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e  ors are counted.
1c790 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
1c7a0 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
1c7b0 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f  routine, a curso
1c7c0 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20  r is any cursor 
1c7d0 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62  that.** is capab
1c7e0 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72  le of reading or
1c7f0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
1c800 64 61 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f  database.  Curso
1c810 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20  rs that.** have 
1c820 62 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74  been tripped int
1c830 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55  o the CURSOR_FAU
1c840 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74  LT state are not
1c850 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61   counted..*/.sta
1c860 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c  tic int countVal
1c870 69 64 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  idCursors(BtShar
1c880 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f  ed *pBt, int wrO
1c890 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
1c8a0 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20   *pCur;.  int r 
1c8b0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d  = 0;.  for(pCur=
1c8c0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43  pBt->pCursor; pC
1c8d0 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70  ur; pCur=pCur->p
1c8e0 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28  Next){.    if( (
1c8f0 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43  wrOnly==0 || (pC
1c900 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
1c910 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d  TCF_WriteFlag)!=
1c920 30 29 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d  0).     && pCur-
1c930 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
1c940 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20  FAULT ) r++; .  
1c950 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
1c960 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
1c970 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
1c980 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
1c990 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74  s and we are not
1c9a0 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a   in the middle.*
1c9b0 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  * of a transacti
1c9c0 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20  on but there is 
1c9d0 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
1c9e0 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  he database, the
1c9f0 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
1ca00 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72  e unrefs the fir
1ca10 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1ca20 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69  atabase file whi
1ca30 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65  ch .** has the e
1ca40 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69  ffect of releasi
1ca50 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  ng the read lock
1ca60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
1ca70 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
1ca80 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74  n in progress, t
1ca90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1caa0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1cab0 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72  c void unlockBtr
1cac0 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61  eeIfUnused(BtSha
1cad0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73  red *pBt){.  ass
1cae0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1caf0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1cb00 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1cb10 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
1cb20 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20  rs(pBt,0)==0 || 
1cb30 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1cb40 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  on>TRANS_NONE );
1cb50 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
1cb60 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1cb70 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50  _NONE && pBt->pP
1cb80 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d  age1!=0 ){.    M
1cb90 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1cba0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1cbb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 31    assert( pPage1
1cbc0 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
1cbd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
1cbe0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
1cbf0 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20  >pPager)==1 );. 
1cc00 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
1cc10 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   0;.    releaseP
1cc20 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
1cc30 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
1cc40 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  pBt points to an
1cc50 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e   empty file then
1cc60 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d   convert that em
1cc70 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f  pty file.** into
1cc80 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74   a new empty dat
1cc90 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
1cca0 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
1ccb0 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64  page of.** the d
1ccc0 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
1ccd0 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
1cce0 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
1ccf0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1cd00 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
1cd10 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
1cd20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
1cd30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1cd40 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1cd50 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
1cd60 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
1cd70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1cd80 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
1cd90 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
1cda0 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
1cdb0 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
1cdc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1cdd0 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
1cde0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
1cdf0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
1ce00 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
1ce10 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
1ce20 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
1ce30 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
1ce40 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
1ce50 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36  =16 );.  data[16
1ce60 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
1ce70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66  ageSize>>8)&0xff
1ce80 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20  );.  data[17] = 
1ce90 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
1cea0 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a  ize>>16)&0xff);.
1ceb0 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
1cec0 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
1ced0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
1cee0 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e  sableSize<=pBt->
1cef0 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d  pageSize && pBt-
1cf00 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e  >usableSize+255>
1cf10 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  =pBt->pageSize);
1cf20 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75  .  data[20] = (u
1cf30 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
1cf40 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
1cf50 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ze);.  data[21] 
1cf60 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
1cf70 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
1cf80 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
1cf90 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
1cfa0 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
1cfb0 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
1cfc0 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
1cfd0 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
1cfe0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1cff0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
1d000 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
1d010 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1d020 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
1d030 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
1d040 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
1d050 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
1d060 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
1d070 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
1d080 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
1d090 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
1d0a0 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
1d0b0 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
1d0c0 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
1d0d0 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
1d0e0 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
1d0f0 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
1d100 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20  1;.  data[31] = 
1d110 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
1d120 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1d130 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66  Initialize the f
1d140 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1d150 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1d160 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62  creating a datab
1d170 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e  ase.** consistin
1d180 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  g of a single pa
1d190 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61  ge and no schema
1d1a0 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72   objects). Retur
1d1b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  n SQLITE_OK.** i
1d1c0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
1d1d0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1d1e0 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
1d1f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1d200 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20  treeNewDb(Btree 
1d210 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
1d220 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1d230 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
1d240 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63  >nPage = 0;.  rc
1d250 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1d260 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65  ->pBt);.  sqlite
1d270 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1d280 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d290 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
1d2a0 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   start a new tra
1d2b0 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74  nsaction. A writ
1d2c0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
1d2d0 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74   is started if t
1d2e0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1d2f0 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f  nt is nonzero, o
1d300 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d  therwise a read-
1d310 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
1d320 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
1d330 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72  argument is 2 or
1d340 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73   more and exclus
1d350 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
1d360 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d  on is started, m
1d370 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f  eaning that no o
1d380 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
1d390 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63  allowed.** to ac
1d3a0 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
1d3b0 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e  e.  A preexistin
1d3c0 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  g transaction ma
1d3d0 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72  y not be.** upgr
1d3e0 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  aded to exclusiv
1d3f0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  e by calling thi
1d400 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f  s routine a seco
1d410 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a  nd time - the.**
1d420 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61   exclusivity fla
1d430 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  g only works for
1d440 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
1d450 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74  on..**.** A writ
1d460 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
1d470 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
1d480 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
1d490 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  any .** changes 
1d4a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
1d4b0 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f    None of the fo
1d4c0 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
1d4d0 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75   .** will work u
1d4e0 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
1d4f0 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66  ion is started f
1d500 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst:.**.**     
1d510 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1d520 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ateTable().**   
1d530 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1d540 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20  reateIndex().** 
1d550 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1d560 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a  eClearTable().**
1d570 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1d580 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a  eeDropTable().**
1d590 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1d5a0 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20  eeInsert().**   
1d5b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
1d5c0 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20  elete().**      
1d5d0 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
1d5e0 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49  teMeta().**.** I
1d5f0 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74  f an initial att
1d600 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20  empt to acquire 
1d610 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62  the lock fails b
1d620 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63  ecause of lock c
1d630 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ontention.** and
1d640 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
1d650 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c  s previously unl
1d660 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  ocked, then invo
1d670 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
1d680 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ler.** if there 
1d690 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20  is one.  But if 
1d6a0 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f  there was previo
1d6b0 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  usly a read-lock
1d6c0 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f  , do not.** invo
1d6d0 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
1d6e0 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72  ler - just retur
1d6f0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
1d700 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a  SQLITE_BUSY is .
1d710 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  ** returned when
1d720 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
1d730 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e  y a read-lock in
1d740 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
1d750 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  a deadlock..**.*
1d760 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20  * Suppose there 
1d770 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  are two processe
1d780 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61  s A and B.  A ha
1d790 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e  s a read lock an
1d7a0 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73  d B has.** a res
1d7b0 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74  erved lock.  B t
1d7c0 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
1d7d0 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74  to exclusive but
1d7e0 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61   is blocked beca
1d7f0 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65  use.** of A's re
1d800 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65  ad lock.  A trie
1d810 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
1d820 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20  reserved but is 
1d830 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a  blocked by B..**
1d840 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65   One or the othe
1d850 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f  r of the two pro
1d860 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65  cesses must give
1d870 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61   way or there ca
1d880 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72  n be.** no progr
1d890 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69  ess.  By returni
1d8a0 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ng SQLITE_BUSY a
1d8b0 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20  nd not invoking 
1d8c0 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
1d8d0 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65  k.** when A alre
1d8e0 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c  ady has a read l
1d8f0 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67  ock, we encourag
1d900 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61  e A to give up a
1d910 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63  nd let B.** proc
1d920 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eed..*/.int sqli
1d930 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
1d940 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ns(Btree *p, int
1d950 20 77 72 66 6c 61 67 2c 20 69 6e 74 20 2a 70 53   wrflag, int *pS
1d960 63 68 65 6d 61 56 65 72 73 69 6f 6e 29 7b 0a 20  chemaVersion){. 
1d970 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1d980 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
1d990 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d9a0 20 69 6e 74 20 62 43 6f 6e 63 75 72 72 65 6e 74   int bConcurrent
1d9b0 20 3d 20 28 70 2d 3e 64 62 2d 3e 62 43 6f 6e 63   = (p->db->bConc
1d9c0 75 72 72 65 6e 74 20 26 26 20 21 49 53 41 55 54  urrent && !ISAUT
1d9d0 4f 56 41 43 55 55 4d 29 3b 0a 0a 20 20 73 71 6c  OVACUUM);..  sql
1d9e0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1d9f0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
1da00 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
1da10 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
1da20 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
1da30 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
1da40 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
1da50 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
1da60 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
1da70 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1da80 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
1da90 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
1daa0 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
1dab0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1dac0 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
1dad0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
1dae0 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
1daf0 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
1db00 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73  _begun;.  }.  as
1db10 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1db20 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1db30 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d  WRITE || IfNotOm
1db40 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
1db50 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20  ncate)==0 );..  
1db60 69 66 28 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67  if( (p->db->flag
1db70 73 20 26 20 53 51 4c 49 54 45 5f 52 65 73 65 74  s & SQLITE_Reset
1db80 44 61 74 61 62 61 73 65 29 20 0a 20 20 20 26 26  Database) .   &&
1db90 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
1dba0 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
1dbb0 67 65 72 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20  ger)==0 .  ){.  
1dbc0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1dbd0 26 3d 20 7e 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  &= ~BTS_READ_ONL
1dbe0 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  Y;.  }..  /* Wri
1dbf0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
1dc00 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
1dc10 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
1dc20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
1dc30 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1dc40 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1dc50 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29  )!=0 && wrflag )
1dc60 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1dc70 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
1dc80 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1dc90 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
1dca0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1dcb0 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20  D_CACHE.  {.    
1dcc0 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20  sqlite3 *pBlock 
1dcd0 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61  = 0;.    /* If a
1dce0 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
1dcf0 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
1dd00 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
1dd10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
1dd20 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68     ** on this sh
1dd30 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
1dd40 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
1dd50 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
1dd60 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  ion is.    ** re
1dd70 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
1dd80 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
1dd90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
1dda0 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rflag && pBt->in
1ddb0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1ddc0 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c  NS_WRITE).     |
1ddd0 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
1dde0 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21   & BTS_PENDING)!
1ddf0 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1de00 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
1de10 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d  riter->db;.    }
1de20 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
1de30 31 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63  1 ){.      BtLoc
1de40 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20  k *pIter;.      
1de50 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1de60 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1de70 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1de80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1de90 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
1dea0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f  {.          pBlo
1deb0 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72  ck = pIter->pBtr
1dec0 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  ee->db;.        
1ded0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1dee0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1def0 0a 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20  .    if( pBlock 
1df00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1df10 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
1df20 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29  d(p->db, pBlock)
1df30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1df40 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
1df50 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f  DCACHE;.      go
1df60 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1df70 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1df80 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d  ..  /* Any read-
1df90 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69  only or read-wri
1dfa0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1dfb0 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f  mplies a read-lo
1dfc0 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65  ck on .  ** page
1dfd0 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f   1. So if some o
1dfe0 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
1dff0 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79  e client already
1e000 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63   has a write-loc
1e010 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
1e020 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  1, the transacti
1e030 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  on cannot be ope
1e040 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71  ned. */.  rc = q
1e050 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
1e060 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
1e070 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
1e080 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  CK);.  if( SQLIT
1e090 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20  E_OK!=rc ) goto 
1e0a0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20  trans_begun;..  
1e0b0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1e0c0 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f   ~BTS_INITIALLY_
1e0d0 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74  EMPTY;.  if( pBt
1e0e0 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74  ->nPage==0 ) pBt
1e0f0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1e100 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1e110 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  Y;.  do {.    /*
1e120 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
1e130 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
1e140 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
1e150 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
1e160 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
1e170 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
1e180 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1e190 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
1e1a0 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
1e1b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
1e1c0 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
1e1d0 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
1e1e0 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
1e1f0 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
1e200 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
1e210 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
1e220 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
1e230 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
1e240 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
1e250 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
1e260 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
1e270 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
1e280 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
1e290 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1e2a0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
1e2b0 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
1e2c0 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
1e2d0 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
1e2e0 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
1e2f0 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
1e300 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1e310 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1e320 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
1e330 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1e340 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
1e350 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1e360 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
1e370 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1e380 74 20 65 78 46 6c 61 67 20 3d 20 62 43 6f 6e 63  t exFlag = bConc
1e390 75 72 72 65 6e 74 20 3f 20 2d 31 20 3a 20 28 77  urrent ? -1 : (w
1e3a0 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20  rflag>1);.      
1e3b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e3c0 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  gerBegin(pBt->pP
1e3d0 61 67 65 72 2c 20 65 78 46 6c 61 67 2c 20 73 71  ager, exFlag, sq
1e3e0 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
1e3f0 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  y(p->db));.     
1e400 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e410 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e420 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
1e430 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
1e440 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
1e450 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53  QLITE_BUSY_SNAPS
1e460 48 4f 54 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  HOT && pBt->inTr
1e470 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1e480 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _NONE ){.       
1e490 20 20 20 2f 2a 20 69 66 20 74 68 65 72 65 20 77     /* if there w
1e4a0 61 73 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f  as no transactio
1e4b0 6e 20 6f 70 65 6e 65 64 20 77 68 65 6e 20 74 68  n opened when th
1e4c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 0a  is function was.
1e4d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c            ** cal
1e4e0 6c 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 42  led and SQLITE_B
1e4f0 55 53 59 5f 53 4e 41 50 53 48 4f 54 20 69 73 20  USY_SNAPSHOT is 
1e500 72 65 74 75 72 6e 65 64 2c 20 63 68 61 6e 67 65  returned, change
1e510 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20   the error.     
1e520 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 74 6f 20       ** code to 
1e530 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 2a 2f 0a  SQLITE_BUSY. */.
1e540 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1e550 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1e560 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e570 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
1e580 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e590 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65        unlockBtre
1e5a0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1e5b0 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1e5c0 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54  (rc&0xFF)==SQLIT
1e5d0 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69  E_BUSY && pBt->i
1e5e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1e5f0 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20  ANS_NONE &&.    
1e600 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b        btreeInvok
1e610 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74  eBusyHandler(pBt
1e620 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ) );.  sqlite3Pa
1e630 67 65 72 52 65 73 65 74 4c 6f 63 6b 54 69 6d 65  gerResetLockTime
1e640 6f 75 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  out(pBt->pPager)
1e650 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
1e660 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1e670 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1e680 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
1e690 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
1e6a0 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53  ion++;.#ifndef S
1e6b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1e6c0 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66  D_CACHE.      if
1e6d0 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
1e6e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e6f0 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d   p->lock.pBtree=
1e700 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54  =p && p->lock.iT
1e710 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
1e720 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b     p->lock.eLock
1e730 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
1e740 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e        p->lock.pN
1e750 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
1e760 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70  ;.        pBt->p
1e770 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b  Lock = &p->lock;
1e780 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1e790 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
1e7a0 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
1e7b0 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
1e7c0 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
1e7d0 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
1e7e0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
1e7f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
1e800 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
1e810 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  nTrans;.    }.  
1e820 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
1e830 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1e840 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
1e850 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge1;.#ifndef SQL
1e860 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1e870 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65  CACHE.      asse
1e880 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65  rt( !pBt->pWrite
1e890 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r );.      pBt->
1e8a0 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20  pWriter = p;.   
1e8b0 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
1e8c0 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49   &= ~BTS_EXCLUSI
1e8d0 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72  VE;.      if( wr
1e8e0 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74  flag>1 ) pBt->bt
1e8f0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58  sFlags |= BTS_EX
1e900 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a  CLUSIVE;.#endif.
1e910 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1e920 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20   db-size header 
1e930 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65  field is incorre
1e940 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ct (as it may be
1e950 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20   if an old.     
1e960 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62   ** client has b
1e970 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  een writing the 
1e980 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
1e990 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44  update it now. D
1e9a0 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  oing.      ** th
1e9b0 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  is sooner rather
1e9c0 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e   than later mean
1e9d0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  s the database s
1e9e0 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a  ize can safely .
1e9f0 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64        ** re-read
1ea00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1ea10 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69  ze from page 1 i
1ea20 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72  f a savepoint or
1ea30 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
1ea40 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f     ** rollback o
1ea50 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
1ea60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
1ea70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1ea80 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74   pBt->nPage!=get
1ea90 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1eaa0 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20  Data[28]) ){.   
1eab0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1eac0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1ead0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1eae0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1eaf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1eb00 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1eb10 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1eb20 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
1eb30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1eb40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 74 72 61 6e  .    }.  }..tran
1eb50 73 5f 62 65 67 75 6e 3a 0a 23 69 66 6e 64 65 66  s_begun:.#ifndef
1eb60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e   SQLITE_OMIT_CON
1eb70 43 55 52 52 45 4e 54 0a 20 20 69 66 28 20 62 43  CURRENT.  if( bC
1eb80 6f 6e 63 75 72 72 65 6e 74 20 26 26 20 72 63 3d  oncurrent && rc=
1eb90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71  =SQLITE_OK && sq
1eba0 6c 69 74 65 33 50 61 67 65 72 49 73 57 61 6c 28  lite3PagerIsWal(
1ebb0 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
1ebc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ebd0 50 61 67 65 72 42 65 67 69 6e 43 6f 6e 63 75 72  PagerBeginConcur
1ebe0 72 65 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rent(pBt->pPager
1ebf0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1ec00 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
1ec10 61 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ag ){.      rc =
1ec20 20 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f   btreePtrmapAllo
1ec30 63 61 74 65 28 70 42 74 29 3b 0a 20 20 20 20 7d  cate(pBt);.    }
1ec40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
1ec50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ec60 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 63 68   ){.    if( pSch
1ec70 65 6d 61 56 65 72 73 69 6f 6e 20 29 7b 0a 20 20  emaVersion ){.  
1ec80 20 20 20 20 2a 70 53 63 68 65 6d 61 56 65 72 73      *pSchemaVers
1ec90 69 6f 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26  ion = get4byte(&
1eca0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1ecb0 74 61 5b 34 30 5d 29 3b 0a 20 20 20 20 7d 0a 20  ta[40]);.    }. 
1ecc0 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b     if( wrflag ){
1ecd0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
1ece0 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
1ecf0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
1ed00 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
1ed10 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 2a 2a  mber of.      **
1ed20 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
1ed30 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
1ed40 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
1ed50 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
1ed60 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62        ** the sub
1ed70 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20  -journal is not 
1ed80 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
1ed90 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70  en it will be op
1eda0 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 20  ened here..     
1edb0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53   */.      int nS
1edc0 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 64 62  avepoint = p->db
1edd0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  ->nSavepoint;.  
1ede0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1edf0 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
1ee00 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1ee10 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  nSavepoint);.   
1ee20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ee30 45 5f 4f 4b 20 26 26 20 6e 53 61 76 65 70 6f 69  E_OK && nSavepoi
1ee40 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  nt ){.        rc
1ee50 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70 42 65   = btreePtrmapBe
1ee60 67 69 6e 28 70 42 74 2c 20 6e 53 61 76 65 70 6f  gin(pBt, nSavepo
1ee70 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  int);.      }.  
1ee80 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65    }.  }..  btree
1ee90 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
1eea0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1eeb0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1eec0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1eed0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1eee0 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
1eef0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
1ef00 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
1ef10 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
1ef20 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
1ef30 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
1ef40 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
1ef50 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
1ef60 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
1ef70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
1ef80 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
1ef90 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
1efa0 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
1efb0 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
1efc0 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
1efd0 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
1efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
1f000 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
1f010 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
1f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f030 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f040 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
1f050 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
1f060 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f080 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1f090 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1f0a0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
1f0b0 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
1f0c0 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
1f0d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1f0e0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1f0f0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1f100 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  rc = pPage->isIn
1f110 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  it ? SQLITE_OK :
1f120 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
1f130 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
1f140 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1f150 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20  urn rc;.  nCell 
1f160 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1f170 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
1f180 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
1f190 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
1f1a0 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a  ell(pPage, i);..
1f1b0 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
1f1c0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
1f1d0 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66  l, &rc);..    if
1f1e0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1f1f0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
1f200 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
1f210 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  e(pCell);.      
1f220 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
1f230 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
1f240 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
1f250 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
1f260 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1f270 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
1f280 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
1f290 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1f2a0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1f2b0 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  t+8]);.    ptrma
1f2c0 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
1f2d0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
1f2e0 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
1f2f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1f300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
1f310 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20  ere on pPage is 
1f320 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
1f330 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79  e iFrom.  Modify
1f340 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f   this pointer so
1f350 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e  .** that it poin
1f360 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d  ts to iTo. Param
1f370 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72  eter eType descr
1f380 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ibes the type of
1f390 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62   pointer to.** b
1f3a0 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20  e modified, as  
1f3b0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50  follows:.**.** P
1f3c0 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20  TRMAP_BTREE:    
1f3d0 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
1f3e0 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
1f3f0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  ter points at a 
1f400 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20  child .**       
1f410 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1f420 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   of pPage..**.**
1f430 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1f440 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74  1: pPage is a bt
1f450 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
1f460 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
1f470 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20  an overflow.**  
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f490 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f   page pointed to
1f4a0 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   by one of the c
1f4b0 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a  ells on pPage..*
1f4c0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
1f4d0 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20  FLOW2: pPage is 
1f4e0 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65  an overflow-page
1f4f0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
1f500 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74  ints at the next
1f510 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1f520 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
1f530 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  age in the list.
1f540 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1f550 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
1f560 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
1f570 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e   Pgno iFrom, Pgn
1f580 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29  o iTo, u8 eType)
1f590 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
1f5a0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1f5b0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
1f5c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1f5d0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
1f5e0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
1f5f0 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
1f600 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1f610 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f  ERFLOW2 ){.    /
1f620 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73  * The pointer is
1f630 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   always the firs
1f640 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 4 bytes of the
1f650 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
1f660 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  se.  */.    if( 
1f670 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
1f680 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b  aData)!=iFrom ){
1f690 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f6a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
1f6b0 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  E(pPage);.    }.
1f6c0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
1f6d0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
1f6e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1f6f0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
1f700 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ll;.    int rc;.
1f710 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 2d  .    rc = pPage-
1f720 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45  >isInit ? SQLITE
1f730 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50  _OK : btreeInitP
1f740 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
1f750 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1f760 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  rc;.    nCell = 
1f770 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1f780 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1f790 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
1f7a0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
1f7b0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1f7c0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1f7d0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1f7e0 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
1f7f0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1f800 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
1f810 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
1f820 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
1f830 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c       if( info.nL
1f840 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f  ocal<info.nPaylo
1f850 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ad ){.          
1f860 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  if( pCell+info.n
1f870 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61 44  Size > pPage->aD
1f880 61 74 61 2b 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ata+pPage->pBt->
1f890 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
1f8a0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1f8b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1f8c0 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
1f8d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f8e0 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65     if( iFrom==ge
1f8f0 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66  t4byte(pCell+inf
1f900 6f 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a 20 20  o.nSize-4) ){.  
1f910 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1f920 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53  te(pCell+info.nS
1f930 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20  ize-4, iTo);.   
1f940 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1f950 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f960 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1f970 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  e{.        if( g
1f980 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d  et4byte(pCell)==
1f990 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
1f9a0 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
1f9b0 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  l, iTo);.       
1f9c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1f9d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f9e0 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d  }.  .    if( i==
1f9f0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
1fa00 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
1fa10 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20  _BTREE || .     
1fa20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
1fa30 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1fa40 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1fa50 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
1fa60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fa70 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
1fa80 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
1fa90 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1faa0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1fab0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
1fac0 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iTo);.    }.  }.
1fad0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fae0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
1faf0 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
1fb00 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1fb10 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
1fb20 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
1fb30 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
1fb40 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
1fb50 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
1fb60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f  ..**.** The isCo
1fb70 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61  mmit flag indica
1fb80 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  tes that there i
1fb90 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d  s no need to rem
1fba0 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68  ember that.** th
1fbb0 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
1fbc0 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
1fbd0 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70  efore database p
1fbe0 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  age pDbPage->pgn
1fbf0 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69  o .** can be wri
1fc00 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c  tten to. The cal
1fc10 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
1fc20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20  promised not to 
1fc30 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a  write to that.**
1fc40 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
1fc50 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
1fc60 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1fc70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
1fc80 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
1fc90 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
1fca0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
1fcb0 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
1fcc0 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
1fcd0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1fce0 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
1fcf0 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
1fd00 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
1fd10 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
1fd20 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
1fd30 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
1fd40 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1fd50 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20  no iFreePage,   
1fd60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
1fd70 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
1fd80 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69  DbPage to */.  i
1fd90 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1fda0 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d          /* isCom
1fdb0 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20  mit flag passed 
1fdc0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  to sqlite3PagerM
1fdd0 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ovepage */.){.  
1fde0 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
1fdf0 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
1fe00 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
1fe10 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
1fe20 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
1fe30 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
1fe40 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
1fe50 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
1fe60 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
1fe70 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
1fe80 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1fe90 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
1fea0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
1feb0 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
1fec0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
1fed0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1fee0 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TPAGE );.  asser
1fef0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1ff00 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1ff10 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1ff20 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74  DbPage->pBt==pBt
1ff30 20 29 3b 0a 20 20 69 66 28 20 69 44 62 50 61 67   );.  if( iDbPag
1ff40 65 3c 33 20 29 20 72 65 74 75 72 6e 20 53 51 4c  e<3 ) return SQL
1ff50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ff60 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
1ff70 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
1ff80 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
1ff90 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
1ffa0 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
1ffb0 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
1ffc0 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
1ffd0 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
1ffe0 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
1fff0 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
20000 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
20010 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
20020 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
20030 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
20040 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
20050 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
20060 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
20070 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
20080 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
20090 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
200a0 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
200b0 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
200c0 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
200d0 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
200e0 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
200f0 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
20100 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
20110 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
20120 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
20130 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
20140 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
20150 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
20160 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
20170 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
20180 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
20190 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
201a0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
201b0 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
201c0 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
201d0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
201e0 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
201f0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
20200 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
20210 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
20220 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
20230 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
20240 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
20250 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
20260 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
20270 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
20280 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
20290 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
202a0 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
202b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
202c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
202d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
202e0 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
202f0 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
20300 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
20310 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
20320 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
20330 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
20340 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
20350 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
20360 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
20370 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20390 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
203a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
203b0 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
203c0 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
203d0 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
203e0 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
203f0 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
20400 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
20410 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
20420 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
20430 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
20440 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
20450 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
20460 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
20470 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
20480 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
20490 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
204a0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
204b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
204c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
204d0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
204e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
204f0 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
20500 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
20510 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20520 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
20530 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
20540 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
20550 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
20560 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
20570 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
20580 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
20590 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
205a0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
205b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
205c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  OK ){.      ptrm
205d0 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
205e0 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
205f0 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  rPage, &rc);.   
20600 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
20610 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
20620 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
20630 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
20640 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
20650 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
20660 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
20670 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
20680 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
20690 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
206a0 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
206b0 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
206c0 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
206d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
206e0 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
206f0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
20700 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
20710 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f   therefore no po
20720 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69  int in .** calli
20730 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
20740 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
20750 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c  SQLITE_DONE. Or,
20760 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
20770 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
20780 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
20790 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72   code..**.** Mor
207a0 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  e specifically, 
207b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
207c0 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
207d0 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61  anize the databa
207e0 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74  se so .** that t
207f0 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
20800 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
20810 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20  ly in use is no 
20820 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
20830 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
20840 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Fin is the numbe
20850 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
20860 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f  this database wo
20870 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77  uld contain.** w
20880 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ere this functio
20890 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69  n called until i
208a0 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
208b0 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _DONE..**.** If 
208c0 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61  the bCommit para
208d0 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
208e0 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  o, this function
208f0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
20900 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c  e .** caller wil
20910 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69  l keep calling i
20920 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
20930 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
20940 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a   SQLITE_DONE .**
20950 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43   or an error. bC
20960 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20  ommit is passed 
20970 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f  true for an auto
20980 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69  -vacuum-on-commi
20990 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c  t .** operation,
209a0 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e   or false for an
209b0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
209c0 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uum..*/.static i
209d0 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
209e0 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
209f0 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
20a00 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43   iLastPg, int bC
20a10 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e  ommit){.  Pgno n
20a20 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
20a30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20a40 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
20a50 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
20a60 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
20a70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
20a80 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
20a90 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
20aa0 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
20ab0 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
20ac0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
20ad0 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
20ae0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
20af0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
20b00 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
20b10 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
20b20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
20b30 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
20b40 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
20b50 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
20b60 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
20b70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
20b80 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
20b90 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
20ba0 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
20bb0 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
20bc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20bd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
20be0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
20bf0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
20c00 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
20c10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
20c20 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
20c30 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
20c40 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
20c50 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
20c60 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
20c70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
20c80 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
20c90 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
20ca0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
20cb0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
20cc0 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d        ** if bCom
20cd0 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  mit is non-zero.
20ce0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
20cf0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
20d00 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
20d10 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
20d20 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
20d30 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
20d40 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
20d50 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
20d60 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
20d70 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
20d80 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
20d90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
20da0 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
20db0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
20dc0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
20dd0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
20de0 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
20df0 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
20e00 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45  astPg, BTALLOC_E
20e10 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69  XACT);.        i
20e20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20e30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
20e40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
20e50 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
20e60 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
20e70 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
20e80 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
20e90 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
20ea0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
20eb0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
20ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
20ed0 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
20ee0 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
20ef0 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
20f00 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20  age *pLastPg;.  
20f10 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42      u8 eMode = B
20f20 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a  TALLOC_ANY;   /*
20f30 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20   Mode parameter 
20f40 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
20f50 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20  ePage() */.     
20f60 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b   Pgno iNear = 0;
20f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65             /* ne
20f80 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66  arby parameter f
20f90 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
20fa0 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20  Page() */..     
20fb0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
20fc0 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
20fd0 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
20fe0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20ff0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21000 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
21010 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
21020 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72  f bCommit is zer
21030 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e  o, this loop run
21040 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61  s exactly once a
21050 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a  nd page pLastPg.
21060 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70        ** is swap
21070 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ped with the fir
21080 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c  st free page pul
21090 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
210a0 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a   list..      **.
210b0 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20        ** On the 
210c0 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62  other hand, if b
210d0 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65  Commit is greate
210e0 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
210f0 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
21100 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
21110 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
21120 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
21130 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
21140 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
21150 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
21160 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
21170 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
21180 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54        eMode = BT
21190 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20  ALLOC_LE;.      
211a0 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a    iNear = nFin;.
211b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f        }.      do
211c0 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
211d0 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
211e0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
211f0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
21200 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
21210 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64  ePg, iNear, eMod
21220 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
21230 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21240 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
21250 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
21260 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
21270 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
21280 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
21290 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
212a0 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d      }while( bCom
212b0 6d 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e  mit && iFreePg>n
212c0 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
212d0 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
212e0 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
212f0 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
21300 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
21310 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
21320 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62  Page, iFreePg, b
21330 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72  Commit);.      r
21340 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
21350 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
21360 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21370 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
21380 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
21390 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d  .  }..  if( bCom
213a0 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f  mit==0 ){.    do
213b0 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67   {.      iLastPg
213c0 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  --;.    }while( 
213d0 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47  iLastPg==PENDING
213e0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
213f0 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  || PTRMAP_ISPAGE
21400 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
21410 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72  ;.    pBt->bDoTr
21420 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
21430 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61  pBt->nPage = iLa
21440 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  stPg;.  }.  retu
21450 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
21460 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62  ./*.** The datab
21470 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ase opened by th
21480 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
21490 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
214a0 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e  um database.** n
214b0 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69  Orig pages in si
214c0 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46  ze containing nF
214d0 72 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20  ree free pages. 
214e0 52 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63  Return the expec
214f0 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  ted .** size of 
21500 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
21510 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  pages following 
21520 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f  an auto-vacuum o
21530 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
21540 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62  tic Pgno finalDb
21550 53 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70  Size(BtShared *p
21560 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20  Bt, Pgno nOrig, 
21570 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69  Pgno nFree){.  i
21580 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20  nt nEntry;      
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
215a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
215b0 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61  ies on one ptrma
215c0 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  p page */.  Pgno
215d0 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20   nPtrmap;       
215e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
215f0 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20  umber of PtrMap 
21600 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65  pages to be free
21610 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e  d */.  Pgno nFin
21620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21630 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
21640 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e   value */..  nEn
21650 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  try = pBt->usabl
21660 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d  eSize/5;.  nPtrm
21670 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
21680 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
21690 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74  pBt, nOrig)+nEnt
216a0 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46  ry)/nEntry;.  nF
216b0 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
216c0 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
216d0 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
216e0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
216f0 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47   && nFin<PENDING
21700 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
21710 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
21720 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d   }.  while( PTRM
21730 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
21740 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
21750 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
21760 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
21770 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  --;.  }..  retur
21780 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nFin;.}../*.**
21790 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
217a0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
217b0 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
217c0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
217d0 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
217e0 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
217f0 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
21800 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
21810 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
21820 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
21830 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
21840 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
21850 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
21860 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
21870 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
21880 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
21890 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
218a0 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  ccurred,.** SQLI
218b0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
218c0 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
218d0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
218e0 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
218f0 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
21900 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
21910 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
21920 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
21930 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
21940 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
21950 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
21960 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
21970 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
21980 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
21990 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
219a0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
219b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
219c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
219d0 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65  gno nOrig = btre
219e0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
219f0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20  .    Pgno nFree 
21a00 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
21a10 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
21a20 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  6]);.    Pgno nF
21a30 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65  in = finalDbSize
21a40 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72  (pBt, nOrig, nFr
21a50 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f  ee);..    if( nO
21a60 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20  rig<nFin ){.    
21a70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
21a80 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
21a90 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e  }else if( nFree>
21aa0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
21ab0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
21ac0 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 0, 0);.     
21ad0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21ae0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
21af0 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
21b00 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
21b10 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72         rc = incr
21b20 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
21b30 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b  nFin, nOrig, 0);
21b40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
21b50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21b60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21b70 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
21b80 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
21b90 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
21ba0 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
21bb0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
21bc0 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
21bd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
21be0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
21bf0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
21c00 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
21c10 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
21c20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21c30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
21c40 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
21c50 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
21c60 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
21c70 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
21c80 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e  committed for an
21c90 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
21ca0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
21cb0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
21cc0 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
21cd0 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
21ce0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
21cf0 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
21d00 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
21d10 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
21d20 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
21d30 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
21d40 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
21d50 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
21d60 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
21d70 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
21d80 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
21d90 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
21da0 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
21db0 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
21dc0 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
21dd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21de0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
21df0 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
21e00 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52  VVA_ONLY( int nR
21e10 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
21e20 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
21e30 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20  ); )..  assert( 
21e40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21e50 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
21e60 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ;.  invalidateAl
21e70 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
21e80 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42  Bt);.  assert(pB
21e90 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
21ea0 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72    if( !pBt->incr
21eb0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
21ec0 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
21ed0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
21ee0 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
21ef0 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d  after autovacuum
21f00 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ing */.    Pgno 
21f10 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  nFree;        /*
21f20 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
21f30 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
21f40 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20   initially */.  
21f50 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20    Pgno iFree;   
21f60 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
21f70 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65   page to be free
21f80 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  d */.    Pgno nO
21f90 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  rig;        /* D
21fa0 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66  atabase size bef
21fb0 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a  ore freeing */..
21fc0 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65      nOrig = btre
21fd0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
21fe0 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
21ff0 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
22000 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
22010 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
22020 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
22030 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
22040 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
22050 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
22060 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
22070 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
22080 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
22090 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
220a0 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
220b0 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
220c0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
220d0 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
220e0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
220f0 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
22100 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
22110 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
22120 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
22130 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
22140 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
22150 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
22160 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
22170 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20  nFree);.    if( 
22180 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74  nFin>nOrig ) ret
22190 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
221a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28  PT_BKPT;.    if(
221b0 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20   nFin<nOrig ){. 
221c0 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
221d0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
221e0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   0);.    }.    f
221f0 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
22200 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
22210 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
22220 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
22230 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
22240 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
22250 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 1);.    }.   
22260 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
22270 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
22280 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
22290 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
222a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
222b0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
222c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
222d0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
222e0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
222f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
22300 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
22310 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
22320 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
22330 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
22340 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
22350 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  .      pBt->bDoT
22360 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
22370 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
22380 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nFin;.    }.    
22390 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
223a0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
223b0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
223c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
223d0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52   }..  assert( nR
223e0 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef>=sqlite3Pager
223f0 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
22400 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
22410 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e  .}..#else /* ifn
22420 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22430 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20  AUTOVACUUM */.# 
22440 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50  define setChildP
22450 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45  trmaps(x) SQLITE
22460 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  _OK.#endif..#ifn
22470 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22480 43 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a 0a 2a 2a  CONCURRENT./*.**
22490 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
224a0 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
224b0 20 6f 66 20 6d 65 72 67 69 6e 67 20 61 6e 20 43   of merging an C
224c0 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61  ONCURRENT transa
224d0 63 74 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 74 68  ction with.** th
224e0 65 20 73 6e 61 70 73 68 6f 74 20 61 74 20 74 68  e snapshot at th
224f0 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 77 61  e head of the wa
22500 6c 20 66 69 6c 65 2e 20 49 74 20 72 65 6c 6f 63  l file. It reloc
22510 61 74 65 73 20 61 6c 6c 20 70 61 67 65 73 20 69  ates all pages i
22520 6e 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20 69  n the.** range i
22530 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e  First..iLast, in
22540 63 6c 75 73 69 76 65 2e 20 49 74 20 69 73 20 61  clusive. It is a
22550 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
22560 42 74 72 65 65 50 74 72 6d 61 70 20 0a 2a 2a 20  BtreePtrmap .** 
22570 73 74 72 75 63 74 75 72 65 20 61 74 20 42 74 53  structure at BtS
22580 68 61 72 65 64 2e 70 4d 61 70 20 63 6f 6e 74 61  hared.pMap conta
22590 69 6e 73 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ins the location
225a0 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 73   of the pointers
225b0 20 74 6f 20 65 61 63 68 0a 2a 2a 20 70 61 67 65   to each.** page
225c0 20 69 6e 20 74 68 65 20 72 61 6e 67 65 2e 0a 2a   in the range..*
225d0 2a 0a 2a 2a 20 49 66 20 70 6e 43 75 72 72 65 6e  *.** If pnCurren
225e0 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
225f0 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
22600 20 72 61 6e 67 65 20 61 72 65 20 6d 6f 76 65 64   range are moved
22610 20 74 6f 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   to currently.**
22620 20 66 72 65 65 20 6c 6f 63 61 74 69 6f 6e 73 20   free locations 
22630 28 69 2e 65 2e 20 66 72 65 65 2d 6c 69 73 74 20  (i.e. free-list 
22640 65 6e 74 72 69 65 73 29 20 77 69 74 68 69 6e 20  entries) within 
22650 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22660 65 20 62 65 66 6f 72 65 20 70 61 67 65 0a 2a 2a  e before page.**
22670 20 69 46 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 4f   iFirst..**.** O
22680 72 2c 20 69 66 20 70 6e 43 75 72 72 65 6e 74 20  r, if pnCurrent 
22690 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
226a0 6e 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  n it points to a
226b0 20 76 61 6c 75 65 20 63 6f 6e 74 61 69 6e 69 6e   value containin
226c0 67 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  g the.** current
226d0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
226e0 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
226f0 67 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ges. In this cas
22700 65 2c 20 61 6c 6c 20 70 61 67 65 73 20 61 72 65  e, all pages are
22710 0a 2a 2a 20 72 65 6c 6f 63 61 74 65 64 20 74 6f  .** relocated to
22720 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
22730 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2d 20  database file - 
22740 70 61 67 65 20 69 46 69 72 73 74 20 69 73 20 72  page iFirst is r
22750 65 6c 6f 63 61 74 65 64 20 74 6f 0a 2a 2a 20 70  elocated to.** p
22760 61 67 65 20 28 2a 70 6e 43 75 72 72 65 6e 74 2b  age (*pnCurrent+
22770 31 29 2c 20 70 61 67 65 20 69 46 69 72 73 74 2b  1), page iFirst+
22780 31 20 74 6f 20 70 61 67 65 20 28 2a 70 6e 43 75  1 to page (*pnCu
22790 72 72 65 6e 74 2b 32 29 2c 20 61 6e 64 20 73 6f  rrent+2), and so
227a0 20 6f 6e 2e 0a 2a 2a 20 56 61 6c 75 65 20 2a 70   on..** Value *p
227b0 6e 43 75 72 72 65 6e 74 20 69 73 20 73 65 74 20  nCurrent is set 
227c0 74 6f 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20  to the new size 
227d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
227e0 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  before this .** 
227f0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
22800 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72  ..**.** If no er
22810 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
22820 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
22830 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  d. Otherwise, an
22840 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
22850 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
22860 74 20 62 74 72 65 65 52 65 6c 6f 63 61 74 65 52  t btreeRelocateR
22870 61 6e 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  ange(.  BtShared
22880 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
22890 20 20 20 20 20 20 20 20 2f 2a 20 42 2d 74 72 65          /* B-tre
228a0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67  e handle */.  Pg
228b0 6e 6f 20 69 46 69 72 73 74 2c 20 20 20 20 20 20  no iFirst,      
228c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
228d0 20 46 69 72 73 74 20 70 61 67 65 20 74 6f 20 72   First page to r
228e0 65 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 50 67 6e  elocate */.  Pgn
228f0 6f 20 69 4c 61 73 74 2c 20 20 20 20 20 20 20 20  o iLast,        
22900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22910 4c 61 73 74 20 70 61 67 65 20 74 6f 20 72 65 6c  Last page to rel
22920 6f 63 61 74 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  ocate */.  Pgno 
22930 2a 70 6e 43 75 72 72 65 6e 74 20 20 20 20 20 20  *pnCurrent      
22940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
22950 20 6e 6f 74 20 4e 55 4c 4c 2c 20 49 4e 2f 4f 55   not NULL, IN/OU
22960 54 3a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  T: Database size
22970 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
22980 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
22990 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70  treePtrmap *pMap
229a0 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20   = pBt->pMap;.  
229b0 50 67 6e 6f 20 69 50 67 3b 0a 0a 20 20 66 6f 72  Pgno iPg;..  for
229c0 28 69 50 67 3d 69 46 69 72 73 74 3b 20 69 50 67  (iPg=iFirst; iPg
229d0 3c 3d 69 4c 61 73 74 20 26 26 20 72 63 3d 3d 53  <=iLast && rc==S
229e0 51 4c 49 54 45 5f 4f 4b 3b 20 69 50 67 2b 2b 29  QLITE_OK; iPg++)
229f0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
22a00 46 72 65 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Free = 0;     /*
22a10 20 50 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20   Page allocated 
22a20 66 72 6f 6d 20 66 72 65 65 2d 6c 69 73 74 20 2a  from free-list *
22a30 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
22a40 50 67 20 3d 20 30 3b 0a 20 20 20 20 50 67 6e 6f  Pg = 0;.    Pgno
22a50 20 69 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20   iNew;          
22a60 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 67 65 20      /* New page 
22a70 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 2a  number for pPg *
22a80 2f 0a 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72  /.    PtrmapEntr
22a90 79 20 2a 70 45 6e 74 72 79 3b 20 20 20 20 2f 2a  y *pEntry;    /*
22aa0 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   Pointer map ent
22ab0 72 79 20 66 6f 72 20 70 61 67 65 20 69 50 67 20  ry for page iPg 
22ac0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 69 50 67 3d  */..    if( iPg=
22ad0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
22ae0 47 45 28 70 42 74 29 20 29 20 63 6f 6e 74 69 6e  GE(pBt) ) contin
22af0 75 65 3b 0a 20 20 20 20 70 45 6e 74 72 79 20 3d  ue;.    pEntry =
22b00 20 26 70 4d 61 70 2d 3e 61 50 74 72 5b 69 50 67   &pMap->aPtr[iPg
22b10 20 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 5d   - pMap->iFirst]
22b20 3b 0a 0a 20 20 20 20 69 66 28 20 70 45 6e 74 72  ;..    if( pEntr
22b30 79 2d 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  y->eType==PTRMAP
22b40 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
22b50 20 20 20 50 67 6e 6f 20 64 75 6d 6d 79 3b 0a 20     Pgno dummy;. 
22b60 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
22b70 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
22b80 20 26 70 46 72 65 65 2c 20 26 64 75 6d 6d 79 2c   &pFree, &dummy,
22b90 20 69 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58   iPg, BTALLOC_EX
22ba0 41 43 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ACT);.      if( 
22bb0 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  pFree ){.       
22bc0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
22bd0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
22be0 74 28 70 46 72 65 65 2d 3e 70 44 62 50 61 67 65  t(pFree->pDbPage
22bf0 29 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  )==1 );.        
22c00 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
22c10 70 28 70 46 72 65 65 2d 3e 70 44 62 50 61 67 65  p(pFree->pDbPage
22c20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22c30 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
22c40 49 54 45 5f 4f 4b 20 7c 7c 20 64 75 6d 6d 79 3d  ITE_OK || dummy=
22c50 3d 69 50 67 20 29 3b 0a 20 20 20 20 7d 65 6c 73  =iPg );.    }els
22c60 65 20 69 66 28 20 70 6e 43 75 72 72 65 6e 74 20  e if( pnCurrent 
22c70 29 7b 0a 20 20 20 20 20 20 62 74 72 65 65 47 65  ){.      btreeGe
22c80 74 50 61 67 65 28 70 42 74 2c 20 69 50 67 2c 20  tPage(pBt, iPg, 
22c90 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  &pPg, 0);.      
22ca0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
22cb0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
22cc0 70 50 67 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  pPg->pDbPage) );
22cd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
22ce0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
22cf0 65 66 63 6f 75 6e 74 28 70 50 67 2d 3e 70 44 62  efcount(pPg->pDb
22d00 50 61 67 65 29 3d 3d 31 20 29 3b 0a 20 20 20 20  Page)==1 );.    
22d10 20 20 69 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43    iNew = ++(*pnC
22d20 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  urrent);.      i
22d30 66 28 20 69 4e 65 77 3d 3d 50 45 4e 44 49 4e 47  f( iNew==PENDING
22d40 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
22d50 29 20 69 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43  ) iNew = ++(*pnC
22d60 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 72  urrent);.      r
22d70 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
22d80 28 70 42 74 2c 20 70 50 67 2c 20 70 45 6e 74 72  (pBt, pPg, pEntr
22d90 79 2d 3e 65 54 79 70 65 2c 20 70 45 6e 74 72 79  y->eType, pEntry
22da0 2d 3e 70 61 72 65 6e 74 2c 20 69 4e 65 77 2c 20  ->parent, iNew, 
22db0 31 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  1);.      releas
22dc0 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 67  ePageNotNull(pPg
22dd0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
22de0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
22df0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
22e00 26 70 46 72 65 65 2c 20 26 69 4e 65 77 2c 20 69  &pFree, &iNew, i
22e10 46 69 72 73 74 2d 31 2c 20 42 54 41 4c 4c 4f 43  First-1, BTALLOC
22e20 5f 4c 45 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _LE);.      asse
22e30 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
22e40 4b 20 7c 7c 20 69 4e 65 77 3c 69 46 69 72 73 74  K || iNew<iFirst
22e50 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
22e60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22e70 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
22e80 67 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20  ge(pFree);.     
22e90 20 20 20 62 74 72 65 65 47 65 74 50 61 67 65 28     btreeGetPage(
22ea0 70 42 74 2c 20 69 50 67 2c 20 26 70 50 67 2c 20  pBt, iPg, &pPg, 
22eb0 30 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  0);.        rc =
22ec0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
22ed0 74 2c 20 70 50 67 2c 20 70 45 6e 74 72 79 2d 3e  t, pPg, pEntry->
22ee0 65 54 79 70 65 2c 20 70 45 6e 74 72 79 2d 3e 70  eType, pEntry->p
22ef0 61 72 65 6e 74 2c 69 4e 65 77 2c 31 29 3b 0a 20  arent,iNew,1);. 
22f00 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
22f10 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  ge(pPg);.      }
22f20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22f30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64  urn rc;.}../* !d
22f40 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
22f50 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a  IT_CONCURRENT).*
22f60 2a 0a 2a 2a 20 54 68 65 20 62 2d 74 72 65 65 20  *.** The b-tree 
22f70 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
22f80 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
22f90 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 63  nt is about to c
22fa0 6f 6d 6d 69 74 20 61 6e 0a 2a 2a 20 43 4f 4e 43  ommit an.** CONC
22fb0 55 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69  URRENT transacti
22fc0 6f 6e 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  on. At this poin
22fd0 74 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  t it is guarante
22fe0 65 64 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ed that this is 
22ff0 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 2d 20 74  .** possible - t
23000 68 65 20 77 61 6c 20 57 52 49 54 45 52 20 6c 6f  he wal WRITER lo
23010 63 6b 20 69 73 20 68 65 6c 64 20 61 6e 64 20 69  ck is held and i
23020 74 20 69 73 20 6b 6e 6f 77 6e 20 74 68 61 74 20  t is known that 
23030 74 68 65 72 65 20 61 72 65 20 0a 2a 2a 20 6e 6f  there are .** no
23040 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
23050 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
23060 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  ctions..*/.stati
23070 63 20 69 6e 74 20 62 74 72 65 65 46 69 78 55 6e  c int btreeFixUn
23080 6c 6f 63 6b 65 64 28 42 74 72 65 65 20 2a 70 29  locked(Btree *p)
23090 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
230a0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65  t = p->pBt;.  Me
230b0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
230c0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 75  pBt->pPage1;.  u
230d0 38 20 2a 70 31 20 3d 20 70 50 61 67 65 31 2d 3e  8 *p1 = pPage1->
230e0 61 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a  aData;.  Pager *
230f0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
23100 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
23110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
23120 2a 20 49 66 20 70 61 67 65 20 31 20 6f 66 20 74  * If page 1 of t
23130 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
23140 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 65  ot writable, the
23150 6e 20 6e 6f 20 70 61 67 65 73 20 77 65 72 65 20  n no pages were 
23160 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6f  allocated.  ** o
23170 72 20 66 72 65 65 64 20 62 79 20 74 68 69 73 20  r freed by this 
23180 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
23190 74 68 69 73 20 63 61 73 65 20 6e 6f 20 73 70 65  this case no spe
231a0 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 69 73  cial handling is
231b0 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2e   .  ** required.
231c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
231d0 61 67 65 20 31 20 69 73 20 64 69 72 74 79 2c 20  age 1 is dirty, 
231e0 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 42  proceed.  */.  B
231f0 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70  treePtrmap *pMap
23200 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20   = pBt->pMap;.  
23210 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 67 65  Pgno iTrunk = ge
23220 74 34 62 79 74 65 28 26 70 31 5b 33 32 5d 29 3b  t4byte(&p1[32]);
23230 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20  .  Pgno nPage = 
23240 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
23250 42 74 29 3b 0a 20 20 75 33 32 20 6e 46 72 65 65  Bt);.  u32 nFree
23260 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 31 5b   = get4byte(&p1[
23270 33 36 5d 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  36]);..  assert(
23280 20 70 42 74 2d 3e 70 4d 61 70 20 29 3b 0a 20 20   pBt->pMap );.  
23290 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
232a0 72 55 70 67 72 61 64 65 53 6e 61 70 73 68 6f 74  rUpgradeSnapshot
232b0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 31 2d  (pPager, pPage1-
232c0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 61 73 73  >pDbPage);.  ass
232d0 65 72 74 28 20 70 31 3d 3d 70 50 61 67 65 31 2d  ert( p1==pPage1-
232e0 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28  >aData );..  if(
232f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23300 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 48 50 61 67  {.    Pgno nHPag
23310 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 31  e = get4byte(&p1
23320 5b 32 38 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20  [28]);.    Pgno 
23330 6e 46 69 6e 20 3d 20 6e 48 50 61 67 65 3b 20 20  nFin = nHPage;  
23340 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
23350 66 20 64 62 20 61 66 74 65 72 20 74 72 61 6e 73  f db after trans
23360 61 63 74 69 6f 6e 20 6d 65 72 67 65 20 2a 2f 0a  action merge */.
23370 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
23380 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
23390 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
233a0 29 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ) ){.      Pgno 
233b0 69 48 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79  iHTrunk = get4by
233c0 74 65 28 26 70 31 5b 33 32 5d 29 3b 0a 20 20 20  te(&p1[32]);.   
233d0 20 20 20 75 33 32 20 6e 48 46 72 65 65 20 3d 20     u32 nHFree = 
233e0 67 65 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d  get4byte(&p1[36]
233f0 29 3b 0a 0a 20 20 20 20 20 20 62 74 72 65 65 50  );..      btreeP
23400 74 72 6d 61 70 43 68 65 63 6b 28 70 42 74 2c 20  trmapCheck(pBt, 
23410 6e 50 61 67 65 29 3b 0a 0a 20 20 20 20 20 20 2f  nPage);..      /
23420 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 65 61  * Attach the hea
23430 64 20 64 61 74 61 62 61 73 65 20 66 72 65 65 20  d database free 
23440 6c 69 73 74 20 74 6f 20 74 68 65 20 65 6e 64 20  list to the end 
23450 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  of the current. 
23460 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
23470 69 6f 6e 73 20 66 72 65 65 2d 6c 69 73 74 20 28  ions free-list (
23480 69 66 20 61 6e 79 29 2e 20 20 2a 2f 0a 20 20 20  if any).  */.   
23490 20 20 20 69 66 28 20 69 54 72 75 6e 6b 21 3d 30     if( iTrunk!=0
234a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
234b0 62 79 74 65 28 26 70 31 5b 33 36 5d 2c 20 6e 48  byte(&p1[36], nH
234c0 46 72 65 65 20 2b 20 6e 46 72 65 65 29 3b 0a 20  Free + nFree);. 
234d0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
234e0 26 70 31 5b 33 32 5d 2c 20 69 54 72 75 6e 6b 29  &p1[32], iTrunk)
234f0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
23500 20 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20   iTrunk ){.     
23510 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 54 72       DbPage *pTr
23520 75 6e 6b 20 3d 20 73 71 6c 69 74 65 33 50 61 67  unk = sqlite3Pag
23530 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
23540 20 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20   iTrunk);.      
23550 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
23560 34 62 79 74 65 28 28 75 38 2a 29 70 54 72 75 6e  4byte((u8*)pTrun
23570 6b 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  k->pData);.     
23580 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3d       if( iTrunk=
23590 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
235a0 20 20 70 75 74 34 62 79 74 65 28 28 75 38 2a 29    put4byte((u8*)
235b0 70 54 72 75 6e 6b 2d 3e 70 44 61 74 61 2c 20 69  pTrunk->pData, i
235c0 48 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  HTrunk);.       
235d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
235e0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
235f0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  (pTrunk);.      
23600 20 20 7d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20    };.      }..  
23610 20 20 20 20 69 66 28 20 6e 48 50 61 67 65 3c 28      if( nHPage<(
23620 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31 29 20  pMap->iFirst-1) 
23630 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
23640 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 73 69  e database consi
23650 73 74 65 64 20 6f 66 20 28 70 4d 61 70 2d 3e 69  sted of (pMap->i
23660 46 69 72 73 74 2d 31 29 20 70 61 67 65 73 20 77  First-1) pages w
23670 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
23680 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63 75          ** concu
23690 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
236a0 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 41 6e  n was opened. An
236b0 64 20 61 6e 20 63 6f 6e 63 75 72 72 65 6e 74 20  d an concurrent 
236c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 0a  transaction may.
236d0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62          ** not b
236e0 65 20 65 78 65 63 75 74 65 64 20 6f 6e 20 61 6e  e executed on an
236f0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
23700 61 62 61 73 65 20 2d 20 73 6f 20 74 68 65 20 64  abase - so the d
23710 62 20 73 68 6f 75 6c 64 20 0a 20 20 20 20 20 20  b should .      
23720 20 20 2a 2a 20 6e 6f 74 20 68 61 76 65 20 73 68    ** not have sh
23730 72 75 6e 6b 20 73 69 6e 63 65 20 74 68 65 20 74  runk since the t
23740 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f  ransaction was o
23750 70 65 6e 65 64 2e 20 54 68 65 72 65 66 6f 72 65  pened. Therefore
23760 20 6e 48 50 61 67 65 0a 20 20 20 20 20 20 20 20   nHPage.        
23770 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74  ** should be set
23780 20 74 6f 20 28 70 4d 61 70 2d 3e 69 46 69 72 73   to (pMap->iFirs
23790 74 2d 31 29 20 6f 72 20 67 72 65 61 74 65 72 2e  t-1) or greater.
237a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
237b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
237c0 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BKPT;.      }els
237d0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
237e0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
237f0 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 64 20  ction allocated 
23800 70 61 67 65 73 20 70 4d 61 70 2d 3e 69 46 69 72  pages pMap->iFir
23810 73 74 20 74 68 72 6f 75 67 68 0a 20 20 20 20 20  st through.     
23820 20 20 20 2a 2a 20 6e 50 61 67 65 20 28 69 6e 63     ** nPage (inc
23830 6c 75 73 69 76 65 29 20 61 74 20 74 68 65 20 65  lusive) at the e
23840 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
23850 73 65 20 66 69 6c 65 2e 20 4d 65 61 6e 77 68 69  se file. Meanwhi
23860 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  le,.        ** o
23870 74 68 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  ther transaction
23880 73 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64  s have allocated
23890 20 28 69 46 69 72 73 74 2e 2e 6e 48 50 61 67 65   (iFirst..nHPage
238a0 29 2e 20 53 6f 20 6d 6f 76 65 0a 20 20 20 20 20  ). So move.     
238b0 20 20 20 2a 2a 20 70 61 67 65 73 20 28 69 46 69     ** pages (iFi
238c0 72 73 74 2e 2e 4d 49 4e 28 6e 50 61 67 65 2c 6e  rst..MIN(nPage,n
238d0 48 50 61 67 65 29 29 20 74 6f 20 28 4d 41 58 28  HPage)) to (MAX(
238e0 6e 50 61 67 65 2c 6e 48 50 61 67 65 29 2b 31 29  nPage,nHPage)+1)
238f0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e  . */.        Pgn
23900 6f 20 69 4c 61 73 74 20 3d 20 4d 49 4e 28 6e 50  o iLast = MIN(nP
23910 61 67 65 2c 20 6e 48 50 61 67 65 29 3b 20 20 20  age, nHPage);   
23920 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 74 6f   /* Last page to
23930 20 6d 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 20   move */.       
23940 20 50 67 6e 6f 20 6e 43 75 72 72 65 6e 74 3b 20   Pgno nCurrent; 
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
23970 73 69 7a 65 20 6f 66 20 64 62 20 2a 2f 0a 0a 20  size of db */.. 
23980 20 20 20 20 20 20 20 6e 43 75 72 72 65 6e 74 20         nCurrent 
23990 3d 20 4d 41 58 28 6e 50 61 67 65 2c 20 6e 48 50  = MAX(nPage, nHP
239a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 42  age);.        pB
239b0 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 43 75 72 72  t->nPage = nCurr
239c0 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ent;.        rc 
239d0 3d 20 62 74 72 65 65 52 65 6c 6f 63 61 74 65 52  = btreeRelocateR
239e0 61 6e 67 65 28 70 42 74 2c 20 70 4d 61 70 2d 3e  ange(pBt, pMap->
239f0 69 46 69 72 73 74 2c 20 69 4c 61 73 74 2c 20 26  iFirst, iLast, &
23a00 6e 43 75 72 72 65 6e 74 29 3b 0a 0a 20 20 20 20  nCurrent);..    
23a10 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
23a20 20 6e 6f 77 20 6e 6f 20 63 6f 6c 6c 69 73 69 6f   now no collisio
23a30 6e 73 20 77 69 74 68 20 74 68 65 20 73 6e 61 70  ns with the snap
23a40 73 68 6f 74 20 61 74 20 74 68 65 20 68 65 61 64  shot at the head
23a50 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
23a60 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
23a70 2e 20 53 6f 20 61 74 20 74 68 69 73 20 70 6f 69  . So at this poi
23a80 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65 20 70  nt it would be p
23a90 6f 73 73 69 62 6c 65 20 74 6f 20 77 72 69 74 65  ossible to write
23aa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
23ab0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 75 74 20  transaction out 
23ac0 74 6f 20 64 69 73 6b 2e 20 42 65 66 6f 72 65 20  to disk. Before 
23ad0 64 6f 69 6e 67 20 73 6f 20 74 68 6f 75 67 68 2c  doing so though,
23ae0 20 61 74 74 65 6d 70 74 20 74 6f 0a 20 20 20 20   attempt to.    
23af0 20 20 20 20 2a 2a 20 72 65 6c 6f 63 61 74 65 20      ** relocate 
23b00 73 6f 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20  some of the new 
23b10 70 61 67 65 73 20 74 6f 20 66 72 65 65 20 6c 6f  pages to free lo
23b20 63 61 74 69 6f 6e 73 20 77 69 74 68 69 6e 20 74  cations within t
23b30 68 65 20 62 6f 64 79 0a 20 20 20 20 20 20 20 20  he body.        
23b40 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
23b50 73 65 20 66 69 6c 65 20 28 69 2e 65 2e 20 66 72  se file (i.e. fr
23b60 65 65 2d 6c 69 73 74 20 65 6e 74 72 69 65 73 29  ee-list entries)
23b70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
23b80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23b90 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
23ba0 72 74 28 20 6e 43 75 72 72 65 6e 74 21 3d 50 45  rt( nCurrent!=PE
23bb0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
23bc0 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  pBt) );.        
23bd0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
23be0 74 44 62 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  tDbsize(pBt->pPa
23bf0 67 65 72 2c 20 6e 43 75 72 72 65 6e 74 29 3b 0a  ger, nCurrent);.
23c00 20 20 20 20 20 20 20 20 20 20 6e 46 72 65 65 20            nFree 
23c10 3d 20 67 65 74 34 62 79 74 65 28 26 70 31 5b 33  = get4byte(&p1[3
23c20 36 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  6]);.          n
23c30 46 69 6e 20 3d 20 6e 43 75 72 72 65 6e 74 2d 6e  Fin = nCurrent-n
23c40 46 72 65 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Free;.          
23c50 69 66 28 20 6e 43 75 72 72 65 6e 74 3e 50 45 4e  if( nCurrent>PEN
23c60 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
23c70 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e  Bt) && nFin<=PEN
23c80 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
23c90 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Bt) ){.         
23ca0 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20     nFin--;.     
23cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23cc0 20 6e 46 69 6e 20 3d 20 4d 41 58 28 6e 46 69 6e   nFin = MAX(nFin
23cd0 2c 20 6e 48 50 61 67 65 29 3b 0a 20 20 20 20 20  , nHPage);.     
23ce0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 52       rc = btreeR
23cf0 65 6c 6f 63 61 74 65 52 61 6e 67 65 28 70 42 74  elocateRange(pBt
23d00 2c 20 6e 46 69 6e 2b 31 2c 20 6e 43 75 72 72 65  , nFin+1, nCurre
23d10 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nt, 0);.        
23d20 7d 0a 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  }..        put4b
23d30 79 74 65 28 26 70 31 5b 32 38 5d 2c 20 6e 46 69  yte(&p1[28], nFi
23d40 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
23d50 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
23d60 65 72 53 65 74 44 62 73 69 7a 65 28 70 50 61 67  erSetDbsize(pPag
23d70 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20 7d 0a 0a  er, nFin);.  }..
23d80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
23d90 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 62 74  else.# define bt
23da0 72 65 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28 58  reeFixUnlocked(X
23db0 29 20 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  )  SQLITE_OK.#en
23dc0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
23dd0 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 20 2a 2f  IT_CONCURRENT */
23de0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
23df0 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
23e00 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74  rst phase of a t
23e10 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e  wo-phase commit.
23e20 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
23e30 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62  * causes a rollb
23e40 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  ack journal to b
23e50 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74  e created (if it
23e60 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
23e70 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20  y exist).** and 
23e80 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65  populated with e
23e90 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f  nough informatio
23ea0 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70  n so that if a p
23eb0 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73  ower loss occurs
23ec0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
23ed0 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
23ee0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
23ef0 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e   state by playin
23f00 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f  g back.** the jo
23f10 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65  urnal.  Then the
23f20 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
23f30 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75   journal are flu
23f40 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74  shed out to.** t
23f50 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20  he disk.  After 
23f60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
23f70 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20  afely on oxide, 
23f80 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
23f90 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61  he.** database a
23fa0 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
23fb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23fc0 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f  e and flushed to
23fd0 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68   oxide..** At th
23fe0 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61  e end of this ca
23ff0 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ll, the rollback
24000 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65   journal still e
24010 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  xists on the.** 
24020 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20  disk and we are 
24030 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c  still holding al
24040 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20  l locks, so the 
24050 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
24060 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  not.** committed
24070 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74  .  See sqlite3Bt
24080 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
24090 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f  o() for the seco
240a0 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a  nd phase of the.
240b0 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  ** commit proces
240c0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  s..**.** This ca
240d0 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ll is a no-op if
240e0 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
240f0 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  ction is current
24100 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74  ly active on pBt
24110 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
24120 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  e, sync the data
24130 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
24140 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61  e btree pBt. zMa
24150 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  ster points to.*
24160 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
24170 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
24180 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
24190 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
241a0 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
241b0 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  l journal file, 
241c0 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69  or is NULL, indi
241d0 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72  cating no master
241e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
241f0 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61  * (single databa
24200 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
24210 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
24220 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
24230 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73  master journal s
24240 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61  hould already ha
24250 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74  ve been.** creat
24260 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ed, populated wi
24270 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  th this journal 
24280 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63  pointer and sync
24290 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
242a0 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72  * Once this is r
242b0 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72  outine has retur
242c0 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68  ned, the only th
242d0 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20  ing required to 
242e0 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72  commit.** the wr
242f0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
24300 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
24310 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c  e file is to del
24320 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
24330 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
24340 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
24350 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e  ne(Btree *p, con
24360 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
24370 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
24380 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
24390 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
243a0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
243b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
243c0 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
243d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
243e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
243f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
24400 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
24410 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
24420 20 61 73 73 65 72 74 28 20 49 53 43 4f 4e 43 55   assert( ISCONCU
24430 52 52 45 4e 54 3d 3d 30 20 29 3b 0a 20 20 20 20  RRENT==0 );.    
24440 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
24450 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
24460 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
24470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
24480 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
24490 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
244a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
244b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
244c0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
244d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
244e0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
244f0 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
24500 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
24510 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
24520 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24530 20 26 26 20 49 53 43 4f 4e 43 55 52 52 45 4e 54   && ISCONCURRENT
24540 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
24550 74 72 65 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28  treeFixUnlocked(
24560 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
24570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24580 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
24590 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
245a0 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
245b0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
245c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
245d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
245e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
245f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
24600 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
24610 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42  lled from both B
24620 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
24630 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f  wo() and BtreeRo
24640 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74  llback().** at t
24650 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
24660 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
24670 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
24680 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
24690 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  on(Btree *p){.  
246a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
246b0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
246c0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
246d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
246e0 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
246f0 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  p) );..#ifndef S
24700 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
24710 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f  ACUUM.  pBt->bDo
24720 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65  Truncate = 0;.#e
24730 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e  ndif.  if( p->in
24740 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
24750 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61   && db->nVdbeRea
24760 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  d>1 ){.    /* If
24770 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
24780 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
24790 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ts that belong t
247a0 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a  o this database.
247b0 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64      ** handle, d
247c0 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65  owngrade to a re
247d0 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
247e0 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73  ion. The other s
247f0 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a  tatements.    **
24800 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
24810 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64  ading from the d
24820 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20  atabase.  */.   
24830 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
24840 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
24850 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  ks(p);.    p->in
24860 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45  Trans = TRANS_RE
24870 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
24880 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
24890 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f  e had any kind o
248a0 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
248b0 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
248c0 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  e .    ** transa
248d0 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74  ction count of t
248e0 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e  he shared btree.
248f0 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
24900 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a  ion count .    *
24910 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74  * reaches 0, set
24920 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
24930 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
24940 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
24950 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a  IfUnused().    *
24960 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c  * call below wil
24970 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  l unlock the pag
24980 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  er.  */.    if( 
24990 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
249a0 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
249b0 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
249c0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
249d0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  ;.      pBt->nTr
249e0 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
249f0 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e     if( 0==pBt->n
24a00 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
24a10 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72         pBt->inTr
24a20 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
24a30 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  S_NONE;.      }.
24a40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
24a50 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  t the current tr
24a60 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20  ansaction state 
24a70 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e  to TRANS_NONE an
24a80 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20  d unlock the .  
24a90 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68    ** pager if th
24aa0 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74  is call closed t
24ab0 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20  he only read or 
24ac0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
24ad0 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e  n.  */.    p->in
24ae0 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
24af0 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74  NE;.    unlockBt
24b00 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
24b10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
24b20 68 69 73 20 77 61 73 20 61 6e 20 43 4f 4e 43 55  his was an CONCU
24b30 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f  RRENT transactio
24b40 6e 2c 20 64 65 6c 65 74 65 20 74 68 65 20 70 42  n, delete the pB
24b50 74 2d 3e 70 4d 61 70 20 6f 62 6a 65 63 74 2e 0a  t->pMap object..
24b60 20 20 2a 2a 20 41 6c 73 6f 20 63 61 6c 6c 20 50    ** Also call P
24b70 61 67 65 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e  agerEndConcurren
24b80 74 28 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68  t() to ensure th
24b90 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
24ba0 20 64 69 73 63 61 72 64 65 64 0a 20 20 2a 2a 20   discarded.  ** 
24bb0 74 68 65 20 72 65 63 6f 72 64 20 6f 66 20 61 6c  the record of al
24bc0 6c 20 70 61 67 65 73 20 72 65 61 64 20 77 69 74  l pages read wit
24bd0 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hin the transact
24be0 69 6f 6e 2e 20 20 2a 2f 0a 20 20 62 74 72 65 65  ion.  */.  btree
24bf0 50 74 72 6d 61 70 44 65 6c 65 74 65 28 70 42 74  PtrmapDelete(pBt
24c00 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
24c10 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28 70  rEndConcurrent(p
24c20 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 62  Bt->pPager);.  b
24c30 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
24c40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
24c50 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
24c60 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
24c70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
24c80 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
24c90 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
24ca0 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
24cb0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
24cc0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
24cd0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
24ce0 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
24cf0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
24d00 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
24d10 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
24d20 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
24d30 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
24d40 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
24d50 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
24d60 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
24d70 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
24d80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
24d90 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
24da0 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
24db0 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
24dc0 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
24dd0 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
24de0 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
24df0 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
24e00 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
24e10 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
24e20 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
24e30 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
24e40 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
24e50 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
24e60 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
24e70 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
24e80 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   locks..**.** No
24e90 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  rmally, if an er
24ea0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
24eb0 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
24ec0 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74   is attempting t
24ed0 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74  o .** finalize t
24ee0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f  he underlying jo
24ef0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73  urnal file, this
24f00 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
24f10 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a  s an error and.*
24f20 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  * the upper laye
24f30 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61  r will attempt a
24f40 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76   rollback. Howev
24f50 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  er, if the secon
24f60 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
24f70 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74   non-zero then t
24f80 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73  his b-tree trans
24f90 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  action is part o
24fa0 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a  f a multi-file .
24fb0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
24fc0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
24fd0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
24fe0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
24ff0 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79  ommitted .** (by
25000 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74   deleting a mast
25010 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  er journal file)
25020 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20   and the caller 
25030 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73  will ignore this
25040 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72   .** functions r
25050 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20  eturn code. So, 
25060 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  even if an error
25070 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70   occurs in the p
25080 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72  ager layer,.** r
25090 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20  eset the b-tree 
250a0 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c  objects internal
250b0 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61   state to indica
250c0 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74  te that the writ
250d0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
250e0 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64   has been closed
250f0 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20  . This is quite 
25100 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67  safe, as the pag
25110 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20  er will have.** 
25120 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20  transitioned to 
25130 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
25140 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
25150 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
25160 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
25170 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
25180 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
25190 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
251a0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
251b0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
251c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
251d0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
251e0 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  Two(Btree *p, in
251f0 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20  t bCleanup){..  
25200 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
25210 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74  TRANS_NONE ) ret
25220 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
25230 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
25240 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
25250 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
25260 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
25270 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  has a write-tran
25280 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f  saction open, co
25290 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d  mmit the shared-
252a0 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61  btrees .  ** tra
252b0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74  nsaction and set
252c0 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
252d0 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e  e to TRANS_READ.
252e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
252f0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
25300 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
25310 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  c;.    BtShared 
25320 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
25330 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
25340 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
25350 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
25360 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
25370 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
25380 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25390 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
253a0 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
253b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
253c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65  QLITE_OK && bCle
253d0 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  anup==0 ){.     
253e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
253f0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
25400 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
25410 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f    p->iDataVersio
25420 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73  n--;  /* Compens
25430 61 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e  ate for pPager->
25440 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20  iDataVersion++; 
25450 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  */.    pBt->inTr
25460 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
25470 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
25480 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
25490 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
254a0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
254b0 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
254c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
254d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
254e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
254f0 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
25500 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
25510 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
25520 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
25530 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
25540 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
25550 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
25560 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
25570 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
25580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25590 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
255a0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
255b0 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  o(p, 0);.  }.  s
255c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
255d0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
255e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
255f0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
25600 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
25610 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
25620 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
25630 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
25640 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20  y cursor on any 
25650 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
25660 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
25670 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77  es.  Or if the w
25680 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73  riteOnly flag is
25690 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20   set to 1, then 
256a0 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69  only.** trip wri
256b0 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c  te cursors and l
256c0 65 61 76 65 20 72 65 61 64 20 63 75 72 73 6f 72  eave read cursor
256d0 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  s unchanged..**.
256e0 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20  ** Every cursor 
256f0 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  is a candidate t
25700 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e  o be tripped, in
25710 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a  cluding cursors.
25720 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ** that belong t
25730 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  o other database
25740 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
25750 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a  t happen to be.*
25760 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20 63 61  * sharing the ca
25770 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e  che with pBtree.
25780 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
25790 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
257a0 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20  when a rollback 
257b0 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65 20 77  occurs. If the w
257c0 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67  riteOnly.** flag
257d0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f   is true, then o
257e0 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72  nly write-cursor
257f0 73 20 6e 65 65 64 20 62 65 20 74 72 69 70 70 65  s need be trippe
25800 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a  d - read-only.**
25810 20 63 75 72 73 6f 72 73 20 73 61 76 65 20 74 68   cursors save th
25820 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69  eir current posi
25830 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68  tions so that th
25840 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20  ey may continue 
25850 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
25860 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20  e rollback. Or, 
25870 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  if writeOnly is 
25880 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f  false, all curso
25890 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70  rs are .** tripp
258a0 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20  ed. In general, 
258b0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
258c0 73 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  se if the transa
258d0 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72  ction being.** r
258e0 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66  olled back modif
258f0 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ied the database
25900 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73   schema. In this
25910 20 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f   case b-tree roo
25920 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62  t.** pages may b
25930 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74  e moved or delet
25940 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
25950 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c  base altogether,
25960 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e   making.** it un
25970 73 61 66 65 20 66 6f 72 20 72 65 61 64 20 63 75  safe for read cu
25980 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75  rsors to continu
25990 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
259a0 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69  writeOnly flag i
259b0 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72  s true and an er
259c0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
259d0 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76  ed while .** sav
259e0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
259f0 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65  position of a re
25a00 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20  ad-only cursor, 
25a10 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a  all cursors, .**
25a20 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72   including all r
25a30 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20  ead-cursors are 
25a40 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  tripped..**.** S
25a50 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
25a60 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66  rned if successf
25a70 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  ul, or if an err
25a80 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a  or occurs while.
25a90 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72 73  ** saving a curs
25aa0 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20  or position, an 
25ab0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
25ac0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
25ad0 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
25ae0 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
25af0 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c  ee, int errCode,
25b00 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b   int writeOnly){
25b10 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
25b20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
25b30 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
25b40 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c   (writeOnly==0 |
25b50 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20  | writeOnly==1) 
25b60 26 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61  && BTCF_WriteFla
25b70 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42  g==1 );.  if( pB
25b80 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tree ){.    sqli
25b90 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
25ba0 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70  tree);.    for(p
25bb0 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
25bc0 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
25bd0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
25be0 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70   writeOnly && (p
25bf0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
25c00 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20  F_WriteFlag)==0 
25c10 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
25c20 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
25c30 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74  _VALID || p->eSt
25c40 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
25c50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  NEXT ){.        
25c60 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
25c70 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20  rPosition(p);.  
25c80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
25c90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25ca0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73           (void)s
25cb0 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
25cc0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65 65  llCursors(pBtree
25cd0 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20  , rc, 0);.      
25ce0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25cf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25d00 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
25d10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
25d20 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
25d30 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  p);.        p->e
25d40 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46  State = CURSOR_F
25d50 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d  AULT;.        p-
25d60 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43  >skipNext = errC
25d70 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
25d80 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
25d90 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 29  llCursorPages(p)
25da0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
25db0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
25dc0 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
25dd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25de0 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
25df0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
25e00 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gress..**.** If 
25e10 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20  tripCode is not 
25e20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63  SQLITE_OK then c
25e30 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
25e40 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69 70  nvalidated (trip
25e50 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72  ped)..** Only wr
25e60 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
25e70 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
25e80 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75 74  Only is true but
25e90 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
25ea0 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20 77  .** tripped if w
25eb0 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
25ec0 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  e.  Any attempt 
25ed0 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70  to use.** a trip
25ee0 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ped cursor will 
25ef0 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
25f00 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
25f10 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
25f20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
25f30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
25f40 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
25f50 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
25f60 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
25f70 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
25f80 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
25f90 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
25fa0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74  (Btree *p, int t
25fb0 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  ripCode, int wri
25fc0 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  teOnly){.  int r
25fd0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
25fe0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
25ff0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
26000 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65  .  assert( write
26010 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65  Only==1 || write
26020 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Only==0 );.  ass
26030 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53  ert( tripCode==S
26040 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
26050 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65  BACK || tripCode
26060 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
26070 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
26080 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69  er(p);.  if( tri
26090 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
260a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69   ){.    rc = tri
260b0 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43  pCode = saveAllC
260c0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
260d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
260e0 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20  writeOnly = 0;. 
260f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
26100 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
26110 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29    if( tripCode )
26120 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20  {.    int rc2 = 
26130 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
26140 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72  AllCursors(p, tr
26150 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c  ipCode, writeOnl
26160 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
26170 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
26180 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26   (writeOnly==0 &
26190 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  & rc2==SQLITE_OK
261a0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  ) );.    if( rc2
261b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  !=SQLITE_OK ) rc
261c0 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74   = rc2;.  }.  bt
261d0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
261e0 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
261f0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
26200 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
26210 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
26220 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
26230 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
26240 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
26250 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
26260 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
26270 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
26280 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
26290 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
262a0 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
262b0 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
262c0 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
262d0 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
262e0 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74  o.    ** call bt
262f0 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
26300 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
26310 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
26320 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
26330 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
26340 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65   */.    if( btre
26350 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
26360 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
26370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26380 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74   int nPage = get
26390 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
263a0 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
263b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50      testcase( nP
263c0 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  age==0 );.      
263d0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73  if( nPage==0 ) s
263e0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
263f0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
26400 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
26410 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e   testcase( pBt->
26420 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a  nPage!=nPage );.
26430 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
26440 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
26450 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70  releasePageOne(p
26460 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
26470 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
26480 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
26490 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42   1)==0 );.    pB
264a0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
264b0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
264c0 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73     btreeClearHas
264d0 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
264e0 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
264f0 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
26500 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
26510 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
26520 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
26530 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
26540 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
26550 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
26560 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a  can be rolled.**
26570 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
26580 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
26590 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75  transaction. You
265a0 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
265b0 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65  ansaction .** be
265c0 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
265d0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
265e0 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
265f0 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f  on is ended auto
26600 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66  matically .** if
26610 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
26620 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72  ction commits or
26630 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
26640 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
26650 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
26660 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
26670 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
26680 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
26690 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
266a0 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
266b0 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
266c0 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
266d0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
266e0 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
266f0 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
26700 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
26710 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
26720 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
26730 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
26740 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
26750 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
26760 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73  ** A statement s
26770 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ub-transaction i
26780 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
26790 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61   an anonymous sa
267a0 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20  vepoint. The.** 
267b0 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
267c0 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
267d0 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61  eter is the tota
267e0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  l number of save
267f0 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75  points,.** inclu
26800 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f  ding the new ano
26810 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
26820 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d  , open on the B-
26830 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68  Tree. i.e. if th
26840 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
26850 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
26860 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61  and no other sta
26870 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
26880 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74  ons open,.** iSt
26890 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68  atement is 1. Th
268a0 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  is anonymous sav
268b0 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65  epoint can be re
268c0 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64  leased or rolled
268d0 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74   back.** using t
268e0 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
268f0 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74  avepoint() funct
26900 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
26910 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
26920 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
26930 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69  iStatement){.  i
26940 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
26950 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
26960 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
26970 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
26980 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
26990 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
269a0 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74  assert( (pBt->bt
269b0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
269c0 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20  D_ONLY)==0 );.  
269d0 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
269e0 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
269f0 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e  ( iStatement>p->
26a00 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  db->nSavepoint )
26a10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
26a20 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
26a30 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
26a40 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
26a50 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
26a60 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
26a70 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
26a80 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ith.  ** an inde
26a90 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  x greater than a
26aa0 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72  ll savepoints cr
26ab0 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79  eated explicitly
26ac0 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20   using.  ** SQL 
26ad0 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
26ae0 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65  s illegal to ope
26af0 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
26b00 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20  llback any.  ** 
26b10 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20  such savepoints 
26b20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d  while the statem
26b30 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
26b40 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
26b50 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ive..  */.  rc =
26b60 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
26b70 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
26b80 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
26b90 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  nt);.  if( rc==S
26ba0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26bb0 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70  rc = btreePtrmap
26bc0 42 65 67 69 6e 28 70 42 74 2c 20 69 53 74 61 74  Begin(pBt, iStat
26bd0 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71  ement);.  }.  sq
26be0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
26bf0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
26c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
26c10 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
26c20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
26c30 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41  op, is always SA
26c40 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
26c50 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54  .** or SAVEPOINT
26c60 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66  _RELEASE. This f
26c70 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72  unction either r
26c80 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73  eleases or rolls
26c90 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76   back the.** sav
26ca0 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65  epoint identifie
26cb0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69  d by parameter i
26cc0 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e  Savepoint, depen
26cd0 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75  ding on the valu
26ce0 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a  e .** of op..**.
26cf0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61  ** Normally, iSa
26d00 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
26d10 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
26d20 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65   to zero. Howeve
26d30 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53  r, if op is.** S
26d40 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
26d50 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69  K, then iSavepoi
26d60 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d  nt may also be -
26d70 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  1. In this case 
26d80 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
26d90 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
26da0 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72  ransaction are r
26db0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73  olled back. This
26dc0 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   is different.**
26dd0 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74   from a normal t
26de0 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
26df0 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73  ack, as no locks
26e00 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e   are released an
26e10 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  d the.** transac
26e20 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65  tion remains ope
26e30 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
26e40 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
26e50 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70  Btree *p, int op
26e60 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
26e70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
26e80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
26e90 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
26ea0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
26eb0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
26ec0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
26ed0 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
26ee0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
26ef0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
26f00 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73  LLBACK );.    as
26f10 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
26f20 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69  >=0 || (iSavepoi
26f30 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41  nt==-1 && op==SA
26f40 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
26f50 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
26f60 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
26f70 20 20 20 62 74 72 65 65 50 74 72 6d 61 70 45 6e     btreePtrmapEn
26f80 64 28 70 42 74 2c 20 6f 70 2c 20 69 53 61 76 65  d(pBt, op, iSave
26f90 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  point);.    if( 
26fa0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
26fb0 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
26fc0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
26fd0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
26fe0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
26ff0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27000 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27010 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
27020 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
27030 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
27040 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
27050 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27060 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e     if( iSavepoin
27070 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73  t<0 && (pBt->bts
27080 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54  Flags & BTS_INIT
27090 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20  IALLY_EMPTY)!=0 
270a0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
270b0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
270c0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65   }.      rc = ne
270d0 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
270e0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
270f0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b   = get4byte(28 +
27100 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
27110 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
27120 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
27130 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
27140 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38  to the offset 28
27150 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20   of the header. 
27160 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
27170 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
27180 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77  rted, so we know
27190 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
271a0 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20  at offset.      
271b0 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f  ** 28 is nonzero
271c0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
271d0 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  t( pBt->nPage>0 
271e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
271f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
27200 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27210 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
27220 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
27230 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
27240 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
27250 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
27260 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e  le. If a read-on
27270 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71  ly cursor is req
27280 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73  uested, it is as
27290 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
272a0 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79  e caller already
272b0 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20   has at least a 
272c0 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
272d0 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e  ction open.** on
272e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
272f0 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74  ready. If a writ
27300 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e-cursor is requ
27310 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ested, then.** t
27320 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73  he caller is ass
27330 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20  umed to have an 
27340 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
27350 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
27360 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52   the BTREE_WRCSR
27370 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 69   bit of wrFlag i
27380 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68  s clear, then th
27390 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
273a0 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72  y.** be used for
273b0 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20 74 68   reading.  If th
273c0 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69  e BTREE_WRCSR bi
273d0 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  t is set, then t
273e0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e  he cursor.** can
273f0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
27400 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72 69 74  ding or for writ
27410 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
27420 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
27430 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ing.** are also 
27440 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72 65 20  met.  These are 
27450 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
27460 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
27470 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20  in order.** for 
27480 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20 61 6c  writing to be al
27490 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
274a0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
274b0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
274c0 64 20 77 69 74 68 20 77 72 46 6c 61 67 20 63 6f  d with wrFlag co
274d0 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45 5f 57  ntaining BTREE_W
274e0 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  RCSR.**.** 2:  O
274f0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
27500 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
27510 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
27520 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
27530 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
27540 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
27550 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
27560 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
27570 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
27580 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
27590 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
275a0 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
275b0 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
275c0 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
275d0 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
275e0 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
275f0 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
27600 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
27610 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
27620 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
27630 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
27640 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
27650 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
27660 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
27670 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
27680 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
27690 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
276a0 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c  The BTREE_FORDEL
276b0 45 54 45 20 62 69 74 20 6f 66 20 77 72 46 6c 61  ETE bit of wrFla
276c0 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79  g may optionally
276d0 20 62 65 20 73 65 74 20 69 66 20 42 54 52 45 45   be set if BTREE
276e0 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73 65 74  _WRCSR.** is set
276f0 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54 45 20  .  If FORDELETE 
27700 69 73 20 73 65 74 2c 20 74 68 61 74 20 69 73 20  is set, that is 
27710 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d  a hint to the im
27720 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
27730 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73 6f 72  t.** this cursor
27740 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73   will only be us
27750 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e  ed to seek to an
27760 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69 65 73  d delete entries
27770 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20   of an index.** 
27780 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72  as part of a lar
27790 67 65 72 20 44 45 4c 45 54 45 20 73 74 61 74 65  ger DELETE state
277a0 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 44 45  ment.  The FORDE
277b0 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e 6f 74  LETE hint is not
277c0 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73   used by.** this
277d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
277e0 20 20 42 75 74 20 69 6e 20 61 20 68 79 70 6f 74    But in a hypot
277f0 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e 61 74  hetical alternat
27800 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69  ive storage engi
27810 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ne .** in which 
27820 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61 72  index entries ar
27830 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
27840 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63 6f 72  deleted when cor
27850 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
27860 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64 65 6c  .** rows are del
27870 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44 45 4c  eted, the FORDEL
27880 45 54 45 20 66 6c 61 67 20 69 73 20 61 20 68 69  ETE flag is a hi
27890 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45 45 4b  nt that all SEEK
278a0 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f   and DELETE.** o
278b0 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69  perations on thi
278c0 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  s cursor can be 
278d0 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52  no-ops and all R
278e0 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73 20 63  EAD operations c
278f0 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  an .** return a 
27900 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74 65  null row (2-byte
27910 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a  s: 0x01 0x00)..*
27920 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
27930 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
27940 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
27950 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
27960 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
27970 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
27980 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
27990 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
279a0 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
279b0 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
279c0 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  y..**.** It is a
279d0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
279e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
279f0 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65  orZero() has bee
27a00 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70  n called.** on p
27a10 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  Cur to initializ
27a20 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  e the memory spa
27a30 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  ce prior to invo
27a40 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
27a50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
27a60 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
27a70 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
27a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
27aa0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
27ab0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
27ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ad0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
27ae0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
27af0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
27b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
27b20 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
27b30 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
27b40 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
27b50 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
27b60 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
27b70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
27b80 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
27b90 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
27ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bb0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
27bc0 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
27bd0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
27be0 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
27bf0 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
27c00 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  d b-tree handle 
27c10 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
27c20 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
27c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
27c40 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65  ooping over othe
27c50 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f  r all cursors */
27c60 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
27c70 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
27c80 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
27c90 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20  t( wrFlag==0 .  
27ca0 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d       || wrFlag==
27cb0 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20 20 20  BTREE_WRCSR .   
27cc0 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28      || wrFlag==(
27cd0 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54 52 45  BTREE_WRCSR|BTRE
27ce0 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a 20 20  E_FORDELETE) .  
27cf0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
27d00 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
27d10 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
27d20 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
27d30 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
27d40 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
27d50 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
27d60 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
27d70 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
27d80 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
27d90 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
27da0 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
27db0 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
27dc0 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
27dd0 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
27de0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
27df0 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
27e00 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
27e10 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
27e20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b  (wrFlag?2:1)) );
27e30 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
27e40 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64  g==0 || !hasRead
27e50 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
27e60 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  ble) );..  /* As
27e70 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
27e80 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20  ller has opened 
27e90 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61  the required tra
27ea0 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61  nsaction. */.  a
27eb0 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
27ec0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  s>TRANS_NONE );.
27ed0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
27ee0 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e  ==0 || p->inTran
27ef0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
27f00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
27f10 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e  >pPage1 && pBt->
27f20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
27f30 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
27f40 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74  g==0 || (pBt->bt
27f50 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
27f60 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20  D_ONLY)==0 );.. 
27f70 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20   if( wrFlag ){. 
27f80 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53     allocateTempS
27f90 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69  pace(pBt);.    i
27fa0 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
27fb0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
27fc0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
27fd0 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
27fe0 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
27ff0 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
28000 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72  {.    assert( wr
28010 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Flag==0 );.    i
28020 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Table = 0;.  }..
28030 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
28040 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
28050 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
28060 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
28070 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
28080 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
28090 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
280a0 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
280b0 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
280c0 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
280d0 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
280e0 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
280f0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
28100 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
28110 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
28120 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
28130 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
28140 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43 46   = wrFlag ? BTCF
28150 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a  _WriteFlag : 0;.
28160 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72    pCur->curPager
28170 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
28180 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52   0 : PAGER_GET_R
28190 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66  EADONLY;.  /* If
281a0 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f   there are two o
281b0 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f  r more cursors o
281c0 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65  n the same btree
281d0 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a  , then all such.
281e0 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75    ** cursors *mu
281f0 73 74 2a 20 68 61 76 65 20 74 68 65 20 42 54 43  st* have the BTC
28200 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
28210 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58  set. */.  for(pX
28220 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
28230 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
28240 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67  {.    if( pX->pg
28250 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54  noRoot==(Pgno)iT
28260 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58  able ){.      pX
28270 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
28280 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20  CF_Multiple;.   
28290 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
282a0 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70  s |= BTCF_Multip
282b0 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  le;.    }.  }.  
282c0 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
282d0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42  t->pCursor;.  pB
282e0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
282f0 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
28300 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
28310 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ID;.  return SQL
28320 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
28330 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
28340 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
28350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28370 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
28380 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
283b0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
283c0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
283d0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
283e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28400 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
28410 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
28420 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
28430 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
28440 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
28450 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
28460 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
28470 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28490 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
284a0 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
284b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
284c0 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a  if( iTable<1 ){.
284d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
284e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
284f0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
28500 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
28510 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43  .    rc = btreeC
28520 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
28530 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
28540 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71  o, pCur);.    sq
28550 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
28560 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
28570 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
28580 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
28590 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
285a0 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
285b0 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
285c0 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
285d0 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
285e0 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
285f0 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
28600 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
28610 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
28620 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
28630 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
28640 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
28650 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
28660 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
28670 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
28680 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
28690 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
286a0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
286b0 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
286c0 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  rn ROUND8(sizeof
286d0 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a  (BtCursor));.}..
286e0 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
286f0 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c   memory that wil
28700 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
28710 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f  nto a BtCursor o
28720 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
28730 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68   simple approach
28740 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74   here would be t
28750 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65  o memset() the e
28760 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  ntire object.** 
28770 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74  to zero.  But it
28780 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20   turns out that 
28790 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64  the apPage[] and
287a0 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a   aiIdx[] arrays.
287b0 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ** do not need t
287c0 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20  o be zeroed and 
287d0 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20  they are large, 
287e0 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61  so we can save a
287f0 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74   lot.** of run-t
28800 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20  ime by skipping 
28810 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
28820 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d  on of those elem
28830 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
28840 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
28850 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Zero(BtCursor *p
28860 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ){.  memset(p, 0
28870 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  , offsetof(BtCur
28880 73 6f 72 2c 20 42 54 43 55 52 53 4f 52 5f 46 49  sor, BTCURSOR_FI
28890 52 53 54 5f 55 4e 49 4e 49 54 29 29 3b 0a 7d 0a  RST_UNINIT));.}.
288a0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
288b0 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
288c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
288d0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
288e0 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
288f0 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
28900 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
28910 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
28920 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
28930 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
28940 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
28950 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
28960 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 42 74  pBtree ){.    Bt
28970 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
28980 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
28990 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
289a0 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65  Btree);.    asse
289b0 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  rt( pBt->pCursor
289c0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
289d0 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75  Bt->pCursor==pCu
289e0 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r ){.      pBt->
289f0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
28a00 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
28a10 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f 72  {.      BtCursor
28a20 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70   *pPrev = pBt->p
28a30 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f  Cursor;.      do
28a40 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
28a50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72  rev->pNext==pCur
28a60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
28a70 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
28a80 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
28a90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
28aa0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72     }.        pPr
28ab0 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78  ev = pPrev->pNex
28ac0 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  t;.      }while(
28ad0 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20 29   ALWAYS(pPrev) )
28ae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65  ;.    }.    btre
28af0 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
28b00 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20  rPages(pCur);.  
28b10 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
28b20 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
28b30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
28b40 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  r->aOverflow);. 
28b50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28b60 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20  pCur->pKey);.   
28b70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
28b80 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  ve(pBtree);.    
28b90 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 30  pCur->pBtree = 0
28ba0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
28bb0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
28bc0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
28bd0 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
28be0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
28bf0 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
28c00 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
28c10 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
28c20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
28c30 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74  alid, call.** bt
28c40 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
28c50 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
28c60 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
28c70 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
28c80 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
28c90 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
28ca0 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
28cb0 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
28cc0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
28cd0 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72  alls to btreePar
28ce0 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66  seCell()..*/.#if
28cf0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74  ndef NDEBUG.  st
28d00 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 49 6e 66  atic int cellInf
28d10 6f 45 71 75 61 6c 28 43 65 6c 6c 49 6e 66 6f 20  oEqual(CellInfo 
28d20 2a 61 2c 20 43 65 6c 6c 49 6e 66 6f 20 2a 62 29  *a, CellInfo *b)
28d30 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 4b 65  {.    if( a->nKe
28d40 79 21 3d 62 2d 3e 6e 4b 65 79 20 29 20 72 65 74  y!=b->nKey ) ret
28d50 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61  urn 0;.    if( a
28d60 2d 3e 70 50 61 79 6c 6f 61 64 21 3d 62 2d 3e 70  ->pPayload!=b->p
28d70 50 61 79 6c 6f 61 64 20 29 20 72 65 74 75 72 6e  Payload ) return
28d80 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e   0;.    if( a->n
28d90 50 61 79 6c 6f 61 64 21 3d 62 2d 3e 6e 50 61 79  Payload!=b->nPay
28da0 6c 6f 61 64 20 29 20 72 65 74 75 72 6e 20 30 3b  load ) return 0;
28db0 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 4c 6f 63  .    if( a->nLoc
28dc0 61 6c 21 3d 62 2d 3e 6e 4c 6f 63 61 6c 20 29 20  al!=b->nLocal ) 
28dd0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
28de0 28 20 61 2d 3e 6e 53 69 7a 65 21 3d 62 2d 3e 6e  ( a->nSize!=b->n
28df0 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 30 3b  Size ) return 0;
28e00 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
28e10 20 7d 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64   }.  static void
28e20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
28e30 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
28e40 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
28e50 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  fo;.    memset(&
28e60 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
28e70 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65  info));.    btre
28e80 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
28e90 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78  >pPage, pCur->ix
28ea0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
28eb0 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
28ec0 20 7c 7c 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61   || cellInfoEqua
28ed0 6c 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  l(&info, &pCur->
28ee0 69 6e 66 6f 29 20 29 3b 0a 20 20 7d 0a 23 65 6c  info) );.  }.#el
28ef0 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
28f00 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
28f10 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c  endif.static SQL
28f20 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
28f30 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
28f40 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
28f50 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
28f60 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
28f70 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
28f80 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
28f90 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
28fa0 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
28fb0 2c 70 43 75 72 2d 3e 69 78 2c 26 70 43 75 72 2d  ,pCur->ix,&pCur-
28fc0 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  >info);.  }else{
28fd0 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
28fe0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  nfo(pCur);.  }.}
28ff0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
29000 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
29010 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
29020 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
29030 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
29040 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
29050 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
29060 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
29070 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
29080 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
29090 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
290a0 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
290b0 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
290c0 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
290d0 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
290e0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
290f0 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
29100 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
29110 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
29120 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
29130 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
29140 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
29150 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
29160 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
29170 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
29180 55 47 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  UG */.int sqlite
29190 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
291a0 6c 69 64 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a  lidNN(BtCursor *
291b0 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
291c0 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 72 65   pCur!=0 );.  re
291d0 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74  turn pCur->eStat
291e0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e==CURSOR_VALID;
291f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
29200 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
29210 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 6f 72  e integer key or
29220 20 22 72 6f 77 69 64 22 20 66 6f 72 20 61 20 74   "rowid" for a t
29230 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54  able btree..** T
29240 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
29250 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 61 20  nly valid for a 
29260 63 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70  cursor that is p
29270 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a  ointing into a.*
29280 2a 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  * ordinary table
29290 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20   btree.  If the 
292a0 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  cursor points to
292b0 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 20   an index btree 
292c0 6f 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64  or.** is invalid
292d0 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  , the result of 
292e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
292f0 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36  undefined..*/.i6
29300 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  4 sqlite3BtreeIn
29310 74 65 67 65 72 4b 65 79 28 42 74 43 75 72 73 6f  tegerKey(BtCurso
29320 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
29330 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
29340 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
29350 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
29360 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
29370 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
29380 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
29390 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
293a0 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
293b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
293c0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
293d0 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54  TE_ENABLE_OFFSET
293e0 5f 53 51 4c 5f 46 55 4e 43 0a 2f 2a 0a 2a 2a 20  _SQL_FUNC./*.** 
293f0 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
29400 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
29410 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
29420 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a   start of the.**
29430 20 70 61 79 6c 6f 61 64 20 74 6f 20 77 68 69 63   payload to whic
29440 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
29450 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a 69 36 34  pointing..*/.i64
29460 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 66 66   sqlite3BtreeOff
29470 73 65 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  set(BtCursor *pC
29480 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
29490 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
294a0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
294b0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
294c0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
294d0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
294e0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Cur);.  return (
294f0 69 36 34 29 70 43 75 72 2d 3e 70 42 74 2d 3e 70  i64)pCur->pBt->p
29500 61 67 65 53 69 7a 65 2a 28 28 69 36 34 29 70 43  ageSize*((i64)pC
29510 75 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ur->pPage->pgno 
29520 2d 20 31 29 20 2b 0a 20 20 20 20 20 20 20 20 20  - 1) +.         
29530 28 69 36 34 29 28 70 43 75 72 2d 3e 69 6e 66 6f  (i64)(pCur->info
29540 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 75 72  .pPayload - pCur
29550 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  ->pPage->aData);
29560 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
29570 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45  ITE_ENABLE_OFFSE
29580 54 5f 53 51 4c 5f 46 55 4e 43 20 2a 2f 0a 0a 2f  T_SQL_FUNC */../
29590 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
295a0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
295b0 6f 66 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74  of payload for t
295c0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 70 43  he entry that pC
295d0 75 72 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  ur is.** current
295e0 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  ly pointing to. 
295f0 20 46 6f 72 20 74 61 62 6c 65 20 62 74 72 65 65   For table btree
29600 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  s, this will be 
29610 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  the amount.** of
29620 20 64 61 74 61 2e 20 20 46 6f 72 20 69 6e 64 65   data.  For inde
29630 78 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77  x btrees, this w
29640 69 6c 6c 20 62 65 20 74 68 65 20 73 69 7a 65 20  ill be the size 
29650 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  of the key..**.*
29660 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
29670 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  t guarantee that
29680 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
29690 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e  ointing to a non
296a0 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65  -NULL.** valid e
296b0 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20  ntry.  In other 
296c0 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69  words, the calli
296d0 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73  ng procedure mus
296e0 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74  t guarantee.** t
296f0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
29700 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65  as Cursor.eState
29710 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  ==CURSOR_VALID..
29720 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74  */.u32 sqlite3Bt
29730 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 42  reePayloadSize(B
29740 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
29750 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29760 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
29770 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
29780 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
29790 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65  OR_VALID );.  ge
297a0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
297b0 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
297c0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d  info.nPayload;.}
297d0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
297e0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
297f0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
29800 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
29810 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  e (parameter.** 
29820 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63  ovfl), this func
29830 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70  tion finds the p
29840 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
29850 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
29860 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
29870 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  st of overflow p
29880 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c  ages. If possibl
29890 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61  e, it uses the a
298a0 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f  uto-vacuum.** po
298b0 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69  inter-map data i
298c0 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e  nstead of readin
298d0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
298e0 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f   page ovfl to do
298f0 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61   so. .**.** If a
29900 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
29910 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
29920 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
29930 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a   Otherwise:.**.*
29940 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
29950 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76  r of the next ov
29960 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
29970 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69  he linked list i
29980 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  s .** written to
29990 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20   *pPgnoNext. If 
299a0 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65  page ovfl is the
299b0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
299c0 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73  s linked .** lis
299d0 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73  t, *pPgnoNext is
299e0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a   set to zero. .*
299f0 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69  *.** If ppPage i
29a00 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20  s not NULL, and 
29a10 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
29a20 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
29a30 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  t corresponding.
29a40 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ** to page numbe
29a50 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61  r pOvfl was obta
29a60 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61  ined, then *ppPa
29a70 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ge is set to poi
29a80 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65  nt to that.** re
29a90 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74  ference. It is t
29aa0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
29ab0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
29ac0 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
29ad0 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50  age().** on *ppP
29ae0 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20  age to free the 
29af0 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f  reference. In no
29b00 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f   reference was o
29b10 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65  btained (because
29b20 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
29b30 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20  map was used to 
29b40 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65  obtain the value
29b50 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29   for *pPgnoNext)
29b60 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67  , then.** *ppPag
29b70 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  e is set to zero
29b80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29b90 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
29ba0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
29bb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29bc0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
29bd0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  file */.  Pgno o
29be0 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vfl,            
29bf0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
29c00 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
29c10 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50  number */.  MemP
29c20 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
29c30 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
29c40 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20   MemPage handle 
29c50 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f  (may be NULL) */
29c60 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65  .  Pgno *pPgnoNe
29c70 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  xt              
29c80 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65  /* OUT: Next ove
29c90 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
29ca0 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e  r */.){.  Pgno n
29cb0 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  ext = 0;.  MemPa
29cc0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
29cd0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29ce0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
29cf0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
29d00 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
29d10 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f  ;.  assert(pPgno
29d20 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20  Next);..#ifndef 
29d30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
29d40 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20  VACUUM.  /* Try 
29d50 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  to find the next
29d60 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
29d70 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67  rflow list using
29d80 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61   the.  ** autova
29d90 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70  cuum pointer-map
29da0 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68   pages. Guess th
29db0 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  at the next page
29dc0 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76   in .  ** the ov
29dd0 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70  erflow list is p
29de0 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c  age number (ovfl
29df0 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65  +1). If that gue
29e00 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f  ss turns .  ** o
29e10 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20  ut to be wrong, 
29e20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61  fall back to loa
29e30 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66  ding the data of
29e40 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62   page .  ** numb
29e50 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72  er ovfl to deter
29e60 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61  mine the next pa
29e70 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a  ge number..  */.
29e80 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
29e90 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
29ea0 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f  o pgno;.    Pgno
29eb0 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31   iGuess = ovfl+1
29ec0 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
29ed0 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
29ee0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
29ef0 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73  Guess) || iGuess
29f00 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
29f10 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
29f20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20    iGuess++;.    
29f30 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73  }..    if( iGues
29f40 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e  s<=btreePagecoun
29f50 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
29f60 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
29f70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79  Bt, iGuess, &eTy
29f80 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20  pe, &pgno);.    
29f90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29fa0 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54  _OK && eType==PT
29fb0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26  RMAP_OVERFLOW2 &
29fc0 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a  & pgno==ovfl ){.
29fd0 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69          next = i
29fe0 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72  Guess;.        r
29ff0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
2a000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a010 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
2a020 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20  ert( next==0 || 
2a030 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
2a040 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2a050 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
2a060 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2a070 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67  pBt, ovfl, &pPag
2a080 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f  e, (ppPage==0) ?
2a090 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
2a0a0 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73  NLY : 0);.    as
2a0b0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2a0c0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20  _OK || pPage==0 
2a0d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2a0e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a0f0 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74    next = get4byt
2a100 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
2a110 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
2a120 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b  PgnoNext = next;
2a130 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b  .  if( ppPage ){
2a140 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
2a150 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
2a160 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2a170 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
2a180 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
2a190 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  DONE ? SQLITE_OK
2a1a0 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   : rc);.}../*.**
2a1b0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
2a1c0 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61  a buffer to a pa
2a1d0 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61  ge, or from a pa
2a1e0 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a  ge to a buffer..
2a1f0 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69  **.** pPayload i
2a200 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  s a pointer to d
2a210 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61  ata stored on da
2a220 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
2a230 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d  age..** If argum
2a240 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65  ent eOp is false
2a250 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74  , then nByte byt
2a260 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  es of data are c
2a270 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50  opied.** from pP
2a280 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75  ayload to the bu
2a290 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20  ffer pointed at 
2a2a0 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20  by pBuf. If eOp 
2a2b0 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e  is true,.** then
2a2c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2a2d0 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
2a2e0 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42  n pDbPage and nB
2a2f0 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  yte bytes.** of 
2a300 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20  data are copied 
2a310 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
2a320 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64  pBuf to pPayload
2a330 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
2a340 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
2a350 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77   success, otherw
2a360 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ise an error cod
2a370 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2a380 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20   copyPayload(.  
2a390 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20  void *pPayload, 
2a3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2a3b0 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74  nter to page dat
2a3c0 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  a */.  void *pBu
2a3d0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
2a3e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
2a3f0 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
2a400 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
2a410 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2a420 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20  f bytes to copy 
2a430 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20  */.  int eOp,   
2a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a450 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d  * 0 -> copy from
2a460 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79   page, 1 -> copy
2a470 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62   to page */.  Db
2a480 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20  Page *pDbPage   
2a490 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2a4a0 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c  containing pPayl
2a4b0 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  oad */.){.  if( 
2a4c0 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  eOp ){.    /* Co
2a4d0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66  py data from buf
2a4e0 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77  fer to page (a w
2a4f0 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20  rite operation) 
2a500 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
2a510 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a520 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
2a530 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a540 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2a550 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2a560 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
2a570 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20   pBuf, nByte);. 
2a580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43   }else{.    /* C
2a590 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61  opy data from pa
2a5a0 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20  ge to buffer (a 
2a5b0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20  read operation) 
2a5c0 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42  */.    memcpy(pB
2a5d0 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42  uf, pPayload, nB
2a5e0 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  yte);.  }.  retu
2a5f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2a600 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2a610 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2a620 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74  read or overwrit
2a630 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  e payload inform
2a640 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65  ation.** for the
2a650 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
2a660 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
2a670 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20  ointing to. The 
2a680 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  eOp.** argument 
2a690 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
2a6a0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2a6b0 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74     0: The operat
2a6c0 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50  ion is a read. P
2a6d0 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
2a6e0 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
2a6f0 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   1: The operatio
2a700 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f  n is a write. Po
2a710 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
2a720 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  low cache..**.**
2a730 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
2a740 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
2a750 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
2a760 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
2a770 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
2a780 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
2a790 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
2a7a0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
2a7b0 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
2a7c0 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
2a7d0 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
2a7e0 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
2a7f0 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
2a800 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
2a810 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
2a820 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
2a830 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
2a840 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
2a850 6c 6f 77 20 70 61 67 65 73 0a 2a 2a 20 74 68 69  low pages.** thi
2a860 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
2a870 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
2a880 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70  r and lazily pop
2a890 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 6f 76 65  ulate.** the ove
2a8a0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
2a8b0 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43  cache array (BtC
2a8c0 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29  ursor.aOverflow)
2a8d0 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  . .** Subsequent
2a8e0 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 20   calls use this 
2a8f0 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
2a900 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
2a910 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a  plied offset .**
2a920 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
2a930 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
2a940 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
2a950 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
2a960 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
2a970 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
2a980 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
2a990 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
2a9a0 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
2a9b0 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
2a9c0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
2a9d0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
2a9e0 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
2a9f0 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
2aa00 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
2aa10 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
2aa20 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
2aa30 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2aa40 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
2aa50 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
2aa60 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
2aa70 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
2aa80 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
2aa90 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
2aaa0 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
2aab0 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
2aac0 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
2aad0 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
2aae0 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
2aaf0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
2ab00 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
2ab10 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
2ab20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
2ab30 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
2ab40 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
2ab50 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
2ab60 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
2ab70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
2ab80 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
2ab90 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
2aba0 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
2abb0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
2abc0 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
2abd0 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
2abe0 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
2abf0 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
2ac00 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
2ac10 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
2ac20 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
2ac30 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
2ac40 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
2ac50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2ac60 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
2ac70 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2ac80 70 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20 20  pCur->pPage;    
2ac90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
2aca0 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
2acb0 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
2acc0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2acd0 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
2ace0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
2acf0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
2ad00 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69  belongs to */.#i
2ad10 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
2ad20 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
2ad30 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2ad40 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61   * const pBufSta
2ad50 72 74 20 3d 20 70 42 75 66 3b 20 20 20 20 20 2f  rt = pBuf;     /
2ad60 2a 20 53 74 61 72 74 20 6f 66 20 6f 72 69 67 69  * Start of origi
2ad70 6e 61 6c 20 6f 75 74 20 62 75 66 66 65 72 20 2a  nal out buffer *
2ad80 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
2ad90 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
2ada0 73 73 65 72 74 28 20 65 4f 70 3d 3d 30 20 7c 7c  ssert( eOp==0 ||
2adb0 20 65 4f 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73   eOp==1 );.  ass
2adc0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2add0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2ade0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2adf0 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65  r->ix<pPage->nCe
2ae00 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
2ae10 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2ae20 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74  (pCur) );..  get
2ae30 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
2ae40 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
2ae50 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
2ae60 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
2ae70 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e  et+amt <= pCur->
2ae80 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
2ae90 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50 61 79  ..  assert( aPay
2aea0 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e 61 44  load > pPage->aD
2aeb0 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28 75 70  ata );.  if( (up
2aec0 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d 20 70  tr)(aPayload - p
2aed0 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e 20 28  Page->aData) > (
2aee0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2aef0 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  - pCur->info.nLo
2af00 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  cal) ){.    /* T
2af10 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72  rying to read or
2af20 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20   write past the 
2af30 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20  end of the data 
2af40 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68  is an error.  Th
2af50 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69  e.    ** conditi
2af60 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20 72 65  onal above is re
2af70 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20 20 20  ally:.    **    
2af80 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
2af90 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
2afa0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2afb0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20  ->usableSize].  
2afc0 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65 63 61    ** but is reca
2afd0 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75 72 72  st into its curr
2afe0 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76 6f 69  ent form to avoi
2aff0 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c  d integer overfl
2b000 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20 20 20  ow problems.    
2b010 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
2b020 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
2b030 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  E(pPage);.  }.. 
2b040 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
2b050 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
2b060 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
2b070 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
2b080 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
2b090 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
2b0a0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
2b0b0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
2b0c0 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
2b0d0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
2b0e0 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
2b0f0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
2b100 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
2b110 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
2b120 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
2b130 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
2b140 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
2b150 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
2b160 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
2b170 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
2b180 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
2b190 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
2b1a0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
2b1b0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
2b1c0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
2b1d0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
2b1e0 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
2b1f0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
2b200 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
2b210 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
2b220 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
2b230 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
2b240 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2b250 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
2b260 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20  nfo.nLocal]);.. 
2b270 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43     /* If the BtC
2b280 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
2b290 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  ] has not been a
2b2a0 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
2b2b0 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a  te it now..    *
2b2c0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76  *.    ** The aOv
2b2d0 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69  erflow[] array i
2b2e0 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65  s sized at one e
2b2f0 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76  ntry for each ov
2b300 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
2b310 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ** in the overfl
2b320 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
2b330 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2b340 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
2b350 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73  page is.    ** s
2b360 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c  tored in aOverfl
2b370 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61  ow[0], etc. A va
2b380 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20  lue of 0 in the 
2b390 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
2b3a0 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22  y.    ** means "
2b3b0 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28  not yet known" (
2b3c0 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a  the cache is laz
2b3d0 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a  ily populated)..
2b3e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
2b3f0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2b400 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
2b410 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
2b420 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
2b430 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
2b440 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
2b450 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
2b460 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
2b470 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 3d  pCur->aOverflow=
2b480 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6e 4f 76  =0.       || nOv
2b490 66 6c 2a 28 69 6e 74 29 73 69 7a 65 6f 66 28 50  fl*(int)sizeof(P
2b4a0 67 6e 6f 29 20 3e 20 73 71 6c 69 74 65 33 4d 61  gno) > sqlite3Ma
2b4b0 6c 6c 6f 63 53 69 7a 65 28 70 43 75 72 2d 3e 61  llocSize(pCur->a
2b4c0 4f 76 65 72 66 6c 6f 77 29 0a 20 20 20 20 20 20  Overflow).      
2b4d0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
2b4e0 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73  *aNew = (Pgno*)s
2b4f0 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20  qlite3Realloc(. 
2b500 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
2b510 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66  >aOverflow, nOvf
2b520 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  l*2*sizeof(Pgno)
2b530 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2b540 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
2b550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
2b560 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2b570 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
2b580 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2b590 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
2b5a0 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
2b5b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2b5c0 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76  memset(pCur->aOv
2b5d0 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c  erflow, 0, nOvfl
2b5e0 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a  *sizeof(Pgno));.
2b5f0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2b600 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
2b610 69 64 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73  idOvfl;.    }els
2b620 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  e{.      /* If t
2b630 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
2b640 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
2b650 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
2b660 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
2b670 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
2b680 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
2b690 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
2b6a0 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 20 20  lid, skip.      
2b6b0 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
2b6c0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
2b6d0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
2b6e0 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
2b6f0 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
2b700 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
2b710 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
2b720 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
2b730 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
2b740 49 64 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66  Idx];.        of
2b750 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
2b760 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
2b770 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  }.    }..    ass
2b780 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2b790 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20  OK && amt>0 );. 
2b7a0 20 20 20 77 68 69 6c 65 28 20 6e 65 78 74 50 61     while( nextPa
2b7b0 67 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ge ){.      /* I
2b7c0 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
2b7d0 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
2b7e0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
2b7f0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
2b800 72 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt( pCur->aOverf
2b810 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20  low[iIdx]==0.   
2b820 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43             || pC
2b830 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
2b840 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20  dx]==nextPage.  
2b850 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43              || C
2b860 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
2b870 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
2b880 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
2b890 61 67 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  age;..      if( 
2b8a0 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
2b8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2b8c0 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
2b8d0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
2b8e0 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
2b8f0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
2b900 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
2b910 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
2b920 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
2b930 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
2b940 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
2b950 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
2b960 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
2b970 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
2b980 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
2b990 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
2b9a0 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
2b9b0 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
2b9c0 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
2b9d0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
2b9e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2b9f0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2ba00 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2ba10 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20  F_ValidOvfl );. 
2ba20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2ba30 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d  Cur->pBtree->db=
2ba40 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20  =pBt->db );.    
2ba50 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
2ba60 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20  verflow[iIdx+1] 
2ba70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  ){.          nex
2ba80 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
2ba90 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b  verflow[iIdx+1];
2baa0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2bab0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
2bac0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
2bad0 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c  Bt, nextPage, 0,
2bae0 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20   &nextPage);.   
2baf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f       }.        o
2bb00 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a  ffset -= ovflSiz
2bb10 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
2bb20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20          /* Need 
2bb30 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
2bb40 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63  e properly. It c
2bb50 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20  ontains some of 
2bb60 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  the.        ** r
2bb70 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61  ange of data tha
2bb80 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20  t is being read 
2bb90 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74  (eOp==0) or writ
2bba0 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20  ten (eOp!=0)..  
2bbb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2bbc0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
2bbd0 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
2bbe0 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
2bbf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d  ){.          a =
2bc00 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
2bc10 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23  et;.        }..#
2bc20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
2bc30 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
2bc40 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  D.        /* If 
2bc50 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  all the followin
2bc60 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
2bc70 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2bc80 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61  *   1) this is a
2bc90 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c   read operation,
2bca0 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a   and .        **
2bcb0 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65     2) data is re
2bcc0 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20  quired from the 
2bcd0 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76  start of this ov
2bce0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64  erflow page, and
2bcf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29  .        **   3)
2bd00 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 69   there are no di
2bd10 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
2bd20 20 70 61 67 65 2d 63 61 63 68 65 0a 20 20 20 20   page-cache.    
2bd30 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 20      **   4) the 
2bd40 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65  database is file
2bd50 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20  -backed, and.   
2bd60 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65       **   5) the
2bd70 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
2bd80 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 20 20 20  the WAL file.   
2bd90 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 74 20       **   6) at 
2bda0 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61  least 4 bytes ha
2bdb0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
2bdc0 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75  read into the ou
2bdd0 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20  tput buffer .   
2bde0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2bdf0 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e  ** then data can
2be00 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c   be read directl
2be10 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  y from the datab
2be20 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68  ase file into th
2be30 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
2be40 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61  put buffer, bypa
2be50 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63  ssing the page-c
2be60 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e  ache altogether.
2be70 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20   This speeds.   
2be80 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69       ** up loadi
2be90 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73  ng large records
2bea0 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20   that span many 
2beb0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
2bec0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2bed0 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20     if( eOp==0   
2bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29            /* (1)
2bf10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
2bf20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20  offset==0       
2bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf50 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20     /* (2) */.   
2bf60 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
2bf70 50 61 67 65 72 44 69 72 65 63 74 52 65 61 64 4f  PagerDirectReadO
2bf80 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  k(pBt->pPager, n
2bf90 65 78 74 50 61 67 65 29 20 20 20 20 2f 2a 20 28  extPage)    /* (
2bfa0 33 2c 34 2c 35 29 20 2a 2f 0a 20 20 20 20 20 20  3,4,5) */.      
2bfb0 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e     && &pBuf[-4]>
2bfc0 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20  =pBufStart      
2bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfe0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20           /* (6) 
2bff0 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
2c000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c010 66 69 6c 65 20 2a 66 64 20 3d 20 73 71 6c 69 74  file *fd = sqlit
2c020 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
2c030 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
2c040 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b      u8 aSave[4];
2c050 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61  .          u8 *a
2c060 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34  Write = &pBuf[-4
2c070 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ];.          ass
2c080 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75  ert( aWrite>=pBu
2c090 66 53 74 61 72 74 20 29 3b 20 20 20 20 20 20 20  fStart );       
2c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0b0 20 20 2f 2a 20 64 75 65 20 74 6f 20 28 36 29 20    /* due to (6) 
2c0c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
2c0d0 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74  cpy(aSave, aWrit
2c0e0 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 4);.         
2c0f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
2c100 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20  ead(fd, aWrite, 
2c110 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70  a+4, (i64)pBt->p
2c120 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67  ageSize*(nextPag
2c130 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  e-1));.         
2c140 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
2c150 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20  byte(aWrite);.  
2c160 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
2c170 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29  Write, aSave, 4)
2c180 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
2c190 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20  #endif..        
2c1a0 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61  {.          DbPa
2c1b0 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
2c1c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2c1d0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
2c1e0 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
2c1f0 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20  e, &pDbPage,.   
2c200 20 20 20 20 20 20 20 20 20 20 20 28 65 4f 70 3d             (eOp=
2c210 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  =0 ? PAGER_GET_R
2c220 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20  EADONLY : 0).   
2c230 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2c240 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c250 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c260 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20       aPayload = 
2c270 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
2c280 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
2c290 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
2c2a0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50  ge = get4byte(aP
2c2b0 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20  ayload);.       
2c2c0 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61       rc = copyPa
2c2d0 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
2c2e0 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c  offset+4], pBuf,
2c2f0 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65   a, eOp, pDbPage
2c300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
2c310 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2c320 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
2c330 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
2c340 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
2c350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c360 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20   amt -= a;.     
2c370 20 20 20 69 66 28 20 61 6d 74 3d 3d 30 20 29 20     if( amt==0 ) 
2c380 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2c390 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
2c3a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2c3b0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
2c3c0 20 20 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a    iIdx++;.    }.
2c3d0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
2c3e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
2c3f0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72  0 ){.    /* Over
2c400 66 6c 6f 77 20 63 68 61 69 6e 20 65 6e 64 73 20  flow chain ends 
2c410 70 72 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20  prematurely */. 
2c420 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c430 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
2c440 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
2c450 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c460 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
2c470 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65   payload for the
2c480 20 72 6f 77 20 61 74 20 77 68 69 63 68 20 74 68   row at which th
2c490 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
2c4a0 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  s currently.** p
2c4b0 6f 69 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22 20  ointing.  "amt" 
2c4c0 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
2c4d0 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70  ansferred into p
2c4e0 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
2c4f0 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
2c500 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
2c510 2a 20 70 43 75 72 20 63 61 6e 20 62 65 20 70 6f  * pCur can be po
2c520 69 6e 74 69 6e 67 20 74 6f 20 65 69 74 68 65 72  inting to either
2c530 20 61 20 74 61 62 6c 65 20 6f 72 20 61 6e 20 69   a table or an i
2c540 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20  ndex b-tree..** 
2c550 49 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  If pointing to a
2c560 20 74 61 62 6c 65 20 62 74 72 65 65 2c 20 74 68   table btree, th
2c570 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 73  en the content s
2c580 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 20  ection is read. 
2c590 20 49 66 0a 2a 2a 20 70 43 75 72 20 69 73 20 70   If.** pCur is p
2c5a0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e  ointing to an in
2c5b0 64 65 78 20 62 2d 74 72 65 65 20 74 68 65 6e 20  dex b-tree then 
2c5c0 74 68 65 20 6b 65 79 20 73 65 63 74 69 6f 6e 20  the key section 
2c5d0 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46  is read..**.** F
2c5e0 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
2c5f0 61 79 6c 6f 61 64 28 29 2c 20 74 68 65 20 63 61  ayload(), the ca
2c600 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
2c610 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f   that pCur is po
2c620 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
2c630 61 6c 69 64 20 72 6f 77 20 69 6e 20 74 68 65 20  alid row in the 
2c640 74 61 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69  table.  For sqli
2c650 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43  te3BtreePayloadC
2c660 68 65 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a  hecked(), the.**
2c670 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 62 65   cursor might be
2c680 20 69 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67 68   invalid or migh
2c690 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 73  t need to be res
2c6a0 74 6f 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  tored before bei
2c6b0 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52  ng read..**.** R
2c6c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2c6d0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
2c6e0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
2c6f0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
2c700 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
2c710 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2c720 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
2c730 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
2c740 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
2c750 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
2c760 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
2c770 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2c780 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
2c790 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
2c7a0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2c7b0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2c7c0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2c7d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2c7e0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2c7f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2c800 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
2c810 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  >pPage );.  asse
2c820 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75  rt( pCur->ix<pCu
2c830 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
2c840 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  );.  return acce
2c850 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
2c860 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
2c870 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
2c880 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
2c890 54 68 69 73 20 76 61 72 69 61 6e 74 20 6f 66 20  This variant of 
2c8a0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
2c8b0 6f 61 64 28 29 20 77 6f 72 6b 73 20 65 76 65 6e  oad() works even
2c8c0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 68   if the cursor h
2c8d0 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  as not.** in the
2c8e0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 73 74   CURSOR_VALID st
2c8f0 61 74 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ate.  It is only
2c900 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71 6c   used by the sql
2c910 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29  ite3_blob_read()
2c920 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
2c930 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2c940 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73  _OMIT_INCRBLOB.s
2c950 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
2c960 4e 4c 49 4e 45 20 69 6e 74 20 61 63 63 65 73 73  NLINE int access
2c970 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a  PayloadChecked(.
2c980 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
2c990 2c 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 0a  ,.  u32 offset,.
2c9a0 20 20 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69    u32 amt,.  voi
2c9b0 64 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74  d *pBuf.){.  int
2c9c0 20 72 63 3b 0a 20 20 69 66 20 28 20 70 43 75 72   rc;.  if ( pCur
2c9d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2c9e0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
2c9f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
2ca00 4f 52 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ORT;.  }.  asser
2ca10 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2ca20 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2ca30 20 72 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f   rc = btreeResto
2ca40 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2ca50 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
2ca60 20 72 63 20 3f 20 72 63 20 3a 20 61 63 63 65 73   rc ? rc : acces
2ca70 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
2ca80 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
2ca90 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
2caa0 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43  te3BtreePayloadC
2cab0 68 65 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20  hecked(BtCursor 
2cac0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
2cad0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
2cae0 20 2a 70 42 75 66 29 7b 0a 20 20 69 66 28 20 70   *pBuf){.  if( p
2caf0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2cb00 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
2cb10 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2cb20 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2cb30 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
2cb40 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
2cb50 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
2cb60 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c   pBuf, 0);.  }el
2cb70 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61  se{.    return a
2cb80 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63  ccessPayloadChec
2cb90 6b 65 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  ked(pCur, offset
2cba0 2c 20 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20  , amt, pBuf);.  
2cbb0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
2cbc0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
2cbd0 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OB */../*.** Ret
2cbe0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
2cbf0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
2cc00 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
2cc10 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
2cc20 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
2cc30 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
2cc40 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
2cc50 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
2cc60 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69  .** the key if i
2cc70 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61  ndex btrees (pPa
2cc80 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61  ge->intKey==0) a
2cc90 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66  nd is the data f
2cca0 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65  or.** table btre
2ccb0 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
2ccc0 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65  y==1). The numbe
2ccd0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
2cce0 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64  ailable.** key/d
2ccf0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69  ata is written i
2cd00 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
2cd10 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
2cd20 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72  e value.** retur
2cd30 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ned will not be 
2cd40 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
2cd50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2cd60 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
2cd70 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
2cd80 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
2cd90 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
2cda0 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
2cdb0 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
2cdc0 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
2cdd0 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
2cde0 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
2cdf0 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
2ce00 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
2ce10 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
2ce20 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
2ce30 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
2ce40 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
2ce50 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
2ce60 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
2ce70 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
2ce80 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
2ce90 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
2cea0 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
2ceb0 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
2cec0 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
2ced0 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
2cee0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
2cef0 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
2cf00 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
2cf10 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
2cf20 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
2cf30 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
2cf40 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
2cf50 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
2cf60 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
2cf70 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
2cf80 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
2cf90 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
2cfa0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74   const void *fet
2cfb0 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
2cfc0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
2cfd0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
2cfe0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
2cff0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
2d000 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20  u32 *pAmt       
2d010 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
2d020 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
2d030 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
2d040 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 74   */.){.  int amt
2d050 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2d060 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
2d070 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70  ge>=0 && pCur->p
2d080 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Page);.  assert(
2d090 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2d0a0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2d0b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2d0c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2d0d0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2d0e0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2d0f0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2d100 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2d110 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
2d120 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
2d130 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
2d140 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2d150 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
2d160 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
2d170 6c 6f 61 64 3e 70 43 75 72 2d 3e 70 50 61 67 65  load>pCur->pPage
2d180 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55  ->aData || CORRU
2d190 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
2d1a0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  t( pCur->info.pP
2d1b0 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 70 50 61  ayload<pCur->pPa
2d1c0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43  ge->aDataEnd ||C
2d1d0 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d  ORRUPT_DB);.  am
2d1e0 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  t = pCur->info.n
2d1f0 4c 6f 63 61 6c 3b 0a 20 20 69 66 28 20 61 6d 74  Local;.  if( amt
2d200 3e 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50 61  >(int)(pCur->pPa
2d210 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70  ge->aDataEnd - p
2d220 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
2d230 61 64 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ad) ){.    /* Th
2d240 65 72 65 20 69 73 20 74 6f 6f 20 6c 69 74 74 6c  ere is too littl
2d250 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
2d260 61 67 65 20 66 6f 72 20 74 68 65 20 65 78 70 65  age for the expe
2d270 63 74 65 64 20 61 6d 6f 75 6e 74 0a 20 20 20 20  cted amount.    
2d280 2a 2a 20 6f 66 20 6c 6f 63 61 6c 20 63 6f 6e 74  ** of local cont
2d290 65 6e 74 2e 20 44 61 74 61 62 61 73 65 20 6d 75  ent. Database mu
2d2a0 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a  st be corrupt. *
2d2b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f  /.    assert( CO
2d2c0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
2d2d0 61 6d 74 20 3d 20 4d 41 58 28 30 2c 20 28 69 6e  amt = MAX(0, (in
2d2e0 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t)(pCur->pPage->
2d2f0 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d  aDataEnd - pCur-
2d300 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 29  >info.pPayload))
2d310 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20  ;.  }.  *pAmt = 
2d320 28 75 33 32 29 61 6d 74 3b 0a 20 20 72 65 74 75  (u32)amt;.  retu
2d330 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e  rn (void*)pCur->
2d340 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d  info.pPayload;.}
2d350 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
2d360 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
2d370 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
2d380 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
2d390 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
2d3a0 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
2d3b0 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
2d3c0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
2d3d0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
2d3e0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
2d3f0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
2d400 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
2d410 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
2d420 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
2d430 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
2d440 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
2d450 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
2d460 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
2d470 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
2d480 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
2d490 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
2d4a0 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
2d4b0 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
2d4c0 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
2d4d0 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
2d4e0 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
2d4f0 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
2d500 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
2d510 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
2d520 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
2d530 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
2d540 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
2d550 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
2d560 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2d570 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
2d580 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
2d590 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
2d5a0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61   *sqlite3BtreePa
2d5b0 79 6c 6f 61 64 46 65 74 63 68 28 42 74 43 75 72  yloadFetch(BtCur
2d5c0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
2d5d0 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  pAmt){.  return 
2d5e0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
2d5f0 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a  r, pAmt);.}.../*
2d600 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2d610 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65  sor down to a ne
2d620 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  w child page.  T
2d630 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d  he newPgno argum
2d640 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ent is the.** pa
2d650 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2d660 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d   child page to m
2d670 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ove to..**.** Th
2d680 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2d690 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  rns SQLITE_CORRU
2d6a0 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68  PT if the page-h
2d6b0 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c  eader flags fiel
2d6c0 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  d of.** the new 
2d6d0 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20  child page does 
2d6e0 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c  not match the fl
2d6f0 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ags field of the
2d700 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a   parent (i.e..**
2d710 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61   if an intkey pa
2d720 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ge appears to be
2d730 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61   the parent of a
2d740 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65   non-intkey page
2d750 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72  , or.** vice-ver
2d760 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sa)..*/.static i
2d770 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42  nt moveToChild(B
2d780 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
2d790 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42  32 newPgno){.  B
2d7a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2d7b0 43 75 72 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  Cur->pBt;.  int 
2d7c0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
2d7d0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2d7e0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2d7f0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2d800 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2d810 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2d820 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
2d830 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
2d840 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2d850 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28  Page>=0 );.  if(
2d860 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42   pCur->iPage>=(B
2d870 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
2d880 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  H-1) ){.    retu
2d890 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2d8a0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43  T_BKPT;.  }.  pC
2d8b0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2d8c0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2d8d0 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2d8e0 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2d8f0 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72  lidOvfl);.  pCur
2d900 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2d910 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 69 78 3b  age] = pCur->ix;
2d920 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  .  pCur->apPage[
2d930 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
2d940 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43  Cur->pPage;.  pC
2d950 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43  ur->ix = 0;.  pC
2d960 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 72  ur->iPage++;.  r
2d970 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
2d980 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
2d990 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 0a 20   &pCur->pPage,. 
2d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9b0 20 20 20 20 20 20 20 70 43 75 72 2c 20 70 43 75         pCur, pCu
2d9c0 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
2d9d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2d9e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 65  ITE_OK ){.    se
2d9f0 74 4d 65 6d 70 61 67 65 52 6f 6f 74 28 70 43 75  tMempageRoot(pCu
2da00 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  r->pPage, pCur->
2da10 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 7d 0a 20  pgnoRoot);.  }. 
2da20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
2da30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2da40 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50  UG./*.** Page pP
2da50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
2da60 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
2da70 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
2da80 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
2da90 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
2daa0 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
2dab0 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
2dac0 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
2dad0 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
2dae0 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
2daf0 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
2db00 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
2db10 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
2db20 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
2db30 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
2db40 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
2db50 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
2db60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2db70 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
2db80 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
2db90 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
2dba0 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
2dbb0 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
2dbc0 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
2dbd0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74   conditions test
2dbe0 65 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e  ed below might n
2dbf0 6f 74 20 62 65 20 74 72 75 65 0a 20 20 20 20 20  ot be true.     
2dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc10 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63         ** in a c
2dc20 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
2dc30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  */.  assert( iId
2dc40 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
2dc50 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
2dc60 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
2dc70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
2dc80 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
2dc90 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2dca0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
2dcb0 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
2dcc0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
2dcd0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2dce0 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
2dcf0 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
2dd00 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
2dd10 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
2dd20 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
2dd30 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
2dd40 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
2dd50 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2dd60 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
2dd70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
2dd80 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
2dd90 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
2dda0 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
2ddb0 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
2ddc0 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
2ddd0 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
2dde0 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
2ddf0 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
2de00 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
2de10 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
2de20 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
2de30 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
2de40 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65  static void move
2de50 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
2de60 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
2de70 61 67 65 20 2a 70 4c 65 61 66 3b 0a 20 20 61 73  age *pLeaf;.  as
2de80 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2de90 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2dea0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2deb0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2dec0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2ded0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
2dee0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2def0 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
2df00 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
2df10 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
2df20 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
2df30 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
2df40 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2df50 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
2df60 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 3b  pPage->pgno.  );
2df70 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75  .  testcase( pCu
2df80 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2df90 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e  Page-1] > pCur->
2dfa0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2dfb0 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  ge-1]->nCell );.
2dfc0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2dfd0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
2dfe0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2dff0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2e000 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
2e010 70 43 75 72 2d 3e 69 78 20 3d 20 70 43 75 72 2d  pCur->ix = pCur-
2e020 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2e030 67 65 2d 31 5d 3b 0a 20 20 70 4c 65 61 66 20 3d  ge-1];.  pLeaf =
2e040 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2e050 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43  pCur->pPage = pC
2e060 75 72 2d 3e 61 70 50 61 67 65 5b 2d 2d 70 43 75  ur->apPage[--pCu
2e070 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 72 65 6c  r->iPage];.  rel
2e080 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
2e090 70 4c 65 61 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pLeaf);.}../*.**
2e0a0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2e0b0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
2e0c0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74   root page of it
2e0d0 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  s b-tree structu
2e0e0 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
2e0f0 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72   table has a vir
2e100 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20  tual root page, 
2e110 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
2e120 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e  is moved to poin
2e130 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74  t.** to the virt
2e140 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ual root page in
2e150 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74  stead of the act
2e160 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41  ual root page. A
2e170 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20   table has a.** 
2e180 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
2e190 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61  e when the actua
2e1a0 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74  l root page cont
2e1b0 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e  ains no cells an
2e1c0 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63  d a .** single c
2e1d0 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20  hild page. This 
2e1e0 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
2e1f0 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72  with the table r
2e200 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e  ooted at page 1.
2e210 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d  .**.** If the b-
2e220 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
2e230 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72  s empty, the cur
2e240 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74  sor state is set
2e250 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49   to .** CURSOR_I
2e260 4e 56 41 4c 49 44 20 61 6e 64 20 74 68 69 73 20  NVALID and this 
2e270 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2e280 53 51 4c 49 54 45 5f 45 4d 50 54 59 2e 20 4f 74  SQLITE_EMPTY. Ot
2e290 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68 65 20  herwise,.** the 
2e2a0 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f  cursor is set to
2e2b0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
2e2c0 72 73 74 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64  rst cell located
2e2d0 20 6f 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20   on the root.** 
2e2e0 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  (or virtual root
2e2f0 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63  ) page and the c
2e300 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73  ursor state is s
2e310 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c  et to CURSOR_VAL
2e320 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ID..**.** If thi
2e330 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2e340 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ns successfully,
2e350 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d   it may be assum
2e360 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70  ed that the.** p
2e370 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73  age-header flags
2e380 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
2e390 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f  he [virtual] roo
2e3a0 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78  t-page is the ex
2e3b0 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20  pected .** kind 
2e3c0 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28  of b-tree page (
2e3d0 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65  i.e. if when ope
2e3e0 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
2e3f0 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e  the caller did n
2e400 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20  ot.** specify a 
2e410 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
2e420 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
2e430 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20   is set to 0x05 
2e440 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69  or 0x0D,.** indi
2e450 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62  cating a table b
2e460 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65  -tree, or if the
2e470 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63   caller did spec
2e480 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a  ify a KeyInfo .*
2e490 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  * structure the 
2e4a0 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
2e4b0 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30  t to 0x02 or 0x0
2e4c0 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e  A, indicating an
2e4d0 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65   index.** b-tree
2e4e0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
2e4f0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
2e500 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
2e510 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
2e520 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2e530 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
2e540 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2e550 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2e560 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56  sert( CURSOR_INV
2e570 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45  ALID < CURSOR_RE
2e580 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
2e590 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
2e5a0 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52  LID   < CURSOR_R
2e5b0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
2e5c0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46  assert( CURSOR_F
2e5d0 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f  AULT   > CURSOR_
2e5e0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
2e5f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2e600 53 74 61 74 65 20 3c 20 43 55 52 53 4f 52 5f 52  State < CURSOR_R
2e610 45 51 55 49 52 45 53 45 45 4b 20 7c 7c 20 70 43  EQUIRESEEK || pC
2e620 75 72 2d 3e 69 50 61 67 65 3c 30 20 29 3b 0a 20  ur->iPage<0 );. 
2e630 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2e640 67 6e 6f 52 6f 6f 74 3e 30 20 7c 7c 20 70 43 75  gnoRoot>0 || pCu
2e650 72 2d 3e 69 50 61 67 65 3c 30 20 29 3b 0a 0a 20  r->iPage<0 );.. 
2e660 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2e670 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  >=0 ){.    if( p
2e680 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20  Cur->iPage ){.  
2e690 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e      releasePageN
2e6a0 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 70 50 61  otNull(pCur->pPa
2e6b0 67 65 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ge);.      while
2e6c0 28 20 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65 20  ( --pCur->iPage 
2e6d0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2e6e0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43  sePageNotNull(pC
2e6f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2e700 3e 69 50 61 67 65 5d 29 3b 0a 20 20 20 20 20 20  >iPage]);.      
2e710 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  }.      pCur->pP
2e720 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2e730 67 65 5b 30 5d 3b 0a 20 20 20 20 20 20 67 6f 74  ge[0];.      got
2e740 6f 20 73 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20  o skip_init;.   
2e750 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
2e760 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
2e770 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
2e780 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2e790 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72  VALID;.    retur
2e7a0 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a  n SQLITE_EMPTY;.
2e7b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
2e7c0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
2e7d0 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 69 66  ==(-1) );.    if
2e7e0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
2e7f0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2e800 45 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  EK ){.      if( 
2e810 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2e820 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
2e830 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2e840 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
2e850 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
2e860 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
2e870 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  skipNext;.      
2e880 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
2e890 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
2e8a0 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
2e8b0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
2e8c0 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65  Page(pCur->pBtre
2e8d0 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  e->pBt, pCur->pg
2e8e0 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70  noRoot, &pCur->p
2e8f0 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Page,.          
2e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
2e910 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46   pCur->curPagerF
2e920 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72  lags);.    if( r
2e930 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e940 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2e950 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2e960 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
2e970 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2e980 73 65 74 4d 65 6d 70 61 67 65 52 6f 6f 74 28 70  setMempageRoot(p
2e990 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72  Cur->pPage, pCur
2e9a0 2d 3e 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20  ->pgnoRoot);.   
2e9b0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
2e9c0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 49  ;.    pCur->curI
2e9d0 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e 70 50  ntKey = pCur->pP
2e9e0 61 67 65 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d  age->intKey;.  }
2e9f0 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
2ea00 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
2ea10 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  ( pRoot->pgno==p
2ea20 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b  Cur->pgnoRoot );
2ea30 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e  ..  /* If pCur->
2ea40 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20  pKeyInfo is not 
2ea50 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63  NULL, then the c
2ea60 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65  aller that opene
2ea70 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20  d this cursor.  
2ea80 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f  ** expected to o
2ea90 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64  pen it on an ind
2eaa0 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72  ex b-tree. Other
2eab0 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66  wise, if pKeyInf
2eac0 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20  o is.  ** NULL, 
2ead0 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63  the caller expec
2eae0 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ts a table b-tre
2eaf0 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  e. If this is no
2eb00 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a  t the case,.  **
2eb10 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
2eb20 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e  E_CORRUPT error.
2eb30 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c   .  **.  ** Earl
2eb40 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ier versions of 
2eb50 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74  SQLite assumed t
2eb60 68 61 74 20 74 68 69 73 20 74 65 73 74 20 63 6f  hat this test co
2eb70 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a  uld not fail.  *
2eb80 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61  * if the root pa
2eb90 67 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c  ge was already l
2eba0 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69 73 20  oaded when this 
2ebb0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
2ebc0 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69  led (i.e..  ** i
2ebd0 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  f pCur->iPage>=0
2ebe0 29 2e 20 42 75 74 20 74 68 69 73 20 69 73 20 6e  ). But this is n
2ebf0 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64 61 74  ot so if the dat
2ec00 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
2ec10 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68  ed .  ** in such
2ec20 20 61 20 77 61 79 20 74 68 61 74 20 70 61 67 65   a way that page
2ec30 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64   pRoot is linked
2ec40 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62   into a second b
2ec50 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a  -tree table .  *
2ec60 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69  * (or the freeli
2ec70 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  st).  */.  asser
2ec80 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  t( pRoot->intKey
2ec90 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e  ==1 || pRoot->in
2eca0 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28  tKey==0 );.  if(
2ecb0 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d   pRoot->isInit==
2ecc0 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79  0 || (pCur->pKey
2ecd0 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d  Info==0)!=pRoot-
2ece0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72  >intKey ){.    r
2ecf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2ed00 52 55 50 54 5f 50 41 47 45 28 70 43 75 72 2d 3e  RUPT_PAGE(pCur->
2ed10 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 73 6b 69  pPage);.  }..ski
2ed20 70 5f 69 6e 69 74 3a 20 20 0a 20 20 70 43 75 72  p_init:  .  pCur
2ed30 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72  ->ix = 0;.  pCur
2ed40 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2ed50 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
2ed60 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c  gs &= ~(BTCF_AtL
2ed70 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  ast|BTCF_ValidNK
2ed80 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2ed90 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70  l);..  pRoot = p
2eda0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66  Cur->pPage;.  if
2edb0 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ( pRoot->nCell>0
2edc0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
2edd0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2ede0 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LID;.  }else if(
2edf0 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
2ee00 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
2ee10 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
2ee20 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
2ee30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2ee40 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70  T_BKPT;.    subp
2ee50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2ee60 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
2ee70 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
2ee80 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
2ee90 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2eea0 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
2eeb0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
2eec0 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
2eed0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
2eee0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2eef0 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  LID;.    rc = SQ
2ef00 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a  LITE_EMPTY;.  }.
2ef10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ef20 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
2ef30 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
2ef40 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
2ef50 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2ef60 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
2ef70 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
2ef80 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
2ef90 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
2efa0 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
2efb0 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
2efc0 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
2efd0 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
2efe0 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
2eff0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
2f000 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
2f010 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
2f020 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
2f030 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
2f040 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
2f050 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2f060 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2f070 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2f080 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2f090 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2f0a0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2f0b0 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
2f0c0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e  = pCur->pPage)->
2f0d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
2f0e0 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61  rt( pCur->ix<pPa
2f0f0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
2f100 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
2f110 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2f120 20 70 43 75 72 2d 3e 69 78 29 29 3b 0a 20 20 20   pCur->ix));.   
2f130 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2f140 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
2f150 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2f160 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
2f170 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
2f180 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2f190 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
2f1a0 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
2f1b0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
2f1c0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
2f1d0 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
2f1e0 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
2f1f0 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
2f200 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
2f210 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
2f220 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
2f230 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
2f240 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
2f250 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
2f260 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
2f270 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
2f280 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
2f290 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2f2a0 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
2f2b0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
2f2c0 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
2f2d0 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
2f2e0 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
2f2f0 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
2f300 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
2f310 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
2f320 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
2f330 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
2f340 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
2f350 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2f360 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2f370 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
2f380 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2f390 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2f3a0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2f3b0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2f3c0 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50  );.  while( !(pP
2f3d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2f3e0 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  e)->leaf ){.    
2f3f0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
2f400 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2f410 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2f420 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78  ]);.    pCur->ix
2f430 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
2f440 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2f450 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
2f460 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2f470 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2f480 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61 67   pCur->ix = pPag
2f490 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73  e->nCell-1;.  as
2f4a0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2f4b0 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61  .nSize==0 );.  a
2f4c0 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2f4d0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2f4e0 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20  lidNKey)==0 );. 
2f4f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f500 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  K;.}../* Move th
2f510 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2f520 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
2f530 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
2f540 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
2f550 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
2f560 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
2f570 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
2f580 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
2f590 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
2f5a0 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
2f5b0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
2f5c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2f5d0 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72  BtreeFirst(BtCur
2f5e0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2f5f0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
2f600 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2f610 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2f620 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2f630 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2f640 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2f650 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2f660 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
2f670 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
2f680 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2f690 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2f6a0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  r->pPage->nCell>
2f6b0 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  0 );.    *pRes =
2f6c0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76   0;.    rc = mov
2f6d0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2f6e0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  );.  }else if( r
2f6f0 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20  c==SQLITE_EMPTY 
2f700 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2f710 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
2f720 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d   || pCur->pPage-
2f730 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2f740 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2f750 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2f760 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2f770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2f780 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2f790 6f 70 20 69 66 20 63 75 72 73 6f 72 20 70 43 75  op if cursor pCu
2f7a0 72 20 64 6f 65 73 20 6e 6f 74 20 70 6f 69 6e 74  r does not point
2f7b0 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 2e   to a valid row.
2f7c0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
2f7d0 66 20 70 43 75 72 20 69 73 20 76 61 6c 69 64 2c  f pCur is valid,
2f7e0 20 63 6f 6e 66 69 67 75 72 65 20 69 74 20 73 6f   configure it so
2f7f0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 63   that the next c
2f800 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  all to.** sqlite
2f810 33 42 74 72 65 65 4e 65 78 74 28 29 20 69 73 20  3BtreeNext() is 
2f820 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e  a no-op..*/.#ifn
2f830 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f840 57 49 4e 44 4f 57 46 55 4e 43 0a 76 6f 69 64 20  WINDOWFUNC.void 
2f850 73 71 6c 69 74 65 33 42 74 72 65 65 53 6b 69 70  sqlite3BtreeSkip
2f860 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
2f870 43 75 72 29 7b 0a 20 20 2f 2a 20 57 65 20 62 65  Cur){.  /* We be
2f880 6c 69 65 76 65 20 74 68 61 74 20 74 68 65 20 63  lieve that the c
2f890 75 72 73 6f 72 20 6d 75 73 74 20 61 6c 77 61 79  ursor must alway
2f8a0 73 20 62 65 20 69 6e 20 74 68 65 20 76 61 6c 69  s be in the vali
2f8b0 64 20 73 74 61 74 65 20 77 68 65 6e 0a 20 20 2a  d state when.  *
2f8c0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
2f8d0 73 20 63 61 6c 6c 65 64 2c 20 62 75 74 20 74 68  s called, but th
2f8e0 65 20 70 72 6f 6f 66 20 69 73 20 64 69 66 66 69  e proof is diffi
2f8f0 63 75 6c 74 2c 20 73 6f 20 77 65 20 61 64 64 20  cult, so we add 
2f900 61 6e 0a 20 20 2a 2a 20 41 4c 57 61 59 53 28 29  an.  ** ALWaYS()
2f910 20 74 65 73 74 20 6a 75 73 74 20 69 6e 20 63 61   test just in ca
2f920 73 65 20 77 65 20 61 72 65 20 77 72 6f 6e 67 2e  se we are wrong.
2f930 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
2f940 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43  (pCur->eState==C
2f950 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a  URSOR_VALID) ){.
2f960 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2f970 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45   = CURSOR_SKIPNE
2f980 58 54 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b  XT;.    pCur->sk
2f990 69 70 4e 65 78 74 20 3d 20 31 3b 0a 20 20 7d 0a  ipNext = 1;.  }.
2f9a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2f9b0 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
2f9c0 4e 43 20 2a 2f 0a 0a 2f 2a 20 4d 6f 76 65 20 74  NC */../* Move t
2f9d0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2f9e0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2f9f0 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
2fa00 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
2fa10 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
2fa20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
2fa30 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
2fa40 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
2fa50 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
2fa60 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
2fa70 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
2fa80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2fa90 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
2faa0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2fab0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
2fac0 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73   .  assert( curs
2fad0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2fae0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2faf0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2fb00 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2fb10 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2fb20 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
2fb30 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69  rsor already poi
2fb40 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
2fb50 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61  entry, this is a
2fb60 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
2fb70 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
2fb80 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28  Cur->eState && (
2fb90 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2fba0 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
2fbb0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
2fbc0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54  E_DEBUG.    /* T
2fbd0 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
2fbe0 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
2fbf0 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61  t the cursor rea
2fc00 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a  lly does point .
2fc10 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61      ** to the la
2fc20 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2fc30 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69  b-tree. */.    i
2fc40 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69  nt ii;.    for(i
2fc50 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50  i=0; ii<pCur->iP
2fc60 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
2fc70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2fc80 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d  aiIdx[ii]==pCur-
2fc90 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65  >apPage[ii]->nCe
2fca0 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll );.    }.    
2fcb0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
2fcc0 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ==pCur->pPage->n
2fcd0 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73  Cell-1 );.    as
2fce0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
2fcf0 65 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69  e->leaf );.#endi
2fd00 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
2fd10 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
2fd20 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
2fd30 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
2fd40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fd50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2fd60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2fd70 4c 49 44 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  LID );.    *pRes
2fd80 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
2fd90 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
2fda0 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2fdb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2fdc0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
2fdd0 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61  ags |= BTCF_AtLa
2fde0 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  st;.    }else{. 
2fdf0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
2fe00 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c  ags &= ~BTCF_AtL
2fe10 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ast;.    }.  }el
2fe20 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
2fe30 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 61  E_EMPTY ){.    a
2fe40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
2fe50 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
2fe60 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
2fe70 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  0 );.    *pRes =
2fe80 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   1;.    rc = SQL
2fe90 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
2fea0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
2feb0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
2fec0 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
2fed0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
2fee0 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
2fef0 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b  ecified by pIdxK
2ff00 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20  ey or intKey.   
2ff10 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
2ff20 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
2ff30 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
2ff40 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d  the intKey param
2ff50 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
2ff60 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20  IdxKey .** must 
2ff70 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e  be NULL.  For in
2ff80 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78  dex tables, pIdx
2ff90 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20  Key is used and 
2ffa0 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e  intKey.** is ign
2ffb0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ored..**.** If a
2ffc0 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
2ffd0 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
2ffe0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
2fff0 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f  lways.** left po
30000 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66  inting at a leaf
30010 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c   page which woul
30020 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79  d hold the entry
30030 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70   if it.** were p
30040 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72  resent.  The cur
30050 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  sor might point 
30060 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  to an entry that
30070 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65   comes.** before
30080 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65   or after the ke
30090 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65  y..**.** An inte
300a0 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  ger is written i
300b0 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20  nto *pRes which 
300c0 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  is the result of
300d0 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  .** comparing th
300e0 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65  e key with the e
300f0 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68  ntry to which th
30100 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20  e cursor is .** 
30110 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d  pointing.  The m
30120 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  eaning of the in
30130 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e  teger written in
30140 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61  to.** *pRes is a
30150 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
30160 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
30170 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
30180 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
30190 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
301a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
301b0 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
301c0 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
301d0 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  y or if the tabl
301e0 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20  e is empty.**   
301f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
30200 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  nd the cursor is
30210 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20   therefore left 
30220 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67  point to nothing
30230 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
30240 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72  s==0     The cur
30250 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
30260 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
30270 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
30280 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c            exactl
30290 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79  y matches intKey
302a0 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
302b0 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20      *pRes>0     
302c0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
302d0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
302e0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
302f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30300 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e    is larger than
30310 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
30320 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78  .**.** For index
30330 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70 49 64   tables, the pId
30340 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66 69 65  xKey->eqSeen fie
30350 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31 20 69  ld is set to 1 i
30360 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73 74  f there.** exist
30370 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  s an entry in th
30380 65 20 74 61 62 6c 65 20 74 68 61 74 20 65 78 61  e table that exa
30390 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 49 64  ctly matches pId
303a0 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73  xKey.  .*/.int s
303b0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
303c0 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43  oUnpacked(.  BtC
303d0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
303e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
303f0 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
30400 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
30410 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a  ord *pIdxKey, /*
30420 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
30430 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74  key */.  i64 int
30440 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
30450 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b    /* The table k
30460 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  ey */.  int bias
30470 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
30480 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
30490 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
304a0 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
304b0 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
304c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
304d0 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
304e0 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
304f0 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64  int rc;.  Record
30500 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43  Compare xRecordC
30510 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72  ompare;..  asser
30520 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
30530 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
30540 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30550 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
30560 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
30570 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
30580 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65  ( pRes );.  asse
30590 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29  rt( (pIdxKey==0)
305a0 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ==(pCur->pKeyInf
305b0 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72  o==0) );.  asser
305c0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  t( pCur->eState!
305d0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
305e0 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
305f0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 21  pCur->curIntKey!
30600 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
30610 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
30620 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
30630 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65   at the point we
30640 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a   are trying.  **
30650 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65   to move to, the
30660 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69  n just return wi
30670 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
30680 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 49  work */.  if( pI
30690 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20 70  dxKey==0.   && p
306a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
306b0 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43  SOR_VALID && (pC
306c0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
306d0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d  TCF_ValidNKey)!=
306e0 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70  0.  ){.    if( p
306f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
30700 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
30710 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
30720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30730 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
30740 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
30750 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
30760 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
30770 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61  lags & BTCF_AtLa
30780 73 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  st)!=0 ){.      
30790 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
307a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
307b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
307c0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
307d0 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 69 73  requested key is
307e0 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74   one more than t
307f0 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2c  he previous key,
30800 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74   then.      ** t
30810 72 79 20 74 6f 20 67 65 74 20 74 68 65 72 65 20  ry to get there 
30820 75 73 69 6e 67 20 73 71 6c 69 74 65 33 42 74 72  using sqlite3Btr
30830 65 65 4e 65 78 74 28 29 20 72 61 74 68 65 72 20  eeNext() rather 
30840 74 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20 20 20  than a full.    
30850 20 20 2a 2a 20 62 69 6e 61 72 79 20 73 65 61 72    ** binary sear
30860 63 68 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  ch.  This is an 
30870 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c  optimization onl
30880 79 2e 20 20 54 68 65 20 63 6f 72 72 65 63 74 20  y.  The correct 
30890 61 6e 73 77 65 72 0a 20 20 20 20 20 20 2a 2a 20  answer.      ** 
308a0 69 73 20 73 74 69 6c 6c 20 6f 62 74 61 69 6e 65  is still obtaine
308b0 64 20 77 69 74 68 6f 75 74 20 74 68 69 73 20 63  d without this c
308c0 61 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69 74 74  ase, only a litt
308d0 6c 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c 79 20  le more slowely 
308e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  */.      if( pCu
308f0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d 3d  r->info.nKey+1==
30900 69 6e 74 4b 65 79 20 26 26 20 21 70 43 75 72 2d  intKey && !pCur-
30910 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20  >skipNext ){.   
30920 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
30930 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30940 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
30950 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ur, 0);.        
30960 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30970 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
30980 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
30990 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
309a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
309b0 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
309c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
309d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
309e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
309f0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
30a00 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
30a10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30a20 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OK;.        }els
30a30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  e{.          ret
30a40 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
30a50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
30a60 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b    }..  if( pIdxK
30a70 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72  ey ){.    xRecor
30a80 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74  dCompare = sqlit
30a90 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
30aa0 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  e(pIdxKey);.    
30ab0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
30ac0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
30ad0 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  ( pIdxKey->defau
30ae0 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20  lt_rc==1 .      
30af0 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64     || pIdxKey->d
30b00 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20  efault_rc==0 .  
30b10 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
30b20 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d  y->default_rc==-
30b30 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65  1.    );.  }else
30b40 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d  {.    xRecordCom
30b50 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c  pare = 0; /* All
30b60 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67 65   keys are intege
30b70 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20  rs */.  }..  rc 
30b80 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
30b90 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
30ba0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30bb0 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20  TE_EMPTY ){.    
30bc0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
30bd0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
30be0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
30bf0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
30c00 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
30c10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30c20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
30c30 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
30c40 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
30c50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
30c60 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69  ur->pPage->isIni
30c70 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
30c80 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
30c90 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
30ca0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
30cb0 67 65 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29 3b  ge->nCell > 0 );
30cc0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
30cd0 3e 69 50 61 67 65 3d 3d 30 20 7c 7c 20 70 43 75  >iPage==0 || pCu
30ce0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
30cf0 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49  tKey==pCur->curI
30d00 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  ntKey );.  asser
30d10 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  t( pCur->curIntK
30d20 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b  ey || pIdxKey );
30d30 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
30d40 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64  int lwr, upr, id
30d50 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63  x, c;.    Pgno c
30d60 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
30d70 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
30d80 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 75 38 20  ->pPage;.    u8 
30d90 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pCell;         
30da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30db0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
30dc0 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70  urrent cell in p
30dd0 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  Page */..    /* 
30de0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73  pPage->nCell mus
30df0 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
30e00 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20  n zero. If this 
30e10 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  is the root-page
30e20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
30e30 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  or would have be
30e40 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65  en INVALID above
30e50 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b   and this for(;;
30e60 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f  ) loop.    ** no
30e70 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69  t run. If this i
30e80 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70  s not the root-p
30e90 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f  age, then the mo
30ea0 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74  veToChild() rout
30eb0 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ine.    ** would
30ec0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65   have already de
30ed0 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70  tected db corrup
30ee0 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  tion. Similarly,
30ef0 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20   pPage must.    
30f00 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20  ** be the right 
30f10 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74  kind (index or t
30f20 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20  able) of b-tree 
30f30 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  page. Otherwise.
30f40 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43      ** a moveToC
30f50 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f  hild() or moveTo
30f60 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c  Root() call woul
30f70 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
30f80 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
30f90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
30fa0 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
30fb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
30fc0 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65  >intKey==(pIdxKe
30fd0 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72  y==0) );.    lwr
30fe0 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
30ff0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
31000 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73      assert( bias
31010 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73  Right==0 || bias
31020 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20  Right==1 );.    
31030 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69  idx = upr>>(1-bi
31040 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78  asRight); /* idx
31050 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75   = biasRight ? u
31060 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32  pr : (lwr+upr)/2
31070 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69  ; */.    pCur->i
31080 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
31090 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d    if( xRecordCom
310a0 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pare==0 ){.     
310b0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
310c0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
310d0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
310e0 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
310f0 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20  pPage, idx);.   
31100 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
31110 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20  intKeyLeaf ){.  
31120 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30          while( 0
31130 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b  x80 <= *(pCell++
31140 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
31150 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67   if( pCell>=pPag
31160 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20  e->aDataEnd ){. 
31170 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
31180 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
31190 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
311a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
311b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
311c0 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
311d0 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
311e0 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
311f0 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
31200 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
31210 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
31220 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  x+1;.          i
31230 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20  f( lwr>upr ){ c 
31240 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20  = -1; break; }. 
31250 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
31260 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
31270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
31280 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
31290 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
312a0 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61   ){ c = +1; brea
312b0 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
312c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
312d0 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d  sert( nCellKey==
312e0 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  intKey );.      
312f0 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
31300 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
31310 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
31320 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
31330 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
31340 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
31350 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
31360 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
31370 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
31380 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
31390 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
313a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
313b0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
313c0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
313d0 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
313e0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  nSize = 0;.     
313f0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
31400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
31410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31420 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31430 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
31440 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
31450 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
31460 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
31470 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
31480 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20  pr)/2; */.      
31490 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
314a0 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
314b0 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20      int nCell;  
314c0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70  /* Size of the p
314d0 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74  Cell cell in byt
314e0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43  es */.        pC
314f0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61  ell = findCellPa
31500 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78  stPtr(pPage, idx
31510 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  );..        /* T
31520 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f  he maximum suppo
31530 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69  rted page-size i
31540 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54  s 65536 bytes. T
31550 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  his means that. 
31560 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61         ** the ma
31570 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
31580 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f  record bytes sto
31590 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20  red on an index 
315a0 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a  B-Tree.        *
315b0 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74  * page is less t
315c0 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20  han 16384 bytes 
315d0 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65  and may be store
315e0 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20  d as a 2-byte.  
315f0 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e        ** varint.
31600 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
31610 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74  n is used to att
31620 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61  empt to avoid pa
31630 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a  rsing .        *
31640 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  * the entire cel
31650 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f  l by checking fo
31660 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72  r the cases wher
31670 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  e the record is 
31680 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
31690 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68  ed entirely with
316a0 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  in the b-tree pa
316b0 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67  ge by inspecting
316c0 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
316d0 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f      ** 2 bytes o
316e0 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20  f the cell..    
316f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e      */.        n
31700 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b  Cell = pCell[0];
31710 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
31720 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62  ll<=pPage->max1b
31730 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  ytePayload ){.  
31740 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
31750 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74  branch runs if t
31760 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
31770 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c  ield of the cell
31780 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20   is a.          
31790 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76  ** single byte v
317a0 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
317b0 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65  cord fits entire
317c0 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20  ly on the main. 
317d0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72           ** b-tr
317e0 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
317f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
31800 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d   pCell+nCell+1==
31810 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
31820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
31830 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
31840 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
31850 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79  Cell[1], pIdxKey
31860 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
31870 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20   if( !(pCell[1] 
31880 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20  & 0x80) .       
31890 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28     && (nCell = (
318a0 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29  (nCell&0x7f)<<7)
318b0 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50   + pCell[1])<=pP
318c0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20  age->maxLocal.  
318d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
318e0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
318f0 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
31900 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
31910 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
31920 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
31930 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
31940 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
31950 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
31960 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
31970 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d  +nCell+2==pPage-
31980 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
31990 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
319a0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
319b0 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32   (void*)&pCell[2
319c0 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
319d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
319e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
319f0 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f  ord flows over o
31a00 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
31a10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
31a20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  In.          ** 
31a30 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68  this case the wh
31a40 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74  ole cell needs t
31a50 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62  o be parsed, a b
31a60 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  uffer allocated.
31a70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
31a80 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
31a90 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76   used to retriev
31aa0 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74  e the record int
31ab0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  o the.          
31ac0 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  ** buffer before
31ad0 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
31ae0 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c  re() can be call
31af0 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ed. .          *
31b00 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
31b10 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
31b20 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52 65  corrupt, the xRe
31b30 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74  cordCompare rout
31b40 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20  ine may read.   
31b50 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20         ** up to 
31b60 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74  two varints past
31b70 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
31b80 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61  buffer. An extra
31b90 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a   18 .          *
31ba0 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  * bytes of paddi
31bb0 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ng is allocated 
31bc0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
31bd0 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20  e buffer in.    
31be0 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68        ** case th
31bf0 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a  is happens.  */.
31c00 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
31c10 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
31c20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
31c30 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
31c40 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
31c50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
31c60 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
31c70 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
31c80 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
31c90 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
31ca0 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
31cb0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
31cc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
31cd0 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20  nCell<0 );   /* 
31ce0 54 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a 65  True if key size
31cf0 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65   is 2^32 or more
31d00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
31d10 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30  stcase( nCell==0
31d20 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
31d30 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
31d40 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20 20  0x80 0x00 */.   
31d50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
31d60 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a   nCell==1 );  /*
31d70 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a   Invalid key siz
31d80 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78  e:  0x80 0x80 0x
31d90 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  01 */.          
31da0 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d  testcase( nCell=
31db0 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =2 );  /* Minimu
31dc0 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b 65  m legal index ke
31dd0 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  y size */.      
31de0 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20      if( nCell<2 
31df0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
31e00 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
31e10 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
31e20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
31e30 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
31e40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31e50 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
31e60 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
31e70 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20  nCell+18 );.    
31e80 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
31e90 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
31ea0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31eb0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
31ec0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
31ed0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
31ee0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31ef0 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
31f00 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
31f10 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
31f20 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43  load(pCur, 0, nC
31f30 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ell, (unsigned c
31f40 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30  har*)pCellKey, 0
31f50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  );.          pCu
31f60 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
31f70 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a  BTCF_ValidOvfl;.
31f80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
31f90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31fa0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
31fb0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
31fc0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
31fd0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
31fe0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20    }.          c 
31ff0 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
32000 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79  (nCell, pCellKey
32010 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
32020 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
32030 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
32040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32050 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 20  assert( .       
32060 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65       (pIdxKey->e
32070 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43  rrCode!=SQLITE_C
32080 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a  ORRUPT || c==0).
32090 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49 64           && (pId
320a0 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
320b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70  QLITE_NOMEM || p
320c0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
320d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20  >mallocFailed). 
320e0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
320f0 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
32100 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
32110 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  +1;.        }els
32120 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20  e if( c>0 ){.   
32130 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78         upr = idx
32140 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
32150 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
32160 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20  ert( c==0 );.   
32170 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
32180 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
32190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
321a0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d        pCur->ix =
321b0 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
321c0 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79       if( pIdxKey
321d0 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d  ->errCode ) rc =
321e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
321f0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
32200 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
32210 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sh;.        }.  
32220 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
32230 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
32240 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75     assert( lwr+u
32250 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr>=0 );.       
32260 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
32270 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28  >>1;  /* idx = (
32280 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20  lwr+upr)/2 */.  
32290 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
322a0 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
322b0 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e  +1 || (pPage->in
322c0 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
322d0 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73  leaf) );.    ass
322e0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
322f0 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
32300 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
32310 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
32320 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  >ix<pCur->pPage-
32330 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
32340 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
32350 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  idx;.      *pRes
32360 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
32370 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
32380 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
32390 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65  nish;.    }.move
323a0 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20  to_next_layer:. 
323b0 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67     if( lwr>=pPag
323c0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
323d0 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
323e0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
323f0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
32400 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
32410 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
32420 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
32430 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
32440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
32450 2d 3e 69 78 20 3d 20 28 75 31 36 29 6c 77 72 3b  ->ix = (u16)lwr;
32460 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
32470 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
32480 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
32490 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76  ) break;.  }.mov
324a0 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43  eto_finish:.  pC
324b0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
324c0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   0;.  assert( (p
324d0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
324e0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
324f0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
32500 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
32510 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
32520 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
32530 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
32540 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
32550 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
32560 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
32570 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
32580 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
32590 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
325a0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
325b0 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
325c0 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
325d0 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
325e0 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
325f0 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
32600 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
32610 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
32620 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
32630 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
32640 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
32650 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
32660 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
32670 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
32680 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
32690 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
326a0 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
326b0 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
326c0 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
326d0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
326e0 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
326f0 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
32700 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
32710 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
32720 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
32730 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  te);.}../*.** Re
32740 74 75 72 6e 20 61 6e 20 65 73 74 69 6d 61 74 65  turn an estimate
32750 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20   for the number 
32760 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
32770 61 62 6c 65 20 74 68 61 74 20 70 43 75 72 20 69  able that pCur i
32780 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f  s.** pointing to
32790 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
327a0 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6e  tive number if n
327b0 6f 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 75  o estimate is cu
327c0 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 61 76 61 69  rrently .** avai
327d0 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73 71  lable..*/.i64 sq
327e0 6c 69 74 65 33 42 74 72 65 65 52 6f 77 43 6f 75  lite3BtreeRowCou
327f0 6e 74 45 73 74 28 42 74 43 75 72 73 6f 72 20 2a  ntEst(BtCursor *
32800 70 43 75 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a  pCur){.  i64 n;.
32810 20 20 75 38 20 69 3b 0a 0a 20 20 61 73 73 65 72    u8 i;..  asser
32820 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
32830 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
32840 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
32850 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
32860 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
32870 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 75  tex) );..  /* Cu
32880 72 72 65 6e 74 6c 79 20 74 68 69 73 20 69 6e 74  rrently this int
32890 65 72 66 61 63 65 20 69 73 20 6f 6e 6c 79 20 63  erface is only c
328a0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 4f 50 5f  alled by the OP_
328b0 49 66 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f  IfSmaller.  ** o
328c0 70 63 6f 64 65 2c 20 61 6e 64 20 69 74 20 74 68  pcode, and it th
328d0 61 74 20 63 61 73 65 20 74 68 65 20 63 75 72 73  at case the curs
328e0 6f 72 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  or will always b
328f0 65 20 76 61 6c 69 64 20 61 6e 64 0a 20 20 2a 2a  e valid and.  **
32900 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f 69   will always poi
32910 6e 74 20 74 6f 20 61 20 6c 65 61 66 20 6e 6f 64  nt to a leaf nod
32920 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  e. */.  if( NEVE
32930 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  R(pCur->eState!=
32940 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 20  CURSOR_VALID) ) 
32950 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66 28  return -1;.  if(
32960 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 70 50 61   NEVER(pCur->pPa
32970 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 20 29 20 72  ge->leaf==0) ) r
32980 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 6e 20 3d  eturn -1;..  n =
32990 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
329a0 65 6c 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ell;.  for(i=0; 
329b0 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
329c0 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a 3d 20 70 43  ++){.    n *= pC
329d0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 6e  ur->apPage[i]->n
329e0 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Cell;.  }.  retu
329f0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn n;.}../*.** A
32a00 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
32a10 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
32a20 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
32a30 61 73 65 2e 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ase. .** Return 
32a40 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  value:.**.**    
32a50 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20  SQLITE_OK       
32a60 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20 20 53   success.**    S
32a70 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 20 20 20  QLITE_DONE      
32a80 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
32a90 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  y pointing at th
32aa0 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 0a 2a  e last element.*
32ab0 2a 20 20 20 20 6f 74 68 65 72 77 69 73 65 20 20  *    otherwise  
32ac0 20 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20        some kind 
32ad0 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  of error occurre
32ae0 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  d.**.** The main
32af0 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20   entry point is 
32b00 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
32b10 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e  ().  That routin
32b20 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a  e is optimized.*
32b30 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  * for the common
32b40 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20   case of merely 
32b50 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
32b60 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74   cell counter Bt
32b70 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20  Cursor.aiIdx.** 
32b80 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c  to the next cell
32b90 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
32ba0 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
32bb0 65 72 29 20 62 74 72 65 65 4e 65 78 74 28 29 20  er) btreeNext() 
32bc0 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e  helper.** routin
32bd0 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
32be0 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
32bf0 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69   to move to a di
32c00 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a  fferent page or.
32c10 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
32c20 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e cursor..**.** 
32c30 49 66 20 62 69 74 20 30 78 30 31 20 6f 66 20 74  If bit 0x01 of t
32c40 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20 69 6e  he F argument in
32c50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
32c60 74 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68 65  t(C,F) is 1, the
32c70 6e 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  n the.** cursor 
32c80 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
32c90 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20  n SQL index and 
32ca0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
32cb0 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  ld have been.** 
32cc0 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 53  skipped if the S
32cd0 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
32ce0 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  n a unique index
32cf0 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d 65 6e  .  The F argumen
32d00 74 0a 2a 2a 20 69 73 20 61 20 68 69 6e 74 20 74  t.** is a hint t
32d10 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e  o the implement.
32d20 20 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69    SQLite btree i
32d30 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
32d40 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 74 68  es not use.** th
32d50 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d  is hint, but COM
32d60 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61  DB2 does..*/.sta
32d70 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
32d80 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78  INE int btreeNex
32d90 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
32da0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
32db0 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
32dc0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
32dd0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
32de0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
32df0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
32e00 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
32e10 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
32e20 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
32e30 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
32e40 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
32e50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
32e60 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
32e70 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
32e80 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72  =0 );.    rc = r
32e90 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
32ea0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20  tion(pCur);.    
32eb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32ec0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
32ed0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
32ee0 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
32ef0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
32f00 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
32f10 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
32f20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
32f30 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
32f40 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
32f50 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
32f60 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
32f70 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
32f80 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20  KIPNEXT );.     
32f90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
32fa0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
32fb0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
32fc0 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20  ipNext>0 ){.    
32fd0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
32fe0 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
32ff0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
33000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33010 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
33020 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
33030 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
33040 50 61 67 65 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  Page;.  idx = ++
33050 70 43 75 72 2d 3e 69 78 3b 0a 20 20 69 66 28 20  pCur->ix;.  if( 
33060 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29  !pPage->isInit )
33070 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c  {.    /* The onl
33080 79 20 6b 6e 6f 77 6e 20 77 61 79 20 66 6f 72 20  y known way for 
33090 74 68 69 73 20 74 6f 20 68 61 70 70 65 6e 20 69  this to happen i
330a0 73 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  s for there to b
330b0 65 20 61 0a 20 20 20 20 2a 2a 20 72 65 63 75 72  e a.    ** recur
330c0 73 69 76 65 20 53 51 4c 20 66 75 6e 63 74 69 6f  sive SQL functio
330d0 6e 20 74 68 61 74 20 64 6f 65 73 20 61 20 44 45  n that does a DE
330e0 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 61  LETE operation a
330f0 73 20 70 61 72 74 20 6f 66 20 61 0a 20 20 20 20  s part of a.    
33100 2a 2a 20 53 45 4c 45 43 54 20 77 68 69 63 68 20  ** SELECT which 
33110 64 65 6c 65 74 65 73 20 63 6f 6e 74 65 6e 74 20  deletes content 
33120 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 61  out from under a
33130 6e 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 0a  n active cursor.
33140 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72      ** in a corr
33150 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
33160 65 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c  e where the tabl
33170 65 20 62 65 69 6e 67 20 44 45 4c 45 54 45 2d 65  e being DELETE-e
33180 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 68 61  d from.    ** ha
33190 73 20 70 61 67 65 73 20 69 6e 20 63 6f 6d 6d 6f  s pages in commo
331a0 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  n with the table
331b0 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 2e 20   being queried. 
331c0 20 53 65 65 20 54 48 33 0a 20 20 20 20 2a 2a 20   See TH3.    ** 
331d0 6d 6f 64 75 6c 65 20 63 6f 76 31 2f 62 74 72 65  module cov1/btre
331e0 65 37 38 2e 74 65 73 74 20 74 65 73 74 63 61 73  e78.test testcas
331f0 65 20 32 32 30 20 28 32 30 31 38 2d 30 36 2d 30  e 220 (2018-06-0
33200 38 29 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  8) for an.    **
33210 20 65 78 61 6d 70 6c 65 2e 20 2a 2f 0a 20 20 20   example. */.   
33220 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
33230 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
33240 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
33250 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63  tabase file is c
33260 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f  orrupt, it is po
33270 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76  ssible for the v
33280 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a  alue of idx .  *
33290 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20  * to be invalid 
332a0 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  here. This can o
332b0 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73  nly occur if a s
332c0 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64  econd cursor mod
332d0 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70  ifies.  ** the p
332e0 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72  age while cursor
332f0 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67   pCur is holding
33300 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
33310 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20  it. Which can.  
33320 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  ** only happen i
33330 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
33340 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63  s corrupt in suc
33350 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69  h a way as to li
33360 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  nk the.  ** page
33370 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20   into more than 
33380 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  one b-tree struc
33390 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63  ture. */.  testc
333a0 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e  ase( idx>pPage->
333b0 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20  nCell );..  if( 
333c0 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
333d0 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
333e0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
333f0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
33400 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
33410 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
33420 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
33430 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
33440 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
33450 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d  ;.      return m
33460 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
33470 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  ur);.    }.    d
33480 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
33490 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
334a0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
334b0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
334c0 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
334d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
334e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
334f0 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
33500 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
33510 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
33520 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
33530 3e 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  >ix>=pPage->nCel
33540 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  l );.    if( pPa
33550 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
33560 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
33570 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
33580 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
33590 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
335a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
335b0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
335c0 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
335d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
335e0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
335f0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
33600 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e  (pCur);.  }.}.in
33610 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
33620 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
33630 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  r, int flags){. 
33640 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
33650 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
33660 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f  TER( flags );  /
33670 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32  * Used in COMDB2
33680 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20   but not native 
33690 53 51 4c 69 74 65 20 2a 2f 0a 20 20 61 73 73 65  SQLite */.  asse
336a0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
336b0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
336c0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
336d0 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29  =0 || flags==1 )
336e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
336f0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
33700 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
33710 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
33720 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
33730 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
33740 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
33750 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
33760 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69  _ValidOvfl);.  i
33770 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
33780 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20  =CURSOR_VALID ) 
33790 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74  return btreeNext
337a0 28 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20  (pCur);.  pPage 
337b0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
337c0 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 69 78   if( (++pCur->ix
337d0 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  )>=pPage->nCell 
337e0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d  ){.    pCur->ix-
337f0 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  -;.    return bt
33800 72 65 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20  reeNext(pCur);. 
33810 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
33820 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
33830 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
33840 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
33850 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
33860 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pCur);.  }.}../
33870 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
33880 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
33890 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
338a0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
338b0 74 61 62 61 73 65 2e 0a 2a 2a 20 52 65 74 75 72  tabase..** Retur
338c0 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20  n values:.**.** 
338d0 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20      SQLITE_OK   
338e0 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20 20    success.**    
338f0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 74   SQLITE_DONE   t
33900 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
33910 65 61 64 79 20 6f 6e 20 74 68 65 20 66 69 72 73  eady on the firs
33920 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  t element of the
33930 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 6f 74   table.**     ot
33940 68 65 72 77 69 73 65 20 20 20 20 20 73 6f 6d 65  herwise     some
33950 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f   kind of error o
33960 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68  ccurred.**.** Th
33970 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
33980 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
33990 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54  eePrevious().  T
339a0 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
339b0 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
339c0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
339d0 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d  of merely decrem
339e0 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
339f0 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
33a00 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
33a10 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f   previous cell o
33a20 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
33a30 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
33a40 29 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  ) btreePrevious(
33a50 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74  ).** helper rout
33a60 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
33a70 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
33a80 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
33a90 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a  different page.*
33aa0 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20  * or to restore 
33ab0 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
33ac0 2a 20 49 66 20 62 69 74 20 30 78 30 31 20 6f 66  * If bit 0x01 of
33ad0 20 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20   the F argument 
33ae0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  to sqlite3BtreeP
33af0 72 65 76 69 6f 75 73 28 43 2c 46 29 20 69 73 20  revious(C,F) is 
33b00 31 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  1, then.** the c
33b10 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64  ursor correspond
33b20 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
33b30 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  x and this routi
33b40 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
33b50 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66  en.** skipped if
33b60 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68   the SQL index h
33b70 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65  ad been a unique
33b80 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61   index.  The F a
33b90 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
33ba0 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c  hint to the impl
33bb0 65 6d 65 6e 74 2e 20 20 54 68 65 20 6e 61 74 69  ement.  The nati
33bc0 76 65 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ve SQLite btree 
33bd0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
33be0 6f 65 73 20 6e 6f 74 0a 2a 2a 20 75 73 65 20 74  oes not.** use t
33bf0 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43 4f  his hint, but CO
33c00 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74  MDB2 does..*/.st
33c10 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
33c20 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72  LINE int btreePr
33c30 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
33c40 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
33c50 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
33c60 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
33c70 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
33c80 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
33c90 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
33ca0 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
33cb0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
33cc0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
33cd0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
33ce0 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74  s & (BTCF_AtLast
33cf0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
33d00 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29  BTCF_ValidNKey))
33d10 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
33d20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
33d30 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e==0 );.  if( pC
33d40 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
33d50 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
33d60 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
33d70 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
33d80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
33d90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33da0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33db0 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
33dc0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
33dd0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
33de0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
33df0 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  NE;.    }.    if
33e00 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
33e10 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
33e20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
33e30 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
33e40 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
33e50 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
33e60 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
33e70 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
33e80 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
33e90 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29  ur->skipNext<0 )
33ea0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
33eb0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
33ec0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
33ed0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
33ee0 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
33ef0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
33f00 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
33f10 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
33f20 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
33f30 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50  nit );.  if( !pP
33f40 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
33f50 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
33f60 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  >ix;.    rc = mo
33f70 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
33f80 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
33f90 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b  l(pPage, idx)));
33fa0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
33fb0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
33fc0 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
33fd0 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
33fe0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
33ff0 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20  r->ix==0 ){.    
34000 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
34010 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
34020 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
34030 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
34040 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
34050 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
34060 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
34070 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
34080 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
34090 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
340a0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
340b0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
340c0 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4f  s & (BTCF_ValidO
340d0 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20  vfl))==0 );..   
340e0 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20   pCur->ix--;.   
340f0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
34100 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 50  Page;.    if( pP
34110 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
34120 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
34130 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34140 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
34150 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Cur, 0);.    }el
34160 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
34170 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
34180 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
34190 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
341a0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
341b0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
341c0 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
341d0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
341e0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
341f0 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
34200 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a   || flags==1 );.
34210 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
34220 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
34230 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
34240 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 55  SOR_VALID );.  U
34250 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
34260 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73   flags );  /* Us
34270 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74  ed in COMDB2 but
34280 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69   not native SQLi
34290 74 65 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 63 75  te */.  pCur->cu
342a0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
342b0 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
342c0 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
342d0 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  dNKey);.  pCur->
342e0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
342f0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
34300 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
34310 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d  .   || pCur->ix=
34320 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 70  =0.   || pCur->p
34330 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20  Page->leaf==0.  
34340 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
34350 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
34360 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  );.  }.  pCur->i
34370 78 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  x--;.  return SQ
34380 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
34390 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
343a0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
343b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
343c0 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
343d0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
343e0 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
343f0 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
34400 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
34410 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
34420 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
34430 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
34440 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
34450 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
34460 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
34470 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
34480 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
34490 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
344a0 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
344b0 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
344c0 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
344d0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
344e0 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
344f0 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
34500 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
34510 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
34520 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20  or.  *ppPage is 
34530 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74  set to NULL in t
34540 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
34550 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
34560 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
34570 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
34580 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69  then an effort i
34590 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
345a0 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
345b0 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
345c0 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
345d0 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
345e0 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
345f0 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
34600 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
34610 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
34620 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34630 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
34640 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
34650 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
34660 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
34670 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72   eMode parameter
34680 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   is BTALLOC_EXAC
34690 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79  T and the nearby
346a0 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20   page exists.** 
346b0 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
346c0 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
346d0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
346e0 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
346f0 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73    If.** eMode is
34700 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e   BTALLOC_LT then
34710 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72 6e   the page return
34720 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20  ed will be less 
34730 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
34740 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e   to nearby if an
34750 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  y such page exis
34760 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73  ts.  If eMode is
34770 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65   BTALLOC_ANY the
34780 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  n there.** are n
34790 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f  o restrictions o
347a0 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73 20  n which page is 
347b0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
347c0 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
347d0 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53  BtreePage(.  BtS
347e0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
347f0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
34800 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
34810 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20  ppPage,      /* 
34820 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f  Store pointer to
34830 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
34840 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  age here */.  Pg
34850 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20  no *pPgno,      
34860 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
34870 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65  e page number he
34880 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61  re */.  Pgno nea
34890 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rby,           /
348a0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 70  * Search for a p
348b0 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e  age near this on
348c0 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20  e */.  u8 eMode 
348d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
348e0 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20   BTALLOC_EXACT, 
348f0 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42  BTALLOC_LT, or B
34900 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b  TALLOC_ANY */.){
34910 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
34920 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e1;.  int rc;.  
34930 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 n;     /* Nu
34940 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
34950 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
34960 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a  .  u32 k;     /*
34970 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
34980 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f  s on the trunk o
34990 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  f the freelist *
349a0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
349b0 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  unk = 0;.  MemPa
349c0 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
349d0 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67   0;.  Pgno mxPag
349e0 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
349f0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
34a00 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
34a10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
34a20 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
34a30 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
34a40 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  rt( eMode==BTALL
34a50 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62  OC_ANY || (nearb
34a60 79 3e 30 20 26 26 20 52 45 51 55 49 52 45 5f 50  y>0 && REQUIRE_P
34a70 54 52 4d 41 50 20 29 20 29 3b 0a 20 20 70 50 61  TRMAP ) );.  pPa
34a80 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
34a90 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74  1;.  mxPage = bt
34aa0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
34ab0 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
34ac0 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36  -OF: R-05119-026
34ad0 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  37 The 4-byte bi
34ae0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
34af0 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20   at offset 36.  
34b00 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73  ** stores stores
34b10 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
34b20 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
34b30 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20  e freelist. */. 
34b40 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
34b50 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
34b60 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
34b70 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20  ==mxPage-1 );.  
34b80 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b  if( n>=mxPage ){
34b90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
34ba0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
34bb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  .  }..  /* Ensur
34bc0 65 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74  e page 1 is writ
34bd0 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
34be0 69 6f 6e 20 77 69 6c 6c 20 65 69 74 68 65 72 20  ion will either 
34bf0 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62 65  change the numbe
34c00 72 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65 73 20  r.  ** of pages 
34c10 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
34c20 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20   or the size of 
34c30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34c40 65 2e 20 53 69 6e 63 65 20 62 6f 74 68 0a 20 20  e. Since both.  
34c50 2a 2a 20 6f 66 20 74 68 65 73 65 20 6f 70 65 72  ** of these oper
34c60 61 74 69 6f 6e 73 20 69 6e 76 6f 6c 76 65 20 6d  ations involve m
34c70 6f 64 69 66 79 69 6e 67 20 70 61 67 65 20 31 20  odifying page 1 
34c80 68 65 61 64 65 72 20 66 69 65 6c 64 73 2c 20 70  header fields, p
34c90 61 67 65 20 31 0a 20 20 2a 2a 20 77 69 6c 6c 20  age 1.  ** will 
34ca0 64 65 66 69 6e 69 74 65 6c 79 20 62 65 20 77 72  definitely be wr
34cb0 69 74 74 65 6e 20 62 79 20 74 68 69 73 20 74 72  itten by this tr
34cc0 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
34cd0 69 73 20 69 73 20 61 6e 20 43 4f 4e 43 55 52 52  is is an CONCURR
34ce0 45 4e 54 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ENT.  ** transac
34cf0 74 69 6f 6e 2c 20 65 6e 73 75 72 65 20 74 68 65  tion, ensure the
34d00 20 42 74 72 65 65 50 74 72 6d 61 70 20 73 74 72   BtreePtrmap str
34d10 75 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 20  ucture has been 
34d20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20  allocated.  */. 
34d30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
34d40 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
34d50 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
34d60 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
34d70 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
34d80 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
34d90 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
34da0 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
34db0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
34dc0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
34dd0 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
34de0 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
34df0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
34e00 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
34e10 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
34e20 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72 63 68  .    u32 nSearch
34e30 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74   = 0;   /* Count
34e40 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
34e50 66 20 73 65 61 72 63 68 20 61 74 74 65 6d 70 74  f search attempt
34e60 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a  s */.    .    /*
34e70 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   If eMode==BTALL
34e80 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71  OC_EXACT and a q
34e90 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
34ea0 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
34eb0 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
34ec0 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
34ed0 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
34ee0 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
34ef0 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
34f00 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
34f10 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
34f20 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
34f30 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
34f40 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20  LLOC_EXACT ){.  
34f50 20 20 20 20 61 73 73 65 72 74 28 20 49 53 41 55      assert( ISAU
34f60 54 4f 56 41 43 55 55 4d 21 3d 49 53 43 4f 4e 43  TOVACUUM!=ISCONC
34f70 55 52 52 45 4e 54 20 29 3b 0a 20 20 20 20 20 20  URRENT );.      
34f80 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
34f90 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
34fa0 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
34fb0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  {.          u8 e
34fc0 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
34fd0 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
34fe0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
34ff0 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
35000 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20  acuum );.       
35010 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
35020 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
35030 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
35040 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
35050 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
35060 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
35070 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
35080 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 61  .            sea
35090 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
350a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
350b0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
350c0 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
350d0 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  st = 1;.      }.
350e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d      }else if( eM
350f0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
35100 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c  ){.      searchL
35110 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  ist = 1;.    }..
35120 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
35130 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
35140 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
35150 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
35160 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
35170 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
35180 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
35190 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
351a0 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
351b0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
351c0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
351d0 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
351e0 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
351f0 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
35200 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
35210 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
35220 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
35230 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
35240 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
35250 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
35260 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
35270 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
35280 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
35290 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
352a0 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
352b0 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f  _EXACT).    ** o
352c0 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c  r until a page l
352d0 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79  ess than 'nearby
352e0 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d  ' is located (eM
352f0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29  ode==BTALLOC_LT)
35300 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
35310 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
35320 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
35330 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
35340 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
35350 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
35360 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69  506-11053 The fi
35370 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  rst integer on a
35380 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
35390 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
353a0 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
353b0 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66  er of the next f
353c0 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
353d0 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f  ge in the list o
353e0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72  r.        ** zer
353f0 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  o if this is the
35400 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74   last freelist t
35410 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20  runk page. */.  
35420 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
35430 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
35440 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
35450 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
35460 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
35470 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37  -OF: R-59841-137
35480 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  98 The 4-byte bi
35490 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
354a0 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20   at offset 32.  
354b0 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20        ** stores 
354c0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
354d0 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
354e0 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  e of the freelis
354f0 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20  t, or zero if.  
35500 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65        ** the fre
35510 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20  elist is empty. 
35520 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
35530 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
35540 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
35550 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35560 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
35570 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
35580 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
35590 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b  age || nSearch++
355a0 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20   > n ){.        
355b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
355c0 55 50 54 5f 50 47 4e 4f 28 70 50 72 65 76 54 72  UPT_PGNO(pPrevTr
355d0 75 6e 6b 20 3f 20 70 50 72 65 76 54 72 75 6e 6b  unk ? pPrevTrunk
355e0 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20 20 20  ->pgno : 1);.   
355f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35600 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
35610 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
35620 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
35630 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
35640 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
35650 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
35660 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
35670 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
35680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
35690 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
356a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
356b0 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
356c0 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  0 );.      /* EV
356d0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35  IDENCE-OF: R-135
356e0 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63  23-04394 The sec
356f0 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  ond integer on a
35700 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
35710 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
35720 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
35730 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72  eaf page pointer
35740 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a  s to follow. */.
35750 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
35760 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
35770 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
35780 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
35790 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
357a0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
357b0 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
357c0 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
357d0 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
357e0 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
357f0 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
35800 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
35810 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
35820 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
35830 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
35840 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
35850 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
35860 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
35870 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
35880 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
35890 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
358a0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
358b0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
358c0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
358d0 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
358e0 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
358f0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
35900 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
35910 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
35920 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
35930 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
35940 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
35950 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
35960 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
35970 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
35980 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
35990 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
359a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
359b0 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
359c0 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
359d0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
359e0 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
359f0 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
35a00 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
35a10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
35a20 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
35a30 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  iTrunk);.       
35a40 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
35a50 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
35a60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
35a70 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
35a80 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
35a90 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
35aa0 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
35ab0 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
35ac0 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
35ad0 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
35ae0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
35af0 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
35b00 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
35b10 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
35b20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
35b30 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
35b40 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
35b50 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
35b60 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
35b70 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
35b80 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
35b90 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
35ba0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
35bb0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
35bc0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
35bd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
35be0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
35bf0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
35c00 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
35c10 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
35c20 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
35c30 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
35c40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
35c50 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
35c60 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
35c70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
35c80 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
35c90 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
35ca0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
35cb0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
35cc0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
35cd0 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
35ce0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
35cf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35d00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35d10 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
35d20 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
35d30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35d40 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
35d50 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
35d60 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
35d70 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
35d80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35d90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35da0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
35db0 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
35dc0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
35dd0 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
35de0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
35df0 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
35e00 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
35e10 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
35e20 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
35e30 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
35e40 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
35e50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
35e60 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
35e70 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
35e80 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
35e90 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
35ea0 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
35eb0 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
35ec0 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
35ed0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
35ee0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
35ef0 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20  GNO(iTrunk);.   
35f00 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
35f10 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
35f20 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
35f30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
35f40 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
35f50 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
35f60 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
35f70 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65  sedPage(pBt, iNe
35f80 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
35f90 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
35fa0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
35fb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
35fc0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
35fd0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
35fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
35ff0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
36000 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
36010 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
36020 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
36030 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36040 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
36050 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
36060 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
36070 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
36080 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
36090 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
360a0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
360b0 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
360c0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
360d0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
360e0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
360f0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
36100 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
36110 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
36120 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
36130 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
36140 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
36150 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
36160 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
36170 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
36180 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
36190 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
361a0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
361b0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge1->pDbPage) );
361c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
361d0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
361e0 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
361f0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
36200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
36210 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
36220 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
36230 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
36240 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
36250 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
36260 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
36270 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
36280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36290 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
362a0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
362b0 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
362c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
362d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
362e0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
362f0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
36300 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
36310 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
36320 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
36330 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
36340 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
36350 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
36360 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
36370 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
36380 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f  .        u32 clo
36390 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
363a0 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
363b0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
363c0 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
363d0 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
363e0 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
363f0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
36400 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
36410 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
36420 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
36430 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
36440 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
36450 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
36460 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d           iPage =
36470 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
36480 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20  [8+i*4]);.      
36490 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
364a0 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e<=nearby ){.   
364b0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
364c0 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
364d0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
364e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
364f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
36500 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
36510 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
36520 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
36530 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33    dist = sqlite3
36540 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
36550 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
36560 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
36570 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
36580 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
36590 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
365a0 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
365b0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
365c0 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29  +i*4]) - nearby)
365d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
365e0 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
365f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
36600 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
36610 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
36620 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
36630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
36640 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
36650 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
36660 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
36670 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
36680 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
36690 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
366a0 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
366b0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
366c0 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
366d0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
366e0 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
366f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
36700 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
36710 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  NO(iTrunk);.    
36720 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
36730 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
36740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36750 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
36760 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
36770 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
36780 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
36790 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
367a0 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
367b0 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
367c0 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
367d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
367e0 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
367f0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
36800 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
36810 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
36820 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
36830 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
36840 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
36850 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
36860 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
36870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36880 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
36890 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
368a0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
368b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
368c0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
368d0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
368e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
368f0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
36900 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
36910 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
36920 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
36930 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
36940 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
36950 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
36960 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
36970 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
36980 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
36990 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
369a0 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
369b0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
369c0 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
369d0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
369e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
369f0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
36a00 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
36a10 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
36a20 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
36a30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36a40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
36a50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
36a60 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
36a70 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
36a80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
36a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36aa0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
36ab0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
36ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
36ad0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
36ae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36af0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
36b00 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
36b10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36b20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
36b30 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
36b40 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
36b50 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
36b60 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
36b70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
36b80 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
36b90 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
36ba0 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
36bb0 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
36bc0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
36bd0 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
36be0 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
36bf0 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
36c00 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
36c10 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
36c20 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
36c30 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
36c40 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
36c50 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
36c60 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
36c70 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
36c80 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
36c90 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
36ca0 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
36cb0 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
36cc0 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
36cd0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
36ce0 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
36cf0 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
36d00 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
36d10 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
36d20 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
36d30 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
36d40 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
36d50 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
36d60 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
36d70 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
36d80 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
36d90 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
36da0 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
36db0 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
36dc0 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
36dd0 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
36de0 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
36df0 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
36e00 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
36e10 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
36e20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
36e30 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
36e40 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
36e50 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
36e60 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
36e70 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
36e80 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
36e90 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
36ea0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
36eb0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
36ec0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
36ed0 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
36ee0 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
36ef0 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
36f00 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
36f10 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
36f20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
36f30 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
36f40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
36f50 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
36f60 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
36f70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
36f80 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
36f90 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
36fa0 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
36fb0 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
36fc0 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
36fd0 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
36fe0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
36ff0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
37000 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
37010 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
37020 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
37030 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
37040 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
37050 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
37060 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
37070 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
37080 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
37090 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
370a0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
370b0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
370c0 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
370d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
370e0 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
370f0 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
37100 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
37110 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
37120 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
37130 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
37140 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
37150 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
37160 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
37170 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
37180 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
37190 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
371a0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
371b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
371c0 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
371d0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
371e0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
371f0 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
37200 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
37210 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
37220 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
37230 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
37240 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
37250 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
37260 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
37270 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
37280 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
37290 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
372a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
372b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
372c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
372d0 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
372e0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
372f0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
37300 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
37310 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
37320 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
37330 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
37340 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
37350 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
37360 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
37370 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
37380 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
37390 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
373a0 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
373b0 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
373c0 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
373d0 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
373e0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
373f0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
37400 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
37410 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
37420 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
37430 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
37440 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
37450 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
37460 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
37470 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
37480 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
37490 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
374a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
374b0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
374c0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
374d0 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
374e0 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
374f0 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
37500 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
37510 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
37520 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
37530 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
37540 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
37550 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
37560 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
37570 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
37580 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
37590 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
375a0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
375b0 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
375c0 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20  DbPage)<=1 );.  
375d0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
375e0 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67  TE_OK || (*ppPag
375f0 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  e)->isInit==0 );
37600 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
37610 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37620 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
37630 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
37640 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
37650 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
37660 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
37670 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
37680 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
37690 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
376a0 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
376b0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
376c0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
376d0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
376e0 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
376f0 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
37700 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
37710 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
37720 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
37730 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
37740 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
37750 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
37760 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
37770 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
37780 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
37790 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
377a0 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
377b0 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
377c0 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
377d0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
377e0 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
377f0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
37800 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
37810 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
37820 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
37830 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
37840 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
37850 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
37860 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
37870 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
37880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37890 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
378a0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
378b0 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
378c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
378d0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
378e0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
378f0 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
37900 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
37910 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
37920 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
37930 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
37940 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
37950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37960 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
37970 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
37980 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
37990 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
379a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379b0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
379c0 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
379d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
379f0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
37a00 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
37a10 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
37a20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
37a30 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
37a40 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
37a50 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31  PT_DB || iPage>1
37a60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
37a70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
37a80 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
37a90 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65   );..  if( iPage
37aa0 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <2 ) return SQLI
37ab0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
37ac0 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
37ad0 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
37ae0 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
37af0 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
37b00 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
37b10 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
37b20 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
37b30 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
37b40 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
37b50 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
37b60 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
37b70 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
37b80 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
37b90 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
37ba0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
37bb0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
37bc0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
37bd0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
37be0 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
37bf0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
37c00 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
37c10 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
37c20 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
37c30 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
37c40 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
37c50 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
37c60 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
37c70 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
37c80 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
37c90 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
37ca0 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
37cb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
37cc0 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
37cd0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
37ce0 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
37cf0 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
37d00 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
37d10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
37d20 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
37d30 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
37d40 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
37d50 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
37d60 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
37d70 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
37d80 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
37d90 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
37da0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
37db0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
37dc0 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
37dd0 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
37de0 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
37df0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
37e00 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
37e10 2f 0a 20 20 69 66 28 20 52 45 51 55 49 52 45 5f  /.  if( REQUIRE_
37e20 50 54 52 4d 41 50 20 29 7b 0a 20 20 20 20 70 74  PTRMAP ){.    pt
37e30 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
37e40 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
37e50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
37e60 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
37e70 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
37e80 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
37e90 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
37ea0 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
37eb0 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
37ec0 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
37ed0 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
37ee0 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
37ef0 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
37f00 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
37f10 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
37f20 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
37f30 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
37f40 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
37f50 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
37f60 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
37f70 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
37f80 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
37f90 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
37fa0 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
37fb0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
37fc0 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
37fd0 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
37fe0 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
37ff0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
38000 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
38010 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
38020 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
38030 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
38040 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
38050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
38060 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
38070 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
38080 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
38090 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
380a0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
380b0 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
380c0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
380d0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
380e0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
380f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
38100 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
38110 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
38120 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
38130 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
38140 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
38150 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
38160 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
38170 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
38180 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
38190 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
381a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
381b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
381c0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
381d0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
381e0 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
381f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
38200 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
38210 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
38220 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
38230 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
38240 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
38250 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
38260 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
38270 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
38280 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
38290 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
382a0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
382b0 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
382c0 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
382d0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
382e0 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
382f0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
38300 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
38310 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
38320 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
38330 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
38340 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
38350 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
38360 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
38370 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
38380 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
38390 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
383a0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
383b0 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
383c0 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
383d0 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
383e0 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
383f0 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
38400 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
38410 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
38420 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
38430 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
38440 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
38450 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
38460 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
38470 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
38480 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
38490 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
384a0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74