/ Hex Artifact Content
Login

Artifact 024bdefd81979042e60d7884c1f1f7c072c1869ded41f3d9bf091cccb539314d:


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 6d 65 6d 73 65 74 28 28 28 75 38       memset(((u8
76c0: 2a 29 70 4b 65 79 29 2b 70 43 75 72 2d 3e 6e 4b  *)pKey)+pCur->nK
76d0: 65 79 2c 20 30 2c 20 39 2b 38 29 3b 0a 20 20 20  ey, 0, 9+8);.   
76e0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
76f0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
7700: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
7710: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
7720: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7730: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
7740: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
7750: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
7760: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
7770: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
7780: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
7790: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
77a0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
77b0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
77c0: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
77d0: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
77e0: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
77f0: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
7800: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
7810: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
7820: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
7830: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
7840: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
7850: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
7860: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
7870: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
7880: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
7890: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
78a0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
78b0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
78c0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
78d0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
78e0: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
78f0: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
7900: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
7910: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
7920: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
7930: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
7940: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
7950: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
7960: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
7970: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
7980: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
7990: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
79a0: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
79b0: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
79c0: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
79d0: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
79e0: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
79f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7a00: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
7a10: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
7a20: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
7a30: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
7a40: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
7a50: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
7a60: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
7a70: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
7a80: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
7a90: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
7aa0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
7ab0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
7ac0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
7ad0: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
7ae0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
7af0: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
7b00: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
7b10: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
7b20: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
7b30: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
7b40: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
7b50: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
7b60: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
7b70: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
7b80: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
7b90: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
7ba0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
7bb0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
7bc0: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
7bd0: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
7be0: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
7bf0: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
7c00: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
7c10: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
7c20: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
7c30: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7c40: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
7c50: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
7c60: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
7c70: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
7c80: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
7c90: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
7ca0: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
7cb0: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
7cc0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
7cd0: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
7ce0: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
7cf0: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
7d00: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
7d10: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
7d20: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
7d30: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
7d40: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
7d50: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
7d60: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
7d70: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
7d80: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
7d90: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
7da0: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
7db0: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
7dc0: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
7dd0: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
7de0: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
7df0: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
7e00: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
7e10: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
7e20: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
7e30: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
7e40: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
7e50: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
7e60: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
7e70: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
7e80: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
7e90: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
7ea0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
7eb0: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
7ec0: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
7ed0: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
7ee0: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
7ef0: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
7f00: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
7f10: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
7f20: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
7f30: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
7f40: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
7f50: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
7f60: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
7f70: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
7f80: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
7f90: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
7fa0: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
7fb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7fc0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
7fd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
7fe0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
7ff0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
8000: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
8010: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
8020: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
8030: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
8040: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
8050: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
8060: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
8070: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
8080: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
8090: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
80a0: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
80b0: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
80c0: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
80d0: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
80e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
80f0: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
8100: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
8110: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
8120: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
8130: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
8140: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
8150: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
8160: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
8170: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
8180: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
8190: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
81a0: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
81b0: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
81c0: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
81d0: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
81e0: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
81f0: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
8200: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
8210: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
8220: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
8230: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
8240: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
8250: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
8260: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
8270: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
8280: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
8290: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
82a0: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
82b0: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
82c0: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
82d0: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
82e0: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
82f0: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
8300: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
8310: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
8320: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
8330: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
8340: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
8350: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
8360: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
8370: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
8380: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
8390: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
83a0: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
83b0: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
83c0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
83d0: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
83e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
83f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
8400: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
8410: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
8420: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
8430: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
8440: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
8450: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
8460: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
8470: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
8480: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8490: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
84a0: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
84b0: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
84c0: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
84d0: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
84e0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
84f0: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
8500: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
8510: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
8520: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
8530: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
8540: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
8550: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
8560: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
8570: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
8580: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
8590: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
85a0: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
85b0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
85c0: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
85d0: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
85e0: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
85f0: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
8600: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
8610: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
8620: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
8630: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
8640: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
8650: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
8660: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
8670: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
8680: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
8690: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
86a0: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
86b0: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
86c0: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
86d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
86e0: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
86f0: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
8700: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
8710: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
8720: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
8730: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
8740: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
8750: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
8760: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
8770: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
8780: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87a0: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
87b0: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
87c0: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
87d0: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
87e0: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
87f0: 4b 65 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  Key ){.    KeyIn
8800: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
8810: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  Cur->pKeyInfo;. 
8820: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
8830: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
8840: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
8850: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
8860: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
8870: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
8880: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
8890: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
88a0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
88b0: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
88c0: 6e 70 61 63 6b 28 70 4b 65 79 49 6e 66 6f 2c 20  npack(pKeyInfo, 
88d0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
88e0: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
88f0: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
8900: 6c 64 3d 3d 30 20 7c 7c 20 70 49 64 78 4b 65 79  ld==0 || pIdxKey
8910: 2d 3e 6e 46 69 65 6c 64 3e 70 4b 65 79 49 6e 66  ->nField>pKeyInf
8920: 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 7b 0a  o->nAllField ){.
8930: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
8940: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8950: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
8960: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
8970: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
8980: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
8990: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
89a0: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
89b0: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
89c0: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
89d0: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
89e0: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
89f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8a00: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
8a10: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
8a20: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8a30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
8a40: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
8a50: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
8a60: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
8a70: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
8a80: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
8a90: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
8aa0: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
8ab0: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
8ac0: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
8ad0: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
8ae0: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
8af0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
8b00: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
8b10: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
8b20: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
8b30: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
8b40: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
8b50: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
8b60: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
8b70: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
8b80: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
8b90: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
8ba0: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
8bb0: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
8bc0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
8bd0: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
8be0: 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
8bf0: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
8c00: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
8c10: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
8c20: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
8c30: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
8c40: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
8c50: 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70  kipNext;.  }.  p
8c60: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
8c70: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
8c80: 69 66 28 20 73 71 6c 69 74 65 33 46 61 75 6c 74  if( sqlite3Fault
8c90: 53 69 6d 28 34 31 30 29 20 29 7b 0a 20 20 20 20  Sim(410) ){.    
8ca0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
8cb0: 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
8cc0: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
8cd0: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
8ce0: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
8cf0: 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  , &skipNext);.  
8d00: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
8d10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
8d20: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
8d30: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
8d40: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
8d50: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
8d60: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
8d70: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
8d80: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
8d90: 44 20 29 3b 0a 20 20 20 20 69 66 28 20 73 6b 69  D );.    if( ski
8da0: 70 4e 65 78 74 20 29 20 70 43 75 72 2d 3e 73 6b  pNext ) pCur->sk
8db0: 69 70 4e 65 78 74 20 3d 20 73 6b 69 70 4e 65 78  ipNext = skipNex
8dc0: 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  t;.    if( pCur-
8dd0: 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75  >skipNext && pCu
8de0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
8df0: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
8e00: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
8e10: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b  CURSOR_SKIPNEXT;
8e20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8e30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
8e40: 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ne restoreCursor
8e50: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
8e60: 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  (p->eState>=CURS
8e70: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
8e80: 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65   \.         btre
8e90: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
8ea0: 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20  sition(p) : \.  
8eb0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
8ec0: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
8ed0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
8ee0: 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d  t a cursor has m
8ef0: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f  oved from the po
8f00: 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20  sition where.** 
8f10: 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63  it was last plac
8f20: 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20  ed, or has been 
8f30: 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20  invalidated for 
8f40: 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  any other reason
8f50: 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e  ..** Cursors can
8f60: 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72   move when the r
8f70: 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  ow they are poin
8f80: 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74  ting at is delet
8f90: 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75  ed out.** from u
8fa0: 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65  nder them, for e
8fb0: 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20  xample.  Cursor 
8fc0: 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20  might also move 
8fd0: 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73  if a btree.** is
8fe0: 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a   rebalanced..**.
8ff0: 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
9000: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e  routine with a N
9010: 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  ULL cursor point
9020: 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  er returns false
9030: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
9040: 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65 33  separate sqlite3
9050: 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
9060: 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20  re() routine to 
9070: 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72  restore a cursor
9080: 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72  .** back to wher
9090: 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65  e it ought to be
90a0: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
90b0: 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a   returns true..*
90c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
90d0: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
90e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
90f0: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
9100: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
9110: 28 70 43 75 72 29 0a 20 20 20 20 20 20 20 7c 7c  (pCur).       ||
9120: 20 70 43 75 72 3d 3d 73 71 6c 69 74 65 33 42 74   pCur==sqlite3Bt
9130: 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73  reeFakeValidCurs
9140: 6f 72 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74  or() );.  assert
9150: 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  ( offsetof(BtCur
9160: 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d 30 20  sor, eState)==0 
9170: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
9180: 65 6f 66 28 70 43 75 72 2d 3e 65 53 74 61 74 65  eof(pCur->eState
9190: 29 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==1 );.  return
91a0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 21 3d   CURSOR_VALID !=
91b0: 20 2a 28 75 38 2a 29 70 43 75 72 3b 0a 7d 0a 0a   *(u8*)pCur;.}..
91c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
91d0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 61 6b 65  ointer to a fake
91e0: 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
91f0: 20 74 68 61 74 20 77 69 6c 6c 20 61 6c 77 61 79   that will alway
9200: 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66 61 6c 73  s answer.** fals
9210: 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  e to the sqlite3
9220: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
9230: 76 65 64 28 29 20 72 6f 75 74 69 6e 65 20 61 62  ved() routine ab
9240: 6f 76 65 2e 20 20 54 68 65 20 66 61 6b 65 0a 2a  ove.  The fake.*
9250: 2a 20 63 75 72 73 6f 72 20 72 65 74 75 72 6e 65  * cursor returne
9260: 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75 73  d must not be us
9270: 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  ed with any othe
9280: 72 20 42 74 72 65 65 20 69 6e 74 65 72 66 61 63  r Btree interfac
9290: 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f 72 20 2a  e..*/.BtCursor *
92a0: 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65  sqlite3BtreeFake
92b0: 56 61 6c 69 64 43 75 72 73 6f 72 28 76 6f 69 64  ValidCursor(void
92c0: 29 7b 0a 20 20 73 74 61 74 69 63 20 75 38 20 66  ){.  static u8 f
92d0: 61 6b 65 43 75 72 73 6f 72 20 3d 20 43 55 52 53  akeCursor = CURS
92e0: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61 73 73 65  OR_VALID;.  asse
92f0: 72 74 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43  rt( offsetof(BtC
9300: 75 72 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d  ursor, eState)==
9310: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 42  0 );.  return (B
9320: 74 43 75 72 73 6f 72 2a 29 26 66 61 6b 65 43 75  tCursor*)&fakeCu
9330: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rsor;.}../*.** T
9340: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74  his routine rest
9350: 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61  ores a cursor ba
9360: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
9370: 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65  al position afte
9380: 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e  r it.** has been
9390: 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f   moved by some o
93a0: 75 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20  utside activity 
93b0: 28 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65  (such as a btree
93c0: 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a   rebalance or.**
93d0: 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65   a row having be
93e0: 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
93f0: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
9400: 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f  rsor).  .**.** O
9410: 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a  n success, the *
9420: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61  pDifferentRow pa
9430: 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65  rameter is false
9440: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
9450: 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69  s left.** pointi
9460: 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68  ng at exactly th
9470: 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44  e same row.  *pD
9480: 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68  ifferntRow is th
9490: 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
94a0: 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67  .** was pointing
94b0: 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c   to has been del
94c0: 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68  eted, forcing th
94d0: 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
94e0: 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61  t to some.** nea
94f0: 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54  rby row..**.** T
9500: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
9510: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
9520: 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  d for a cursor t
9530: 68 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65  hat just returne
9540: 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73  d.** TRUE from s
9550: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
9560: 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a  rHasMoved()..*/.
9570: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
9580: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74  CursorRestore(Bt
9590: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
95a0: 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  t *pDifferentRow
95b0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
95c0: 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
95d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
95e0: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
95f0: 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20  R_VALID );.  rc 
9600: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
9610: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
9620: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
9630: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
9640: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
9650: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
9660: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
9670: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  _VALID ){.    *p
9680: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31  DifferentRow = 1
9690: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
96a0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
96b0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
96c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
96d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
96e0: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
96f0: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69  /*.** Provide hi
9700: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
9710: 72 2e 20 20 54 68 65 20 70 61 72 74 69 63 75 6c  r.  The particul
9720: 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61  ar hint given (a
9730: 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61  nd the type.** a
9740: 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  nd number of the
9750: 20 76 61 72 61 72 67 73 20 70 61 72 61 6d 65 74   varargs paramet
9760: 65 72 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e  ers) is determin
9770: 65 64 20 62 79 20 74 68 65 20 65 48 69 6e 74 54  ed by the eHintT
9780: 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ype.** parameter
9790: 2e 20 20 53 65 65 20 74 68 65 20 64 65 66 69 6e  .  See the defin
97a0: 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54  itions of the BT
97b0: 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f  REE_HINT_* macro
97c0: 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  s for details..*
97d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
97e0: 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74  reeCursorHint(Bt
97f0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
9800: 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e  t eHintType, ...
9810: 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c  ){.  /* Used onl
9820: 79 20 62 79 20 73 79 73 74 65 6d 20 74 68 61 74  y by system that
9830: 20 73 75 62 73 74 69 74 75 74 65 20 74 68 65 69   substitute thei
9840: 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e  r own storage en
9850: 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66  gine */.}.#endif
9860: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
9870: 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68  flag hints to th
9880: 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69  e cursor..*/.voi
9890: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
98a0: 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74  rsorHintFlags(Bt
98b0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e  Cursor *pCur, un
98c0: 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73  signed x){.  ass
98d0: 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45  ert( x==BTREE_SE
98e0: 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45  EK_EQ || x==BTRE
98f0: 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d  E_BULKLOAD || x=
9900: 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69  =0 );.  pCur->hi
9910: 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66  nts = x;.}...#if
9920: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9930: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
9940: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
9950: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
9960: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
9970: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
9980: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
9990: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
99a0: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
99b0: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
99c0: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
99d0: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
99e0: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
99f0: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
9a00: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
9a10: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
9a20: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
9a30: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
9a40: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
9a50: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
9a60: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
9a70: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
9a80: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
9a90: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
9aa0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
9ab0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
9ac0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
9ad0: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
9ae0: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
9af0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9b00: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
9b10: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
9b20: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
9b30: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
9b40: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
9b50: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
9b60: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
9b70: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
9b80: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
9b90: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
9ba0: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
9bb0: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
9bc0: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
9bd0: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
9be0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
9bf0: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
9c00: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
9c10: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
9c20: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
9c30: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
9c40: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
9c50: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
9c60: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
9c70: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
9c80: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
9c90: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
9ca0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
9cb0: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
9cc0: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
9cd0: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
9ce0: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
9cf0: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
9d00: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
9d10: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
9d20: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
9d30: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
9d40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
9d50: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
9d60: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
9d70: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
9d80: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
9d90: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
9da0: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
9db0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
9dc0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
9dd0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
9de0: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
9df0: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
9e00: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
9e10: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
9e20: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
9e30: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
9e40: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
9e50: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
9e60: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
9e70: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
9e80: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
9e90: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
9ea0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
9eb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9ec0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
9ed0: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
9ee0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
9ef0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6e  page number is n
9f00: 65 76 65 72 20 61 64 64 65 64 20 74 6f 20 61 20  ever added to a 
9f10: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
9f20: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
9f30: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
9f40: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
9f50: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
9f60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9f70: 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20  MIT_CONCURRENT. 
9f80: 20 69 66 28 20 70 42 74 2d 3e 70 4d 61 70 20 29   if( pBt->pMap )
9f90: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 62 74 72  {.    *pRC = btr
9fa0: 65 65 50 74 72 6d 61 70 53 74 6f 72 65 28 70 42  eePtrmapStore(pB
9fb0: 74 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  t, key, eType, p
9fc0: 61 72 65 6e 74 29 3b 0a 20 20 20 20 72 65 74 75  arent);.    retu
9fd0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
9fe0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
9ff0: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
a000: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
a010: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
a020: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
a030: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
a040: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
a050: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
a060: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
a070: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
a080: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
a090: 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  pDbPage, 0);.  i
a0a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a0b0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
a0c0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
a0d0: 20 7d 0a 20 20 69 66 28 20 28 28 63 68 61 72 2a   }.  if( ((char*
a0e0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
a0f0: 45 78 74 72 61 28 70 44 62 50 61 67 65 29 29 5b  Extra(pDbPage))[
a100: 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  0]!=0 ){.    /* 
a110: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
a120: 66 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  f the extra data
a130: 20 69 73 20 74 68 65 20 4d 65 6d 50 61 67 65 2e   is the MemPage.
a140: 69 73 49 6e 69 74 20 62 79 74 65 2e 0a 20 20 20  isInit byte..   
a150: 20 2a 2a 20 49 66 20 74 68 61 74 20 62 79 74 65   ** If that byte
a160: 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e   is set, it mean
a170: 73 20 74 68 69 73 20 70 61 67 65 20 69 73 20 61  s this page is a
a180: 6c 73 6f 20 62 65 69 6e 67 20 75 73 65 64 0a 20  lso being used. 
a190: 20 20 20 2a 2a 20 61 73 20 61 20 62 74 72 65 65     ** as a btree
a1a0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 2a 70   page. */.    *p
a1b0: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
a1c0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
a1d0: 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a  to ptrmap_exit;.
a1e0: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
a1f0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
a200: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
a210: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
a220: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
a230: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
a240: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
a250: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73  _exit;.  }.  ass
a260: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
a270: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
a280: 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d  ize-5 );.  pPtrm
a290: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
a2a0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
a2b0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
a2c0: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
a2d0: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
a2e0: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
a2f0: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
a300: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
a310: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
a320: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
a330: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
a340: 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20  );.    *pRC= rc 
a350: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
a360: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
a370: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
a380: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
a390: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
a3a0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
a3b0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
a3c0: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
a3d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72  ;.    }.  }..ptr
a3e0: 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  map_exit:.  sqli
a3f0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
a400: 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bPage);.}../*.**
a410: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
a420: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
a430: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
a440: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
a450: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
a460: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
a470: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
a480: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
a490: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
a4a0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
a4b0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
a4c0: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
a4d0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
a4e0: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
a4f0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
a500: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
a510: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a520: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
a530: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
a540: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
a550: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
a560: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
a570: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
a580: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
a590: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
a5a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
a5b0: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
a5c0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
a5d0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
a5e0: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
a5f0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
a600: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
a610: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
a620: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
a630: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
a640: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a650: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
a660: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
a670: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
a680: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
a690: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
a6a0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
a6b0: 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29  ap, &pDbPage, 0)
a6c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
a6d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
a6e0: 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20    }.  pPtrmap = 
a6f0: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
a700: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
a710: 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20  e);..  offset = 
a720: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
a730: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
a740: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
a750: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
a760: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
a770: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
a780: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a790: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a7a0: 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70  offset <= (int)p
a7b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35  Bt->usableSize-5
a7c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
a7d0: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
a7e0: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
a7f0: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
a800: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
a810: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
a820: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
a830: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
a840: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  f(pDbPage);.  if
a850: 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a  ( *pEType<1 || *
a860: 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72  pEType>5 ) retur
a870: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
a880: 5f 50 47 4e 4f 28 69 50 74 72 6d 61 70 29 3b 0a  _PGNO(iPtrmap);.
a890: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a8a0: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  OK;.}..#else /* 
a8b0: 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54  if defined SQLIT
a8c0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
a8d0: 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70  M */.  #define p
a8e0: 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a  trmapPut(w,x,y,z
a8f0: 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70  ,rc).  #define p
a900: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
a910: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
a920: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
a930: 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 7a 2c 20  vflPtr(x, y, z, 
a940: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
a950: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
a960: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
a970: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
a980: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
a990: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
a9a0: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
a9b0: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
a9c0: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
a9d0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
a9e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
a9f0: 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  .** findCellPast
aa00: 50 74 72 28 29 20 64 6f 65 73 20 74 68 65 20 73  Ptr() does the s
aa10: 61 6d 65 20 65 78 63 65 70 74 20 69 74 20 73 6b  ame except it sk
aa20: 69 70 73 20 70 61 73 74 20 74 68 65 20 69 6e 69  ips past the ini
aa30: 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63  tial.** 4-byte c
aa40: 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75  hild pointer fou
aa50: 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70  nd on interior p
aa60: 61 67 65 73 2c 20 69 66 20 74 68 65 72 65 20 69  ages, if there i
aa70: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  s one..**.** Thi
aa80: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
aa90: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
aaa0: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
aab0: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
aac0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
aad0: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
aae0: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
aaf0: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
ab00: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
ab10: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
ab20: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
ab30: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
ab40: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
ab50: 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d  DataOfst + ((P)-
ab60: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
ab70: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29  byteAligned(&(P)
ab80: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
ab90: 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ]))).../*.** Thi
aba0: 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c  s is common tail
abb0: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
abc0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
abd0: 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65  r() and.** btree
abe0: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
abf0: 78 28 29 20 66 6f 72 20 74 68 65 20 63 61 73 65  x() for the case
ac00: 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64   when the cell d
ac10: 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69  oes not fit enti
ac20: 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e  rely.** on a sin
ac30: 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e  gle B-tree page.
ac40: 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79    Make necessary
ac50: 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20   adjustments to 
ac60: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20  the CellInfo.** 
ac70: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
ac80: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
ac90: 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50  LINE void btreeP
aca0: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
acb0: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20  zeForOverflow(. 
acc0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
acd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
ace0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
acf0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
ad00: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
ad10: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
ad20: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
ad30: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
ad40: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
ad50: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
ad60: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  cture */.){.  /*
ad70: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
ad80: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
ad90: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
ada0: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
adb0: 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  ve.  ** to decid
adc0: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
add0: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
ade0: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
adf0: 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72  l onto.  ** over
ae00: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
ae10: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
ae20: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
ae30: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
ae40: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
ae50: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
ae60: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
ae70: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
ae80: 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74  rage.  ** in bet
ae90: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
aea0: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a  d maxLocal..  **
aeb0: 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20  .  ** Warning:  
aec0: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
aed0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
aee0: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
aef0: 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79   in any.  ** way
af00: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
af10: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
af20: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a  file format..  *
af30: 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c  /.  int minLocal
af40: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
af50: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
af60: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
af70: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
af80: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
af90: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
afa0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
afb0: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
afc0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
afd0: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
afe0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
aff0: 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  /..  minLocal = 
b000: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
b010: 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50  .  maxLocal = pP
b020: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
b030: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
b040: 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50  cal + (pInfo->nP
b050: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
b060: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
b070: 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20  usableSize-4);. 
b080: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
b090: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
b0a0: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
b0b0: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
b0c0: 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73  );.  if( surplus
b0d0: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
b0e0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
b0f0: 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73  l = (u16)surplus
b100: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
b110: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
b120: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
b130: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  }.  pInfo->nSize
b140: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
b150: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
b160: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
b170: 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ) + 4;.}../*.** 
b180: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
b190: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
b1a0: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
b1b0: 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65  e MemPage.xParse
b1c0: 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  Cell().** method
b1d0: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ..**.** Parse a 
b1e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
b1f0: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
b200: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
b210: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72  cture..**.** btr
b220: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
b230: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62          =>   tab
b240: 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f  le btree leaf no
b250: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
b260: 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29  eCellNoPayload()
b270: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72    =>   table btr
b280: 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  ee internal node
b290: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
b2a0: 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20  ellPtrIndex()   
b2b0: 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65  =>   index btree
b2c0: 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65   nodes.**.** The
b2d0: 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61  re is also a wra
b2e0: 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74  pper function bt
b2f0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
b300: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
b310: 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70   all MemPage typ
b320: 65 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65  es and that refe
b330: 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20  rences the cell 
b340: 62 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20  by index rather 
b350: 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74  than.** by point
b360: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
b370: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
b380: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20  lPtrNoPayload(. 
b390: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
b3a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
b3b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
b3c0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
b3d0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
b3e0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
b3f0: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
b400: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
b410: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
b420: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
b430: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  cture */.){.  as
b440: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b450: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b460: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b470: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b480: 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73  leaf==0 );.  ass
b490: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
b4a0: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23  dPtrSize==4 );.#
b4b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
b4c0: 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BUG.  UNUSED_PAR
b4d0: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
b4e0: 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e  endif.  pInfo->n
b4f0: 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61  Size = 4 + getVa
b500: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20  rint(&pCell[4], 
b510: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
b520: 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  ey);.  pInfo->nP
b530: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49  ayload = 0;.  pI
b540: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b  nfo->nLocal = 0;
b550: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
b560: 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ad = 0;.  return
b570: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
b580: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
b590: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
b5a0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
b5b0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
b5c0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
b5d0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
b5e0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
b5f0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
b600: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
b610: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
b620: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
b630: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
b640: 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20    u8 *pIter;    
b650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
b660: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
b670: 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32  h pCell */.  u32
b680: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
b690: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b6a0: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
b6b0: 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34  payload */.  u64
b6c0: 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20   iKey;          
b6d0: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65       /* Extracte
b6e0: 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a  d Key value */..
b6f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b700: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
b710: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
b720: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b730: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
b740: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
b750: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b760: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a  ->intKeyLeaf );.
b770: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b780: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30  >childPtrSize==0
b790: 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43   );.  pIter = pC
b7a0: 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  ell;..  /* The n
b7b0: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
b7c0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
b7d0: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
b7e0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
b7f0: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50  rint32(pIter, nP
b800: 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20  ayload);.  **.  
b810: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
b820: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
b830: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
b840: 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  .  */.  nPayload
b850: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
b860: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
b870: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
b880: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
b890: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
b8a0: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
b8b0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
b8c0: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
b8d0: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
b8e0: 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74     }while( (*pIt
b8f0: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
b900: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
b910: 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20   pIter++;..  /* 
b920: 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
b930: 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61  f code is equiva
b940: 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  lent to:.  **.  
b950: 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  **     pIter += 
b960: 67 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c  getVarint(pIter,
b970: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
b980: 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Key);.  **.  ** 
b990: 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69  The code is inli
b9a0: 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66  ned to avoid a f
b9b0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20  unction call..  
b9c0: 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74  */.  iKey = *pIt
b9d0: 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d  er;.  if( iKey>=
b9e0: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
b9f0: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d  pEnd = &pIter[7]
ba00: 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78  ;.    iKey &= 0x
ba10: 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29  7f;.    while(1)
ba20: 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28  {.      iKey = (
ba30: 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  iKey<<7) | (*++p
ba40: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
ba50: 20 20 20 20 69 66 28 20 28 2a 70 49 74 65 72 29      if( (*pIter)
ba60: 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20  <0x80 ) break;. 
ba70: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d       if( pIter>=
ba80: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pEnd ){.        
ba90: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29  iKey = (iKey<<8)
baa0: 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20   | *++pIter;.   
bab0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bac0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
bad0: 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66  pIter++;..  pInf
bae0: 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a  o->nKey = *(i64*
baf0: 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d  )&iKey;.  pInfo-
bb00: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
bb10: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70  load;.  pInfo->p
bb20: 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b  Payload = pIter;
bb30: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
bb40: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
bb50: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
bb60: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
bb70: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
bb80: 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  1 );.  if( nPayl
bb90: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
bba0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ocal ){.    /* T
bbb0: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
bbc0: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
bbd0: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
bbe0: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
bbf0: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
bc00: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
bc10: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
bc20: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f      */.    pInfo
bc30: 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f  ->nSize = nPaylo
bc40: 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72  ad + (u16)(pIter
bc50: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69   - pCell);.    i
bc60: 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c  f( pInfo->nSize<
bc70: 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  4 ) pInfo->nSize
bc80: 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   = 4;.    pInfo-
bc90: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
bca0: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65  Payload;.  }else
bcb0: 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
bcc0: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
bcd0: 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c  rOverflow(pPage,
bce0: 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
bcf0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
bd00: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
bd10: 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50  PtrIndex(.  MemP
bd20: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
bd30: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
bd40: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
bd50: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bd70: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
bd80: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
bd90: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
bda0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
bdb0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
bdc0: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74   */.){.  u8 *pIt
bdd0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
bde0: 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67   /* For scanning
bdf0: 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a   through pCell *
be00: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
be10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
be20: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
be30: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
be40: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
be50: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
be60: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
be70: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
be80: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
be90: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
bea0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
beb0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d  age->intKeyLeaf=
bec0: 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20  =0 );.  pIter = 
bed0: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
bee0: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e  hildPtrSize;.  n
bef0: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
bf00: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
bf10: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
bf20: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
bf30: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
bf40: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
bf50: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
bf60: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
bf70: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
bf80: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
bf90: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
bfa0: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
bfb0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
bfc0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
bfd0: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
bfe0: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
bff0: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
c000: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
c010: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
c020: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
c030: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
c040: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
c050: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
c060: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
c070: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
c080: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
c090: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
c0a0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
c0b0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
c0c0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
c0d0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
c0e0: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
c0f0: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
c100: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
c110: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
c120: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
c130: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
c140: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
c150: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
c160: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
c170: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
c180: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  6)nPayload;.  }e
c190: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
c1a0: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
c1b0: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
c1c0: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
c1d0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
c1e0: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
c1f0: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
c200: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
c210: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
c220: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
c230: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
c240: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
c250: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
c260: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
c270: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
c280: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
c290: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
c2a0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65  re */.){.  pPage
c2b0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
c2c0: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
c2d0: 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66  ge, iCell), pInf
c2e0: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  o);.}../*.** The
c2f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
c300: 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  nes are implemen
c310: 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d  tations of the M
c320: 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65  emPage.xCellSize
c330: 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a  .** method..**.*
c340: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
c350: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
c360: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
c370: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
c380: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
c390: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
c3a0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
c3b0: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
c3c0: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
c3d0: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
c3e0: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
c3f0: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
c400: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
c410: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
c420: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
c430: 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50  .**.** cellSizeP
c440: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20  trNoPayload()   
c450: 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65   =>   table inte
c460: 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65  rnal nodes.** ce
c470: 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20 20  llSizePtr()     
c480: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c          =>   all
c490: 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74   index nodes & t
c4a0: 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  able leaf nodes.
c4b0: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
c4c0: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
c4d0: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
c4e0: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
c4f0: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
c500: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
c510: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
c520: 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43  over bytes of pC
c530: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  ell */.  u8 *pEn
c540: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
c570: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  r a varint */.  
c580: 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  u32 nSize;      
c590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
c5b0: 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
c5c0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
c5d0: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
c5e0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
c5f0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
c600: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
c610: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
c620: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
c630: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
c640: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
c650: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
c660: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
c670: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
c680: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
c690: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
c6a0: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
c6b0: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
c6c0: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
c6d0: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
c6e0: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
c6f0: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
c700: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
c710: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
c720: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
c730: 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d  endif..  nSize =
c740: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
c750: 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20  Size>=0x80 ){.  
c760: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
c770: 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d  8];.    nSize &=
c780: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
c790: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53       nSize = (nS
c7a0: 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  ize<<7) | (*++pI
c7b0: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
c7c0: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
c7d0: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
c7e0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
c7f0: 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50  Iter++;.  if( pP
c800: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
c810: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
c820: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
c830: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
c840: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
c850: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
c860: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
c870: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
c880: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
c890: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
c8a0: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
c8b0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
c8c0: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
c8d0: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
c8e0: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
c8f0: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
c900: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
c910: 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
c920: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
c930: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
c940: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
c950: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
c960: 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d  );.  if( nSize<=
c970: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
c980: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20  ){.    nSize += 
c990: 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43  (u32)(pIter - pC
c9a0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ell);.    if( nS
c9b0: 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20  ize<4 ) nSize = 
c9c0: 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  4;.  }else{.    
c9d0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
c9e0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
c9f0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
ca00: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
ca10: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
ca20: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
ca30: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
ca40: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
ca50: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
ca60: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
ca70: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
ca80: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
ca90: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
caa0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
cab0: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
cac0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
cad0: 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36  Size += 4 + (u16
cae0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
caf0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
cb00: 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f  nSize==debuginfo
cb10: 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50  .nSize || CORRUP
cb20: 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e  T_DB );.  return
cb30: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73   (u16)nSize;.}.s
cb40: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
cb50: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d  zePtrNoPayload(M
cb60: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
cb70: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
cb80: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
cb90: 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69   4; /* For loopi
cba0: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
cbb0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
cbc0: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
cbd0: 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66     /* End mark f
cbe0: 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a  or a varint */..
cbf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
cc00: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
cc10: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
cc20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
cc30: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
cc40: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
cc50: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
cc60: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
cc70: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
cc80: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
cc90: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
cca0: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
ccb0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
ccc0: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
ccd0: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
cce0: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
ccf0: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
cd00: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
cd10: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
cd20: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61  debuginfo;.  pPa
cd30: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
cd40: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
cd50: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a  buginfo);.#else.
cd60: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
cd70: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
cd80: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
cd90: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
cda0: 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20  ==4 );.  pEnd = 
cdb0: 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69  pIter + 9;.  whi
cdc0: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
cdd0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
cde0: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  d );.  assert( d
cdf0: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ebuginfo.nSize==
ce00: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
ce10: 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ell) || CORRUPT_
ce20: 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  DB );.  return (
ce30: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
ce40: 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  ll);.}...#ifdef 
ce50: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20  SQLITE_DEBUG./* 
ce60: 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f  This variation o
ce70: 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  n cellSizePtr() 
ce80: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
ce90: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
cea0: 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a  ments.** only. *
ceb0: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
cec0: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
ced0: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
cee0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
cef0: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
cf00: 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
cf10: 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65  e, iCell));.}.#e
cf20: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
cf30: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
cf40: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  CUUM./*.** The c
cf50: 65 6c 6c 20 70 43 65 6c 6c 20 69 73 20 63 75 72  ell pCell is cur
cf60: 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20 70  rently part of p
cf70: 61 67 65 20 70 53 72 63 20 62 75 74 20 77 69 6c  age pSrc but wil
cf80: 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 20  l ultimately be 
cf90: 70 61 72 74 0a 2a 2a 20 6f 66 20 70 50 61 67 65  part.** of pPage
cfa0: 2e 20 20 28 70 53 72 63 20 61 6e 64 20 70 50 61  .  (pSrc and pPa
cfb0: 67 65 72 20 61 72 65 20 6f 66 74 65 6e 20 74 68  ger are often th
cfc0: 65 20 73 61 6d 65 2e 29 20 20 49 66 20 70 43 65  e same.)  If pCe
cfd0: 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  ll contains a.**
cfe0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
cff0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
d000: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
d010: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
d020: 61 70 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6f 76  ap for.** the ov
d030: 65 72 66 6c 6f 77 20 70 61 67 65 20 74 68 61 74  erflow page that
d040: 20 77 69 6c 6c 20 62 65 20 76 61 6c 69 64 20 61   will be valid a
d050: 66 74 65 72 20 70 43 65 6c 6c 20 68 61 73 20 62  fter pCell has b
d060: 65 65 6e 20 6d 6f 76 65 64 20 74 6f 20 70 50 61  een moved to pPa
d070: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
d080: 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  id ptrmapPutOvfl
d090: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
d0a0: 67 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70 53 72  ge, MemPage *pSr
d0b0: 63 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 69 6e 74  c, u8 *pCell,int
d0c0: 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e   *pRC){.  CellIn
d0d0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a  fo info;.  if( *
d0e0: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
d0f0: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
d100: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61   );.  pPage->xPa
d110: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
d120: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
d130: 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c  if( info.nLocal<
d140: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b  info.nPayload ){
d150: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 3b 0a  .    Pgno ovfl;.
d160: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 57      if( SQLITE_W
d170: 49 54 48 49 4e 28 70 53 72 63 2d 3e 61 44 61 74  ITHIN(pSrc->aDat
d180: 61 45 6e 64 2c 20 70 43 65 6c 6c 2c 20 70 43 65  aEnd, pCell, pCe
d190: 6c 6c 2b 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20  ll+info.nLocal) 
d1a0: 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
d1b0: 65 28 20 70 53 72 63 21 3d 70 50 61 67 65 20 29  e( pSrc!=pPage )
d1c0: 3b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 53  ;.      *pRC = S
d1d0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d1e0: 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
d1f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 76 66 6c  ;.    }.    ovfl
d200: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
d210: 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d  ll[info.nSize-4]
d220: 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
d230: 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66  (pPage->pBt, ovf
d240: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
d250: 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
d260: 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  , pRC);.  }.}.#e
d270: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
d280: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
d290: 20 67 69 76 65 6e 2e 20 54 68 69 73 20 72 6f 75   given. This rou
d2a0: 74 69 6e 65 20 72 65 6f 72 67 61 6e 69 7a 65 73  tine reorganizes
d2b0: 20 63 65 6c 6c 73 20 77 69 74 68 69 6e 20 74 68   cells within th
d2c0: 65 0a 2a 2a 20 70 61 67 65 20 73 6f 20 74 68 61  e.** page so tha
d2d0: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66  t there are no f
d2e0: 72 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e 20 74 68  ree-blocks on th
d2f0: 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6c 69 73  e free-block lis
d300: 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  t..**.** Paramet
d310: 65 72 20 6e 4d 61 78 46 72 61 67 20 69 73 20 74  er nMaxFrag is t
d320: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
d330: 74 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20  t of fragmented 
d340: 73 70 61 63 65 20 74 68 61 74 20 6d 61 79 20 62  space that may b
d350: 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20  e.** present in 
d360: 74 68 65 20 70 61 67 65 20 61 66 74 65 72 20 74  the page after t
d370: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
d380: 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45  rns..**.** EVIDE
d390: 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d  NCE-OF: R-44582-
d3a0: 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79  60138 SQLite may
d3b0: 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69   from time to ti
d3c0: 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a  me reorganize a.
d3d0: 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73  ** b-tree page s
d3e0: 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  o that there are
d3f0: 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f   no freeblocks o
d400: 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73  r fragment bytes
d410: 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20  , all.** unused 
d420: 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69  bytes are contai
d430: 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c  ned in the unall
d440: 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67  ocated space reg
d450: 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  ion, and all.** 
d460: 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64  cells are packed
d470: 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20   tightly at the 
d480: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
d490: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
d4a0: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65  efragmentPage(Me
d4b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
d4c0: 74 20 6e 4d 61 78 46 72 61 67 29 7b 0a 20 20 69  t nMaxFrag){.  i
d4d0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
d4e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
d4f0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
d500: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
d510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
d520: 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68  ress of the i-th
d530: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68   cell */.  int h
d540: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
d550: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
d560: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
d570: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65  er */.  int size
d580: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d590: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
d5a0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73  cell */.  int us
d5b0: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  ableSize;       
d5c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d5d0: 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f  f usable bytes o
d5e0: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  n a page */.  in
d5f0: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
d600: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
d610: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70  et to the cell p
d620: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
d630: 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20    int cbrk;     
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d650: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
d660: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
d670: 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
d6a0: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ls on the page *
d6b0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
d6c0: 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  r *data;       /
d6d0: 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20  * The page data 
d6e0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
d6f0: 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20  ar *temp;       
d700: 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72  /* Temp area for
d710: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
d720: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d730: 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a   *src;        /*
d740: 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65   Source of conte
d750: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
d760: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
d770: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
d780: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
d790: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
d7a0: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
d7b0: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
d7c0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
d7d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d7e0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
d7f0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
d800: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
d810: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
d820: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d830: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d840: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
d850: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
d860: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
d870: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
d880: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d890: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
d8a0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
d8b0: 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73  .  temp = 0;.  s
d8c0: 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67  rc = data = pPag
d8d0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
d8e0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
d8f0: 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  et;.  cellOffset
d900: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
d910: 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  fset;.  nCell = 
d920: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
d930: 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67  assert( nCell==g
d940: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
d950: 72 2b 33 5d 29 20 7c 7c 20 43 4f 52 52 55 50 54  r+3]) || CORRUPT
d960: 5f 44 42 20 29 3b 0a 20 20 69 43 65 6c 6c 46 69  _DB );.  iCellFi
d970: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
d980: 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73   + 2*nCell;.  us
d990: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
d9a0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d9b0: 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c  e;..  /* This bl
d9c0: 6f 63 6b 20 68 61 6e 64 6c 65 73 20 70 61 67 65  ock handles page
d9d0: 73 20 77 69 74 68 20 74 77 6f 20 6f 72 20 66 65  s with two or fe
d9e0: 77 65 72 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  wer free blocks 
d9f0: 61 6e 64 20 6e 4d 61 78 46 72 61 67 0a 20 20 2a  and nMaxFrag.  *
da00: 2a 20 6f 72 20 66 65 77 65 72 20 66 72 61 67 6d  * or fewer fragm
da10: 65 6e 74 65 64 20 62 79 74 65 73 2e 20 49 6e 20  ented bytes. In 
da20: 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
da30: 66 61 73 74 65 72 20 74 6f 20 6d 6f 76 65 20 74  faster to move t
da40: 68 65 0a 20 20 2a 2a 20 74 77 6f 20 28 6f 72 20  he.  ** two (or 
da50: 6f 6e 65 29 20 62 6c 6f 63 6b 73 20 6f 66 20 63  one) blocks of c
da60: 65 6c 6c 73 20 75 73 69 6e 67 20 6d 65 6d 6d 6f  ells using memmo
da70: 76 65 28 29 20 61 6e 64 20 61 64 64 20 74 68 65  ve() and add the
da80: 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 6f   required.  ** o
da90: 66 66 73 65 74 73 20 74 6f 20 65 61 63 68 20 70  ffsets to each p
daa0: 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 65  ointer in the ce
dab0: 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
dac0: 20 74 68 61 6e 20 69 74 20 69 73 20 74 6f 20 0a   than it is to .
dad0: 20 20 2a 2a 20 72 65 63 6f 6e 73 74 72 75 63 74    ** reconstruct
dae0: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65   the entire page
daf0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 69 6e 74  .  */.  if( (int
db00: 29 64 61 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d  )data[hdr+7]<=nM
db10: 61 78 46 72 61 67 20 29 7b 0a 20 20 20 20 69 6e  axFrag ){.    in
db20: 74 20 69 46 72 65 65 20 3d 20 67 65 74 32 62 79  t iFree = get2by
db30: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
db40: 3b 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 3e  ;.    if( iFree>
db50: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20 72  usableSize-4 ) r
db60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
db70: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
db80: 3b 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 20  ;.    if( iFree 
db90: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46 72  ){.      int iFr
dba0: 65 65 32 20 3d 20 67 65 74 32 62 79 74 65 28 26  ee2 = get2byte(&
dbb0: 64 61 74 61 5b 69 46 72 65 65 5d 29 3b 0a 20 20  data[iFree]);.  
dbc0: 20 20 20 20 69 66 28 20 69 46 72 65 65 32 3e 75      if( iFree2>u
dbd0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20 72 65  sableSize-4 ) re
dbe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
dbf0: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
dc00: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 69 46  .      if( 0==iF
dc10: 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b 69 46  ree2 || (data[iF
dc20: 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61 74 61  ree2]==0 && data
dc30: 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29  [iFree2+1]==0) )
dc40: 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 45  {.        u8 *pE
dc50: 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  nd = &data[cellO
dc60: 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d  ffset + nCell*2]
dc70: 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 41  ;.        u8 *pA
dc80: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ddr;.        int
dc90: 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20 20 20   sz2 = 0;.      
dca0: 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32 62    int sz = get2b
dcb0: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  yte(&data[iFree+
dcc0: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  2]);.        int
dcd0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
dce0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
dcf0: 20 20 20 20 20 20 20 69 66 28 20 74 6f 70 3e 3d         if( top>=
dd00: 69 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  iFree ){.       
dd10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dd20: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
dd30: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
dd40: 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65          if( iFre
dd50: 65 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e2 ){.          
dd60: 69 66 28 20 69 46 72 65 65 2b 73 7a 3e 69 46 72  if( iFree+sz>iFr
dd70: 65 65 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ee2 ) return SQL
dd80: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
dd90: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
dda0: 20 20 20 73 7a 32 20 3d 20 67 65 74 32 62 79 74     sz2 = get2byt
ddb0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32  e(&data[iFree2+2
ddc0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
ddd0: 28 20 69 46 72 65 65 32 2b 73 7a 32 20 3e 20 75  ( iFree2+sz2 > u
dde0: 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74 75  sableSize ) retu
ddf0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
de00: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
de10: 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65           memmove
de20: 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b  (&data[iFree+sz+
de30: 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72 65  sz2], &data[iFre
de40: 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69  e+sz], iFree2-(i
de50: 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20  Free+sz));.     
de60: 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a       sz += sz2;.
de70: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
de80: 28 20 69 46 72 65 65 2b 73 7a 3e 75 73 61 62 6c  ( iFree+sz>usabl
de90: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
dea0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
deb0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
dec0: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
ded0: 0a 20 20 20 20 20 20 20 20 63 62 72 6b 20 3d 20  .        cbrk = 
dee0: 74 6f 70 2b 73 7a 3b 0a 20 20 20 20 20 20 20 20  top+sz;.        
def0: 61 73 73 65 72 74 28 20 63 62 72 6b 2b 28 69 46  assert( cbrk+(iF
df00: 72 65 65 2d 74 6f 70 29 20 3c 3d 20 75 73 61 62  ree-top) <= usab
df10: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
df20: 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b    memmove(&data[
df30: 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 74 6f 70  cbrk], &data[top
df40: 5d 2c 20 69 46 72 65 65 2d 74 6f 70 29 3b 0a 20  ], iFree-top);. 
df50: 20 20 20 20 20 20 20 66 6f 72 28 70 41 64 64 72         for(pAddr
df60: 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  =&data[cellOffse
df70: 74 5d 3b 20 70 41 64 64 72 3c 70 45 6e 64 3b 20  t]; pAddr<pEnd; 
df80: 70 41 64 64 72 2b 3d 32 29 7b 0a 20 20 20 20 20  pAddr+=2){.     
df90: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
dfa0: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 20  te(pAddr);.     
dfb0: 20 20 20 20 20 69 66 28 20 70 63 3c 69 46 72 65       if( pc<iFre
dfc0: 65 20 29 7b 20 70 75 74 32 62 79 74 65 28 70 41  e ){ put2byte(pA
dfd0: 64 64 72 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a 20  ddr, pc+sz); }. 
dfe0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
dff0: 28 20 70 63 3c 69 46 72 65 65 32 20 29 7b 20 70  ( pc<iFree2 ){ p
e000: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70  ut2byte(pAddr, p
e010: 63 2b 73 7a 32 29 3b 20 7d 0a 20 20 20 20 20 20  c+sz2); }.      
e020: 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
e030: 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3b   defragment_out;
e040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e050: 20 7d 0a 0a 20 20 63 62 72 6b 20 3d 20 75 73 61   }..  cbrk = usa
e060: 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c  bleSize;.  iCell
e070: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
e080: 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30  e - 4;.  for(i=0
e090: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
e0a0: 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20  .    u8 *pAddr; 
e0b0: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
e0c0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
e0d0: 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74      pAddr = &dat
e0e0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69  a[cellOffset + i
e0f0: 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65  *2];.    pc = ge
e100: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
e110: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
e120: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
e130: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
e140: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
e150: 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69    /* These condi
e160: 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61  tions have alrea
e170: 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  dy been verified
e180: 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67   in btreeInitPag
e190: 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50 52  e().    ** if PR
e1a0: 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63  AGMA cell_size_c
e1b0: 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a  heck=ON..    */.
e1c0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
e1d0: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
e1e0: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  lLast ){.      r
e1f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
e200: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
e210: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
e220: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
e230: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
e240: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
e250: 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
e260: 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70  ze(pPage, &src[p
e270: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
e280: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
e290: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c  brk<iCellFirst |
e2a0: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
e2b0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
e2c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e2d0: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
e2e0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
e2f0: 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73  t( cbrk+size<=us
e300: 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b  ableSize && cbrk
e310: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
e320: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63 62      testcase( cb
e330: 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  rk+size==usableS
e340: 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ize );.    testc
e350: 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73  ase( pc+size==us
e360: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
e370: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
e380: 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74  cbrk);.    if( t
e390: 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
e3a0: 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28  int x;.      if(
e3b0: 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74   cbrk==pc ) cont
e3c0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70  inue;.      temp
e3d0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
e3e0: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
e3f0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
e400: 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65      x = get2byte
e410: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
e420: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65        memcpy(&te
e430: 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c  mp[x], &data[x],
e440: 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78   (cbrk+size) - x
e450: 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74  );.      src = t
e460: 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  emp;.    }.    m
e470: 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b  emcpy(&data[cbrk
e480: 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a  ], &src[pc], siz
e490: 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68  e);.  }.  data[h
e4a0: 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65 66  dr+7] = 0;.. def
e4b0: 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20 61  ragment_out:.  a
e4c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
e4d0: 72 65 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ree>=0 );.  if( 
e4e0: 64 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72 6b  data[hdr+7]+cbrk
e4f0: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
e500: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
e510: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e520: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
e530: 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  e);.  }.  assert
e540: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
e550: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
e560: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
e570: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
e580: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
e590: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d 65  hdr+2] = 0;.  me
e5a0: 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c  mset(&data[iCell
e5b0: 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d  First], 0, cbrk-
e5c0: 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61  iCellFirst);.  a
e5d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
e5e0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
e5f0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
e600: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e610: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
e620: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c  earch the free-l
e630: 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ist on page pPg 
e640: 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f  for space to sto
e650: 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20  re a cell nByte 
e660: 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65  bytes in.** size
e670: 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20  . If one can be 
e680: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20  found, return a 
e690: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
e6a0: 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20  pace and remove 
e6b0: 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  it.** from the f
e6c0: 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
e6d0: 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73  If no suitable s
e6e0: 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e  pace can be foun
e6f0: 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  d on the free-li
e700: 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  st, return NULL.
e710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
e720: 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20  tion may detect 
e730: 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69  corruption withi
e740: 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75  n pPg.  If corru
e750: 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65  ption is.** dete
e760: 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69  cted then *pRc i
e770: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
e780: 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c  CORRUPT and NULL
e790: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
e7a0: 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65  .** Slots on the
e7b0: 20 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20   free list that 
e7c0: 61 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e  are between 1 an
e7d0: 64 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72  d 3 bytes larger
e7e0: 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77   than nByte.** w
e7f0: 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69  ill be ignored i
e800: 66 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74  f adding the ext
e810: 72 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20  ra space to the 
e820: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f  fragmentation co
e830: 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68  unt.** causes th
e840: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
e850: 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20  count to exceed 
e860: 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  60..*/.static u8
e870: 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d   *pageFindSlot(M
e880: 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74  emPage *pPg, int
e890: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63   nByte, int *pRc
e8a0: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
e8b0: 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66  dr = pPg->hdrOff
e8c0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
e8d0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67  /* Offset to pag
e8e0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
e8f0: 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
e900: 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20 20   pPg->aData;    
e910: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
e920: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69   data */.  int i
e930: 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 20  Addr = hdr + 1; 
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e950: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
e960: 20 6f 66 20 70 74 72 20 74 6f 20 70 63 20 2a 2f   of ptr to pc */
e970: 0a 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32  .  int pc = get2
e980: 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64  byte(&aData[iAdd
e990: 72 5d 29 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  r]);          /*
e9a0: 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72   Address of a fr
e9b0: 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74  ee slot */.  int
e9c0: 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 63 65 73          /* Exces
e9f0: 73 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 6c  s size of the sl
ea00: 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 50  ot */.  int maxP
ea10: 43 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  C = pPg->pBt->us
ea20: 61 62 6c 65 53 69 7a 65 20 2d 20 6e 42 79 74 65  ableSize - nByte
ea30: 3b 20 20 2f 2a 20 4d 61 78 20 61 64 64 72 65 73  ;  /* Max addres
ea40: 73 20 66 6f 72 20 61 20 75 73 61 62 6c 65 20 73  s for a usable s
ea50: 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a  lot */.  int siz
ea60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
ea90: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
eaa0: 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 30 20  .  assert( pc>0 
eab0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3c 3d  );.  while( pc<=
eac0: 6d 61 78 50 43 20 29 7b 0a 20 20 20 20 2f 2a 20  maxPC ){.    /* 
ead0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
eae0: 32 37 31 30 2d 35 33 33 32 38 20 54 68 65 20 74  2710-53328 The t
eaf0: 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20  hird and fourth 
eb00: 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20 20  bytes of each.  
eb10: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66    ** freeblock f
eb20: 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61 6e  orm a big-endian
eb30: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
eb40: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
eb50: 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20  e freeblock.    
eb60: 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63  ** in bytes, inc
eb70: 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79 74  luding the 4-byt
eb80: 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
eb90: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
eba0: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  (&aData[pc+2]);.
ebb0: 20 20 20 20 69 66 28 20 28 78 20 3d 20 73 69 7a      if( (x = siz
ebc0: 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b  e - nByte)>=0 ){
ebd0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ebe0: 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74   x==4 );.      t
ebf0: 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b  estcase( x==3 );
ec00: 0a 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29  .      if( x<4 )
ec10: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
ec20: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39  DENCE-OF: R-1149
ec30: 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c  8-58022 In a wel
ec40: 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20  l-formed b-tree 
ec50: 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a  page, the total.
ec60: 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
ec70: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72  r of bytes in fr
ec80: 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20  agments may not 
ec90: 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20  exceed 60. */.  
eca0: 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b        if( aData[
ecb0: 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75  hdr+7]>57 ) retu
ecc0: 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f  rn 0;..        /
ecd0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f  * Remove the slo
ece0: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  t from the free-
ecf0: 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65  list. Update the
ed00: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
ed10: 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64     ** fragmented
ed20: 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68   bytes within th
ed30: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  e page. */.     
ed40: 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
ed50: 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b  [iAddr], &aData[
ed60: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
ed70: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d   aData[hdr+7] +=
ed80: 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65   (u8)x;.      }e
ed90: 6c 73 65 20 69 66 28 20 78 2b 70 63 20 3e 20 6d  lse if( x+pc > m
eda0: 61 78 50 43 20 29 7b 0a 20 20 20 20 20 20 20 20  axPC ){.        
edb0: 2f 2a 20 54 68 69 73 20 73 6c 6f 74 20 65 78 74  /* This slot ext
edc0: 65 6e 64 73 20 6f 66 66 20 74 68 65 20 65 6e 64  ends off the end
edd0: 20 6f 66 20 74 68 65 20 75 73 61 62 6c 65 20 70   of the usable p
ede0: 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  art of the page 
edf0: 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20  */.        *pRc 
ee00: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
ee10: 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20 20 20  _PAGE(pPg);.    
ee20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ee30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ee40: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
ee50: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
ee60: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
ee70: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
ee80: 75 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  unt.        ** f
ee90: 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75  or the portion u
eea0: 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61  sed by the new a
eeb0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  llocation. */.  
eec0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
eed0: 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b  aData[pc+2], x);
eee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
eef0: 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20  eturn &aData[pc 
ef00: 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  + x];.    }.    
ef10: 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20  iAddr = pc;.    
ef20: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  pc = get2byte(&a
ef30: 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 69  Data[pc]);.    i
ef40: 66 28 20 70 63 3c 3d 69 41 64 64 72 2b 73 69 7a  f( pc<=iAddr+siz
ef50: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
ef60: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  c ){.        /* 
ef70: 54 68 65 20 6e 65 78 74 20 73 6c 6f 74 20 69 6e  The next slot in
ef80: 20 74 68 65 20 63 68 61 69 6e 20 69 73 20 6e 6f   the chain is no
ef90: 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  t past the end o
efa0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 6c  f the current sl
efb0: 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70  ot */.        *p
efc0: 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  Rc = SQLITE_CORR
efd0: 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20  UPT_PAGE(pPg);. 
efe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
eff0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
f000: 0a 20 20 69 66 28 20 70 63 3e 6d 61 78 50 43 2b  .  if( pc>maxPC+
f010: 6e 42 79 74 65 2d 34 20 29 7b 0a 20 20 20 20 2f  nByte-4 ){.    /
f020: 2a 20 54 68 65 20 66 72 65 65 20 73 6c 6f 74 20  * The free slot 
f030: 63 68 61 69 6e 20 65 78 74 65 6e 64 73 20 6f 66  chain extends of
f040: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
f050: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 2a 70 52   page */.    *pR
f060: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
f070: 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20  PT_PAGE(pPg);.  
f080: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
f090: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
f0a0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
f0b0: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
f0c0: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
f0d0: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
f0e0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
f0f0: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
f100: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
f110: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
f120: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
f130: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
f140: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
f150: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
f160: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
f170: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
f180: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
f190: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
f1a0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
f1b0: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
f1c0: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
f1d0: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
f1e0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
f1f0: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
f200: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
f210: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
f220: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
f230: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
f240: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
f250: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
f260: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
f270: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
f280: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
f290: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
f2a0: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
f2b0: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
f2c0: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
f2d0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
f2e0: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
f2f0: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
f300: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
f310: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
f320: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
f330: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
f340: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
f350: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
f360: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
f370: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
f380: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
f390: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
f3a0: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
f3b0: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
f3c0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
f3d0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
f3e0: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
f3f0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
f400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
f420: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
f430: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
f440: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f450: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
f460: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
f470: 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  er return code *
f480: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
f490: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
f4a0: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
f4b0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
f4c0: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
f4d0: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
f4e0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
f4f0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
f500: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
f510: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
f520: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
f530: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
f540: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
f550: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
f560: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
f570: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
f580: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
f590: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
f5a0: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
f5b0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
f5c0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
f5d0: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69  sert( nByte < (i
f5e0: 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  nt)(pPage->pBt->
f5f0: 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b  usableSize-8) );
f600: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
f610: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d  e->cellOffset ==
f620: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
f630: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67  age->leaf );.  g
f640: 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ap = pPage->cell
f650: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
f660: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
f670: 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b  t( gap<=65536 );
f680: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
f690: 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31  F: R-29356-02391
f6a0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
f6b0: 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79   uses a 65536-by
f6c0: 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a  te page size.  *
f6d0: 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76  * and the reserv
f6e0: 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f  ed space is zero
f6f0: 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75   (the usual valu
f700: 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73  e for reserved s
f710: 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20  pace).  ** then 
f720: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
f730: 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d   offset of an em
f740: 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74  pty page wants t
f750: 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a  o be 65536..  **
f760: 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69   However, that i
f770: 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61  nteger is too la
f780: 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64  rge to be stored
f790: 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73   in a 2-byte uns
f7a0: 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67  igned.  ** integ
f7b0: 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f  er, so a value o
f7c0: 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69  f 0 is used in i
f7d0: 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74  ts place. */.  t
f7e0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
f7f0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61  ata[hdr+5]);.  a
f800: 73 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74  ssert( top<=(int
f810: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
f820: 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72  bleSize ); /* Pr
f830: 65 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64 49  event by getAndI
f840: 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20 69  nitPage() */.  i
f850: 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20  f( gap>top ){.  
f860: 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20    if( top==0 && 
f870: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
f880: 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b  leSize==65536 ){
f890: 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35  .      top = 655
f8a0: 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  36;.    }else{. 
f8b0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f8c0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
f8d0: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
f8e0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
f8f0: 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65   is enough space
f900: 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64   between gap and
f910: 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72   top for one mor
f920: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2c 0a  e cell pointer,.
f930: 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
f940: 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20  freelist is not 
f950: 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72  empty, then sear
f960: 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65  ch the.  ** free
f970: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
f980: 20 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75   a slot big enou
f990: 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  gh to satisfy th
f9a0: 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a  e request..  */.
f9b0: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
f9c0: 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  2==top );.  test
f9d0: 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70  case( gap+1==top
f9e0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
f9f0: 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  gap==top );.  if
fa00: 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c  ( (data[hdr+2] |
fa10: 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26  | data[hdr+1]) &
fa20: 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a  & gap+2<=top ){.
fa30: 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d      u8 *pSpace =
fa40: 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50   pageFindSlot(pP
fa50: 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29  age, nByte, &rc)
fa60: 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65  ;.    if( pSpace
fa70: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
fa80: 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26  ( pSpace>=data &
fa90: 26 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  & (pSpace - data
faa0: 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20  )<65536 );.     
fab0: 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70   *pIdx = (int)(p
fac0: 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20  Space - data);. 
fad0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fae0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
faf0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
fb00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
fb10: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
fb20: 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f  request could no
fb30: 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75  t be fulfilled u
fb40: 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20  sing a freelist 
fb50: 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a  slot.  Check.  *
fb60: 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72  * to see if defr
fb70: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e  agmentation is n
fb80: 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
fb90: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
fba0: 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20  +nByte==top );. 
fbb0: 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65   if( gap+2+nByte
fbc0: 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65  >top ){.    asse
fbd0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
fbe0: 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  >0 || CORRUPT_DB
fbf0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
fc00: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 30 20  pPage->nFree>=0 
fc10: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  );.    rc = defr
fc20: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
fc30: 2c 20 4d 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e  , MIN(4, pPage->
fc40: 6e 46 72 65 65 20 2d 20 28 32 2b 6e 42 79 74 65  nFree - (2+nByte
fc50: 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
fc60: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
fc70: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
fc80: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
fc90: 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +5]);.    assert
fca0: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74  ( gap+2+nByte<=t
fcb0: 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  op );.  }...  /*
fcc0: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
fcd0: 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e   from the gap in
fce0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c   between the cel
fcf0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l pointer array.
fd00: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c    ** and the cel
fd10: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l content area. 
fd20: 20 54 68 65 20 62 74 72 65 65 43 6f 6d 70 75 74   The btreeComput
fd30: 65 46 72 65 65 53 70 61 63 65 28 29 20 63 61 6c  eFreeSpace() cal
fd40: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20  l has already.  
fd50: 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65  ** validated the
fd60: 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65   freelist.  Give
fd70: 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c  n that the freel
fd80: 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68  ist is valid, th
fd90: 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
fda0: 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  ay that the allo
fdb0: 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e  cation can exten
fdc0: 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  d off the end of
fdd0: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20   the page..  ** 
fde0: 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
fdf0: 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20  ow verifies the 
fe00: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
fe10: 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d  e..  */.  top -=
fe20: 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79   nByte;.  put2by
fe30: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
fe40: 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28   top);.  assert(
fe50: 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69   top+nByte <= (i
fe60: 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
fe70: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a  sableSize );.  *
fe80: 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65  pIdx = top;.  re
fe90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
feb0: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
fec0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
fed0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
fee0: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
fef0: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
ff00: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
ff10: 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a  >aData[iStart].*
ff20: 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  * and the size o
ff30: 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69  f the block is i
ff40: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
ff50: 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62  * Adjacent freeb
ff60: 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73  locks are coales
ff70: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 6e 20  ced..**.** Even 
ff80: 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62  though the freeb
ff90: 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68  lock list was ch
ffa0: 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 43 6f  ecked by btreeCo
ffb0: 6d 70 75 74 65 46 72 65 65 53 70 61 63 65 28 29  mputeFreeSpace()
ffc0: 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e  ,.** that routin
ffd0: 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63  e will not detec
ffe0: 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  t overlap betwee
fff0: 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  n cells or freeb
10000 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64  locks.  Nor.** d
10010 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65  oes it detect ce
10020 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
10030 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20  s that encrouch 
10040 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65  into the reserve
10050 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68  d bytes.** at th
10060 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
10070 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69  e.  So do additi
10080 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  onal corruption 
10090 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68  checks inside th
100a0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e  is.** routine an
100b0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
100c0 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70  CORRUPT if any p
100d0 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
100e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
100f0 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
10100 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69  ge *pPage, u16 i
10110 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65  Start, u16 iSize
10120 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20  ){.  u16 iPtr;  
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
10150 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20  dress of ptr to 
10160 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
10170 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b  /.  u16 iFreeBlk
10180 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
101a0 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
101b0 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
101c0 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65        /* Page he
101f0 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72  ader size.  0 or
10200 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72   100 */.  u8 nFr
10210 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10230 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20  /* Reduction in 
10240 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  fragmentation */
10250 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65  .  u16 iOrigSize
10260 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   = iSize;       
10270 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
10280 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53  inal value of iS
10290 69 7a 65 20 2a 2f 0a 20 20 75 31 36 20 78 3b 20  ize */.  u16 x; 
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
102c0 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
102d0 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
102e0 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53  .  u32 iEnd = iS
102f0 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20  tart + iSize;   
10300 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
10310 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
10320 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f  iStart buffer */
10330 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
10340 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
10350 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65  aData;   /* Page
10360 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61   content */..  a
10370 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
10380 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
10390 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
103a0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
103b0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
103c0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
103d0 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61  B || iStart>=pPa
103e0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
103f0 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
10400 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
10410 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
10420 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42  End <= pPage->pB
10430 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
10440 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10450 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
10460 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
10470 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
10480 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d  ize>=4 );   /* M
10490 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
104a0 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72   is 4 */.  asser
104b0 74 28 20 69 53 74 61 72 74 3c 3d 70 50 61 67 65  t( iStart<=pPage
104c0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
104d0 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  e-4 );..  /* The
104e0 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
104f0 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
10500 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
10510 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20   Find the .  ** 
10520 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74  spot on the list
10530 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73 68   where iStart sh
10540 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64  ould be inserted
10550 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70  ..  */.  hdr = p
10560 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
10570 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20  .  iPtr = hdr + 
10580 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50  1;.  if( data[iP
10590 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61  tr+1]==0 && data
105a0 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iPtr]==0 ){.   
105b0 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20   iFreeBlk = 0;  
105c0 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20  /* Shortcut for 
105d0 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
105e0 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d  e freelist is em
105f0 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  pty */.  }else{.
10600 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72 65      while( (iFre
10610 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28  eBlk = get2byte(
10620 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69 53  &data[iPtr]))<iS
10630 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tart ){.      if
10640 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b  ( iFreeBlk<iPtr+
10650 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  4 ){.        if(
10660 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20 62   iFreeBlk==0 ) b
10670 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72 65  reak;.        re
10680 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10690 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
106a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
106b0 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a  Ptr = iFreeBlk;.
106c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46      }.    if( iF
106d0 72 65 65 42 6c 6b 3e 70 50 61 67 65 2d 3e 70 42  reeBlk>pPage->pB
106e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
106f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10700 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10710 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
10720 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  }.    assert( iF
10730 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69  reeBlk>iPtr || i
10740 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20  FreeBlk==0 );.  
10750 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
10760 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20  point:.    **   
10770 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72   iFreeBlk:   Fir
10780 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74  st freeblock aft
10790 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65  er iStart, or ze
107a0 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a  ro if none.    *
107b0 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20  *    iPtr:      
107c0 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
107d0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72  a pointer to iFr
107e0 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20  eeBlk.    **.   
107f0 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   ** Check to see
10800 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f   if iFreeBlk sho
10810 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64  uld be coalesced
10820 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
10830 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a   iStart..    */.
10840 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
10850 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65   && iEnd+3>=iFre
10860 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46  eBlk ){.      nF
10870 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d  rag = iFreeBlk -
10880 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28   iEnd;.      if(
10890 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29   iEnd>iFreeBlk )
108a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
108b0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
108c0 65 29 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d  e);.      iEnd =
108d0 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32   iFreeBlk + get2
108e0 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
108f0 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  Blk+2]);.      i
10900 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65 2d  f( iEnd > pPage-
10910 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
10920 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
10930 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10940 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
10950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 69       }.      iSi
10960 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61  ze = iEnd - iSta
10970 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42  rt;.      iFreeB
10980 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
10990 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a  ata[iFreeBlk]);.
109a0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
109b0 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68  If iPtr is anoth
109c0 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68  er freeblock (th
109d0 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69  at is, if iPtr i
109e0 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69  s not the freeli
109f0 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65  st.    ** pointe
10a00 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65  r in the page he
10a10 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b  ader) then check
10a20 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72   to see if iStar
10a30 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20  t should be.    
10a40 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  ** coalesced ont
10a50 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74  o the end of iPt
10a60 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
10a70 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a  ( iPtr>hdr+1 ){.
10a80 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e        int iPtrEn
10a90 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62  d = iPtr + get2b
10aa0 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32  yte(&data[iPtr+2
10ab0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ]);.      if( iP
10ac0 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20  trEnd+3>=iStart 
10ad0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
10ae0 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20  PtrEnd>iStart ) 
10af0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10b00 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
10b10 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67  );.        nFrag
10b20 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74   += iStart - iPt
10b30 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53  rEnd;.        iS
10b40 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74  ize = iEnd - iPt
10b50 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  r;.        iStar
10b60 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20  t = iPtr;.      
10b70 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
10b80 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37  nFrag>data[hdr+7
10b90 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ] ) return SQLIT
10ba0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10bb0 50 61 67 65 29 3b 0a 20 20 20 20 64 61 74 61 5b  Page);.    data[
10bc0 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b  hdr+7] -= nFrag;
10bd0 0a 20 20 7d 0a 20 20 78 20 3d 20 67 65 74 32 62  .  }.  x = get2b
10be0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
10bf0 29 3b 0a 20 20 69 66 28 20 69 53 74 61 72 74 3c  );.  if( iStart<
10c00 3d 78 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =x ){.    /* The
10c10 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
10c20 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
10c30 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  ng of the cell c
10c40 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20  ontent area,.   
10c50 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65   ** so just exte
10c60 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
10c70 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72 20  ent area rather 
10c80 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74  than create anot
10c90 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c  her.    ** freel
10ca0 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20  ist entry */.   
10cb0 20 69 66 28 20 69 53 74 61 72 74 3c 78 20 7c 7c   if( iStart<x ||
10cc0 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72   iPtr!=hdr+1 ) r
10cd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10ce0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
10cf0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
10d00 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72  data[hdr+1], iFr
10d10 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32  eeBlk);.    put2
10d20 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
10d30 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73  ], iEnd);.  }els
10d40 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  e{.    /* Insert
10d50 20 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   the new freeblo
10d60 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65  ck into the free
10d70 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32  list */.    put2
10d80 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d  byte(&data[iPtr]
10d90 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  , iStart);.  }. 
10da0 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
10db0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
10dc0 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20  FAST_SECURE ){. 
10dd0 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20     /* Overwrite 
10de0 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
10df0 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
10e00 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64  hen the secure_d
10e10 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74  elete.    ** opt
10e20 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  ion is enabled *
10e30 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  /.    memset(&da
10e40 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69  ta[iStart], 0, i
10e50 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 75 74  Size);.  }.  put
10e60 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
10e70 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  rt], iFreeBlk);.
10e80 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
10e90 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a  [iStart+2], iSiz
10ea0 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
10eb0 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b  ee += iOrigSize;
10ec0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10ed0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
10ee0 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
10ef0 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
10f00 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
10f10 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
10f20 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
10f30 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
10f40 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
10f50 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a  accordingly..**.
10f60 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c  ** Only the foll
10f70 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
10f80 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64  ns are supported
10f90 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66  .  Anything diff
10fa0 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74  erent.** indicat
10fb0 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  es a corrupt dat
10fc0 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a  abase files:.**.
10fd0 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
10fe0 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20  ERODATA.**      
10ff0 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20     PTF_ZERODATA 
11000 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20  | PTF_LEAF.**   
11010 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
11020 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a  TA | PTF_INTKEY.
11030 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
11040 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
11050 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a  TKEY | PTF_LEAF.
11060 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
11070 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67  codeFlags(MemPag
11080 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
11090 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61  agByte){.  BtSha
110a0 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a  red *pBt;     /*
110b0 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65   A copy of pPage
110c0 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ->pBt */..  asse
110d0 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt( pPage->hdrOf
110e0 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67  fset==(pPage->pg
110f0 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29  no==1 ? 100 : 0)
11100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
11110 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11120 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
11130 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
11140 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67  leaf = (u8)(flag
11150 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72  Byte>>3);  asser
11160 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31  t( PTF_LEAF == 1
11170 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74  <<3 );.  flagByt
11180 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a  e &= ~PTF_LEAF;.
11190 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74    pPage->childPt
111a0 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67  rSize = 4-4*pPag
111b0 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65  e->leaf;.  pPage
111c0 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65  ->xCellSize = ce
111d0 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74  llSizePtr;.  pBt
111e0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
111f0 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28   if( flagByte==(
11200 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
11210 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20  TF_INTKEY) ){.  
11220 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
11230 3a 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38 20  : R-07291-35328 
11240 41 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30 78  A value of 5 (0x
11250 30 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  05) means the pa
11260 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20  ge is an.    ** 
11270 69 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20 62  interior table b
11280 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
11290 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
112a0 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54  LEAFDATA|PTF_INT
112b0 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f  KEY)==5 );.    /
112c0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
112d0 2d 32 36 39 30 30 2d 30 39 31 37 36 20 41 20 76  -26900-09176 A v
112e0 61 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30 64  alue of 13 (0x0d
112f0 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  ) means the page
11300 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61   is a.    ** lea
11310 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70  f table b-tree p
11320 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
11330 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54  rt( (PTF_LEAFDAT
11340 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  A|PTF_INTKEY|PTF
11350 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20  _LEAF)==13 );.  
11360 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
11370 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 1;.    if( pPa
11380 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
11390 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
113a0 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  eaf = 1;.      p
113b0 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
113c0 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c   = btreeParseCel
113d0 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  lPtr;.    }else{
113e0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  .      pPage->in
113f0 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20  tKeyLeaf = 0;.  
11400 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c      pPage->xCell
11410 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Size = cellSizeP
11420 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
11430 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
11440 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
11450 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
11460 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  d;.    }.    pPa
11470 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
11480 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20  Bt->maxLeaf;.   
11490 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
114a0 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b   = pBt->minLeaf;
114b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
114c0 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44  gByte==PTF_ZEROD
114d0 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ATA ){.    /* EV
114e0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33  IDENCE-OF: R-433
114f0 31 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75 65  16-37308 A value
11500 20 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65 61   of 2 (0x02) mea
11510 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
11520 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f  n.    ** interio
11530 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  r index b-tree p
11540 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
11550 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
11560 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20  A)==2 );.    /* 
11570 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
11580 39 36 31 35 2d 34 32 38 32 38 20 41 20 76 61 6c  9615-42828 A val
11590 75 65 20 6f 66 20 31 30 20 28 30 78 30 61 29 20  ue of 10 (0x0a) 
115a0 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
115b0 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20  s a.    ** leaf 
115c0 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67  index b-tree pag
115d0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
115e0 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c  ( (PTF_ZERODATA|
115f0 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b  PTF_LEAF)==10 );
11600 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
11610 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
11620 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
11630 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50  0;.    pPage->xP
11640 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
11650 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
11660 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  x;.    pPage->ma
11670 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
11680 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
11690 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
116a0 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
116b0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49  else{.    /* EVI
116c0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30  DENCE-OF: R-4760
116d0 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65  8-56469 Any othe
116e0 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  r value for the 
116f0 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
11700 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   is.    ** an er
11710 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ror. */.    retu
11720 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
11730 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
11740 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31   }.  pPage->max1
11750 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42  bytePayload = pB
11760 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
11770 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ad;.  return SQL
11780 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11790 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 6d 6f   Compute the amo
117a0 75 6e 74 20 6f 66 20 66 72 65 65 73 70 61 63 65  unt of freespace
117b0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 49   on the page.  I
117c0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 66  n other words, f
117d0 69 6c 6c 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50  ill.** in the pP
117e0 61 67 65 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64  age->nFree field
117f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11800 62 74 72 65 65 43 6f 6d 70 75 74 65 46 72 65 65  btreeComputeFree
11810 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
11820 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 70 63 3b  Page){.  int pc;
11830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11840 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
11850 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
11860 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
11870 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
11880 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
11890 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
118a0 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ge header */.  u
118b0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
118c0 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
118d0 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
118e0 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
118f0 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
11900 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
11910 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  each page */.  i
11920 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
11930 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
11940 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74  nused bytes on t
11950 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  he page */.  int
11960 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
11970 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
11980 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
11990 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
119a0 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f  iCellFirst;    /
119b0 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
119c0 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
119d0 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
119e0 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
119f0 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
11a00 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
11a10 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
11a20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11a30 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
11a40 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
11a50 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ->db!=0 );.  ass
11a60 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11a70 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
11a80 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
11a90 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
11aa0 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  gno==sqlite3Page
11ab0 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
11ac0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
11ad0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d   assert( pPage =
11ae0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
11af0 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
11b00 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
11b10 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
11b20 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
11b30 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
11b40 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
11b50 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
11b60 69 74 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  it==1 );.  asser
11b70 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c  t( pPage->nFree<
11b80 30 20 29 3b 0a 0a 20 20 75 73 61 62 6c 65 53 69  0 );..  usableSi
11b90 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
11ba0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 68  >usableSize;.  h
11bb0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
11bc0 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20  ffset;.  data = 
11bd0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
11be0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
11bf0 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68  R-58015-48175 Th
11c00 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
11c10 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64  er at offset 5 d
11c20 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74  esignates.  ** t
11c30 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
11c40 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
11c50 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20  a. A zero value 
11c60 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65 72  for this integer
11c70 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72   is.  ** interpr
11c80 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a  eted as 65536. *
11c90 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  /.  top = get2by
11ca0 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
11cb0 68 64 72 2b 35 5d 29 3b 0a 20 20 69 43 65 6c 6c  hdr+5]);.  iCell
11cc0 46 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20  First = hdr + 8 
11cd0 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
11ce0 72 53 69 7a 65 20 2b 20 32 2a 70 50 61 67 65 2d  rSize + 2*pPage-
11cf0 3e 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c  >nCell;.  iCellL
11d00 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
11d10 20 2d 20 34 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70   - 4;..  /* Comp
11d20 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72  ute the total fr
11d30 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ee space on the 
11d40 70 61 67 65 0a 20 20 2a 2a 20 45 56 49 44 45 4e  page.  ** EVIDEN
11d50 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33  CE-OF: R-23588-3
11d60 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74  4450 The two-byt
11d70 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
11d80 73 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a  set 1 gives the.
11d90 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68    ** start of th
11da0 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63  e first freebloc
11db0 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f  k on the page, o
11dc0 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  r is zero if the
11dd0 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66  re are no.  ** f
11de0 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20  reeblocks. */.  
11df0 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
11e00 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e  ata[hdr+1]);.  n
11e10 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
11e20 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e  7] + top;  /* In
11e30 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d  it nFree to non-
11e40 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73  freeblock free s
11e50 70 61 63 65 20 2a 2f 0a 20 20 69 66 28 20 70 63  pace */.  if( pc
11e60 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 65  >0 ){.    u32 ne
11e70 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66  xt, size;.    if
11e80 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
11e90 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  ){.      /* EVID
11ea0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30  ENCE-OF: R-55530
11eb0 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c  -52930 In a well
11ec0 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70  -formed b-tree p
11ed0 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a  age, there will.
11ee0 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
11ef0 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
11f00 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20  cell before the 
11f10 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e  first freeblock.
11f20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11f30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
11f40 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
11f50 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  ); .    }.    wh
11f60 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20  ile( 1 ){.      
11f70 69 66 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74  if( pc>iCellLast
11f80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
11f90 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74 68 65  reeblock off the
11fa0 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
11fb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
11fc0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
11fd0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
11fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78       }.      nex
11ff0 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
12000 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73  ta[pc]);.      s
12010 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
12020 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
12030 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65     nFree = nFree
12040 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69   + size;.      i
12050 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  f( next<=pc+size
12060 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  +3 ) break;.    
12070 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20    pc = next;.   
12080 20 7d 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e   }.    if( next>
12090 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72  0 ){.      /* Fr
120a0 65 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20 61  eeblock not in a
120b0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a  scending order *
120c0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
120d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
120e0 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
120f0 0a 20 20 20 20 69 66 28 20 70 63 2b 73 69 7a 65  .    if( pc+size
12100 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 75  >(unsigned int)u
12110 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
12120 20 20 20 2f 2a 20 4c 61 73 74 20 66 72 65 65 62     /* Last freeb
12130 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70 61 73  lock extends pas
12140 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20  t page end */.  
12150 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12160 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
12170 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
12180 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
12190 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
121a0 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
121b0 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
121c0 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
121d0 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
121e0 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e   area plus the n
121f0 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79  umber of free by
12200 74 65 73 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20  tes within.  ** 
12210 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
12220 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69   area. If this i
12230 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
12240 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20  he usable-size. 
12250 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c   ** of the page,
12260 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
12270 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  ust be corrupted
12280 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73  . This check als
12290 6f 0a 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f  o.  ** serves to
122a0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
122b0 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
122c0 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
122d0 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 61 72  -content.  ** ar
122e0 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ea, according to
122f0 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
12300 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68  , lies within th
12310 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  e page..  */.  i
12320 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53  f( nFree>usableS
12330 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
12340 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
12350 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
12360 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  }.  pPage->nFree
12370 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d   = (u16)(nFree -
12380 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20   iCellFirst);.  
12390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
123a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 64  ;.}../*.** Do ad
123b0 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20  ditional sanity 
123c0 63 68 65 63 6b 20 61 66 74 65 72 20 62 74 72 65  check after btre
123d0 65 49 6e 69 74 50 61 67 65 28 29 20 69 66 0a 2a  eInitPage() if.*
123e0 2a 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69  * PRAGMA cell_si
123f0 7a 65 5f 63 68 65 63 6b 3d 4f 4e 20 0a 2a 2f 0a  ze_check=ON .*/.
12400 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
12410 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65  INLINE int btree
12420 43 65 6c 6c 53 69 7a 65 43 68 65 63 6b 28 4d 65  CellSizeCheck(Me
12430 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
12440 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
12450 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
12460 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  owable cell or f
12470 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
12480 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  */.  int iCellLa
12490 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
124a0 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
124b0 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
124c0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
124d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
124e0 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c  ex into the cell
124f0 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
12500 2f 0a 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20  /.  int sz;     
12510 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
12520 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
12530 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
12540 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
12550 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
12560 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
12570 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
12580 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
12590 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
125a0 61 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  a */.  int usabl
125b0 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 4d 61 78  eSize;    /* Max
125c0 69 6d 75 6d 20 75 73 61 62 6c 65 20 73 70 61 63  imum usable spac
125d0 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  e on the page */
125e0 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
125f0 74 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f  t;    /* Start o
12600 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  f cell content a
12610 72 65 61 20 2a 2f 0a 0a 20 20 69 43 65 6c 6c 46  rea */..  iCellF
12620 69 72 73 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  irst = pPage->ce
12630 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
12640 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 75 73 61  ge->nCell;.  usa
12650 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
12660 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
12670 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20  ;.  iCellLast = 
12680 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
12690 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
126a0 61 44 61 74 61 3b 0a 20 20 63 65 6c 6c 4f 66 66  aData;.  cellOff
126b0 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
126c0 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66 28 20 21  lOffset;.  if( !
126d0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
126e0 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 66 6f 72  ellLast--;.  for
126f0 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
12700 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
12710 70 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c 69  pc = get2byteAli
12720 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f  gned(&data[cellO
12730 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
12740 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
12750 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
12760 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
12770 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
12780 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
12790 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
127a0 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
127b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
127c0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
127d0 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20 70 50 61    }.    sz = pPa
127e0 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
127f0 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
12800 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
12810 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
12820 20 29 3b 0a 20 20 20 20 69 66 28 20 70 63 2b 73   );.    if( pc+s
12830 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  z>usableSize ){.
12840 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12850 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
12860 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
12870 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12880 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12890 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
128a0 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
128b0 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
128c0 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
128d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
128e0 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
128f0 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
12900 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
12910 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
12920 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
12930 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
12940 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
12950 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
12960 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
12970 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
12980 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
12990 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
129a0 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
129b0 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
129c0 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
129d0 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
129e0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
129f0 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
12a00 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
12a10 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
12a20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
12a30 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
12a40 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
12a50 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
12a60 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
12a70 63 74 75 72 65 20 2a 2f 0a 0a 20 20 61 73 73 65  cture */..  asse
12a80 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
12a90 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
12aa0 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30  Page->pBt->db!=0
12ab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
12ac0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12ad0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
12ae0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
12af0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
12b00 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
12b10 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
12b20 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
12b30 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
12b40 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
12b50 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
12b60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
12b70 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
12b80 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
12b90 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
12ba0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
12bb0 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  age->isInit==0 )
12bc0 3b 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  ;..  pBt = pPage
12bd0 2d 3e 70 42 74 3b 0a 20 20 64 61 74 61 20 3d 20  ->pBt;.  data = 
12be0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2b 20 70  pPage->aData + p
12bf0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
12c00 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
12c10 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30  F: R-28594-02890
12c20 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c   The one-byte fl
12c30 61 67 20 61 74 20 6f 66 66 73 65 74 20 30 20 69  ag at offset 0 i
12c40 6e 64 69 63 61 74 69 6e 67 0a 20 20 2a 2a 20 74  ndicating.  ** t
12c50 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74  he b-tree page t
12c60 79 70 65 2e 20 2a 2f 0a 20 20 69 66 28 20 64 65  ype. */.  if( de
12c70 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
12c80 20 64 61 74 61 5b 30 5d 29 20 29 7b 0a 20 20 20   data[0]) ){.   
12c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
12ca0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
12cb0 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  e);.  }.  assert
12cc0 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
12cd0 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
12ce0 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
12cf0 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
12d00 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
12d10 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
12d20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
12d30 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 63   = 0;.  pPage->c
12d40 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
12d50 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 38  e->hdrOffset + 8
12d60 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
12d70 74 72 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d  trSize;.  pPage-
12d80 3e 61 43 65 6c 6c 49 64 78 20 3d 20 64 61 74 61  >aCellIdx = data
12d90 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
12da0 74 72 53 69 7a 65 20 2b 20 38 3b 0a 20 20 70 50  trSize + 8;.  pP
12db0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
12dc0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2b 20 70  pPage->aData + p
12dd0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
12de0 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66    pPage->aDataOf
12df0 73 74 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  st = pPage->aDat
12e00 61 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  a + pPage->child
12e10 50 74 72 53 69 7a 65 3b 0a 20 20 2f 2a 20 45 56  PtrSize;.  /* EV
12e20 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30  IDENCE-OF: R-370
12e30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f  02-32774 The two
12e40 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
12e50 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20   offset 3 gives 
12e60 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  the.  ** number 
12e70 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
12e80 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61 67 65  page. */.  pPage
12e90 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
12ea0 74 65 28 26 64 61 74 61 5b 33 5d 29 3b 0a 20 20  te(&data[3]);.  
12eb0 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
12ec0 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
12ed0 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20  .    /* To many 
12ee0 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
12ef0 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
12f00 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
12f10 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  pt */.    return
12f20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
12f30 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d  PAGE(pPage);.  }
12f40 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
12f50 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45  ge->nCell==MX_CE
12f60 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 2f 2a 20  LL(pBt) );.  /* 
12f70 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
12f80 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61 20  4089-57979 If a 
12f90 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
12fa0 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73   cells (which is
12fb0 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73 73 69   only.  ** possi
12fc0 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70  ble for a root p
12fd0 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74  age of a table t
12fe0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  hat contains no 
12ff0 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20  rows) then the. 
13000 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68   ** offset to th
13010 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
13020 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74  rea will equal t
13030 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e  he page size min
13040 75 73 20 74 68 65 0a 20 20 2a 2a 20 62 79 74 65  us the.  ** byte
13050 73 20 6f 66 20 72 65 73 65 72 76 65 64 20 73 70  s of reserved sp
13060 61 63 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ace. */.  assert
13070 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
13080 0a 20 20 20 20 20 20 20 7c 7c 20 67 65 74 32 62  .       || get2b
13090 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
130a0 5b 35 5d 29 3d 3d 28 69 6e 74 29 70 42 74 2d 3e  [5])==(int)pBt->
130b0 75 73 61 62 6c 65 53 69 7a 65 0a 20 20 20 20 20  usableSize.     
130c0 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
130d0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
130e0 65 20 3d 20 2d 31 3b 20 20 2f 2a 20 49 6e 64 69  e = -1;  /* Indi
130f0 63 61 74 65 20 74 68 61 74 20 74 68 69 73 20 76  cate that this v
13100 61 6c 75 65 20 69 73 20 79 65 74 20 75 6e 63 6f  alue is yet unco
13110 6d 70 75 74 65 64 20 2a 2f 0a 20 20 70 50 61 67  mputed */.  pPag
13120 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
13130 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c   if( pBt->db->fl
13140 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c  ags & SQLITE_Cel
13150 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 72  lSizeCk ){.    r
13160 65 74 75 72 6e 20 62 74 72 65 65 43 65 6c 6c 53  eturn btreeCellS
13170 69 7a 65 43 68 65 63 6b 28 70 50 61 67 65 29 3b  izeCheck(pPage);
13180 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
13190 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
131a0 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
131b0 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
131c0 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
131d0 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
131e0 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
131f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13200 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
13210 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
13220 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
13230 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
13240 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
13250 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
13260 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64  ge->pBt;.  u8 hd
13270 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
13280 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73  fset;.  u16 firs
13290 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
132a0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
132b0 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
132c0 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
132d0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
132e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
132f0 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
13300 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
13310 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
13320 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
13330 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
13340 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a  age) == data );.
13350 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13360 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
13370 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
13380 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
13390 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
133a0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
133b0 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
133c0 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f  lags & BTS_FAST_
133d0 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20 6d 65  SECURE ){.    me
133e0 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
133f0 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
13400 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a  ize - hdr);.  }.
13410 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63    data[hdr] = (c
13420 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72  har)flags;.  fir
13430 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61  st = hdr + ((fla
13440 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20  gs&PTF_LEAF)==0 
13450 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d  ? 12 : 8);.  mem
13460 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
13470 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b  , 0, 4);.  data[
13480 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75  hdr+7] = 0;.  pu
13490 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
134a0 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  +5], pBt->usable
134b0 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
134c0 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42  nFree = (u16)(pB
134d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
134e0 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65  first);.  decode
134f0 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61  Flags(pPage, fla
13500 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  gs);.  pPage->ce
13510 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74  llOffset = first
13520 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
13530 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d  End = &data[pBt-
13540 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  >usableSize];.  
13550 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
13560 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a  = &data[first];.
13570 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66    pPage->aDataOf
13580 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  st = &data[pPage
13590 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b  ->childPtrSize];
135a0 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
135b0 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  low = 0;.  asser
135c0 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
135d0 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
135e0 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
135f0 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
13600 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
13610 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
13620 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
13630 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  0;.  pPage->isIn
13640 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  it = 1;.}.../*.*
13650 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61  * Convert a DbPa
13660 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ge obtained from
13670 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20   the pager into 
13680 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62  a MemPage used b
13690 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c  y.** the btree l
136a0 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ayer..*/.static 
136b0 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
136c0 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50  geFromDbPage(DbP
136d0 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67  age *pDbPage, Pg
136e0 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65  no pgno, BtShare
136f0 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
13700 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d  ge *pPage = (Mem
13710 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67  Page*)sqlite3Pag
13720 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61  erGetExtra(pDbPa
13730 67 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21  ge);.  if( pgno!
13740 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a  =pPage->pgno ){.
13750 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
13760 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
13770 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
13780 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62 50  .    pPage->pDbP
13790 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  age = pDbPage;. 
137a0 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20     pPage->pBt = 
137b0 70 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  pBt;.    pPage->
137c0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
137d0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
137e0 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  t = pgno==1 ? 10
137f0 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  0 : 0;.  }.  ass
13800 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
13810 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47  a==sqlite3PagerG
13820 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20  etData(pDbPage) 
13830 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
13840 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e; .}../*.** Get
13850 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
13860 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c   pager.  Initial
13870 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
13880 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
13890 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
138a0 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65  s if needed.  Se
138b0 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74  e also: btreeGet
138c0 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a  UnusedPage()..**
138d0 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45 52  .** If the PAGER
138e0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66  _GET_NOCONTENT f
138f0 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d  lag is set, it m
13900 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
13910 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75  not care.** abou
13920 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
13930 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
13940 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e  s time.  So do n
13950 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ot go to the dis
13960 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68  k.** to fetch th
13970 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74  e content.  Just
13980 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e   fill in the con
13990 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20  tent with zeros 
139a0 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69  for now..** If i
139b0 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20  n the future we 
139c0 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
139d0 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73  rWrite() on this
139e0 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d   page, that.** m
139f0 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61  eans we have sta
13a00 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65  rted to be conce
13a10 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65  rned about conte
13a20 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a  nt and the disk.
13a30 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f  ** read should o
13a40 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69  ccur at that poi
13a50 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
13a60 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a  t btreeGetPage(.
13a70 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
13a80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
13a90 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
13aa0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
13ab0 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
13ac0 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
13ad0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
13ae0 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
13af0 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
13b00 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
13b10 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
13b20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
13b30 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20  ET_NOCONTENT or 
13b40 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
13b50 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  LY */.){.  int r
13b60 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
13b70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
13b80 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
13b90 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f  gs==PAGER_GET_NO
13ba0 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73  CONTENT || flags
13bb0 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ==PAGER_GET_READ
13bc0 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74  ONLY );.  assert
13bd0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13be0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
13bf0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
13c00 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
13c10 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44  pPager, pgno, (D
13c20 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65  bPage**)&pDbPage
13c30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
13c40 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
13c50 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65    *ppPage = btre
13c60 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
13c70 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
13c80 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Bt);.  return SQ
13c90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13ca0 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67  * Retrieve a pag
13cb0 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
13cc0 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72   cache. If the r
13cd0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
13ce0 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20   not.** already 
13cf0 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
13d00 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  he return NULL. 
13d10 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
13d20 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
13d30 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
13d40 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
13d50 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  ed..*/.static Me
13d60 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
13d70 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20  Lookup(BtShared 
13d80 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
13d90 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
13da0 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  age;.  assert( s
13db0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13dc0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
13dd0 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c  .  pDbPage = sql
13de0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
13df0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
13e00 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67  o);.  if( pDbPag
13e10 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
13e20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
13e30 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
13e40 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  o, pBt);.  }.  r
13e50 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
13e60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
13e70 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
13e80 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e  e file in pages.
13e90 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   If there is any
13ea0 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f   kind of.** erro
13eb0 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69  r, return ((unsi
13ec0 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f  gned int)-1)..*/
13ed0 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72  .static Pgno btr
13ee0 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68  eePagecount(BtSh
13ef0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65  ared *pBt){.  re
13f00 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b  turn pBt->nPage;
13f10 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74  .}.u32 sqlite3Bt
13f20 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65  reeLastPage(Btre
13f30 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
13f40 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
13f50 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
13f60 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74  assert( ((p->pBt
13f70 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30  ->nPage)&0x80000
13f80 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  000)==0 );.  ret
13f90 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75  urn btreePagecou
13fa0 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f  nt(p->pBt);.}../
13fb0 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
13fc0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
13fd0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
13fe0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21  ..**.** If pCur!
13ff0 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  =0 then the page
14000 20 69 73 20 62 65 69 6e 67 20 66 65 74 63 68 65   is being fetche
14010 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d  d as part of a m
14020 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20  oveToChild().** 
14030 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69  call.  Do additi
14040 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63  onal sanity chec
14050 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
14060 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
14070 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74  * And if the fet
14080 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72  ch fails, this r
14090 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72  outine must decr
140a0 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67  ement pCur->iPag
140b0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e..**.** The pag
140c0 65 20 69 73 20 66 65 74 63 68 65 64 20 61 73 20  e is fetched as 
140d0 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73  read-write unles
140e0 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55  s pCur is not NU
140f0 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72  LL and is.** a r
14100 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e  ead-only cursor.
14110 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
14120 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
14130 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64 65 66  *ppPage is undef
14140 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
14150 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
14160 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
14170 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
14180 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
14190 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
141a0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
141b0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
141c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
141d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
141e0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
141f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14200 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
14210 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
14220 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
14230 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
14240 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
14250 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
14260 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  re */.  BtCursor
14270 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
14280 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
14290 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65  r to receive the
142a0 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a   page, or NULL *
142b0 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c  /.  int bReadOnl
142c0 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
142d0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
142e0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65  a read-only page
142f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
14300 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
14310 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
14320 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
14330 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
14340 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
14350 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43  0 || ppPage==&pC
14360 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61  ur->pPage );.  a
14370 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c  ssert( pCur==0 |
14380 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75  | bReadOnly==pCu
14390 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
143a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
143b0 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69  ur==0 || pCur->i
143c0 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28  Page>0 );..  if(
143d0 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63   pgno>btreePagec
143e0 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
143f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
14400 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
14410 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
14420 67 65 5f 65 72 72 6f 72 31 3b 0a 20 20 7d 0a 20  ge_error1;.  }. 
14430 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
14440 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
14450 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65  r, pgno, (DbPage
14460 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52 65  **)&pDbPage, bRe
14470 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72  adOnly);.  if( r
14480 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65  c ){.    goto ge
14490 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
144a0 6f 72 31 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61  or1;.  }.  *ppPa
144b0 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
144c0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
144d0 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
144e0 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69  if( (*ppPage)->i
144f0 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  sInit==0 ){.    
14500 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
14510 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
14520 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20  o, pBt);.    rc 
14530 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
14540 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  *ppPage);.    if
14550 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14560 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65  ){.      goto ge
14570 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
14580 6f 72 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  or2;.    }.  }. 
14590 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
145a0 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
145b0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
145c0 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71  Page)->aData==sq
145d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
145e0 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  a(pDbPage) );.. 
145f0 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67   /* If obtaining
14600 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f   a child page fo
14610 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d  r a cursor, we m
14620 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20  ust verify that 
14630 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a  the page is.  **
14640 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
14650 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20   the root page. 
14660 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26  */.  if( pCur &&
14670 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65   ((*ppPage)->nCe
14680 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65  ll<1 || (*ppPage
14690 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d  )->intKey!=pCur-
146a0 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20  >curIntKey) ){. 
146b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
146c0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f  ORRUPT_PGNO(pgno
146d0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  );.    goto getA
146e0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
146f0 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
14700 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41  SQLITE_OK;..getA
14710 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
14720 32 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  2:.  releasePage
14730 28 2a 70 70 50 61 67 65 29 3b 0a 67 65 74 41 6e  (*ppPage);.getAn
14740 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 31  dInitPage_error1
14750 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a  :.  if( pCur ){.
14760 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d      pCur->iPage-
14770 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61  -;.    pCur->pPa
14780 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
14790 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
147a0 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
147b0 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73  pgno==0 );.  ass
147c0 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20  ert( pgno!=0 || 
147d0 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  rc==SQLITE_CORRU
147e0 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  PT );.  return r
147f0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
14800 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
14810 52 45 4e 54 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20  RENT./* .** Set 
14820 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
14830 20 4d 65 6d 50 61 67 65 2e 70 67 6e 6f 52 6f 6f   MemPage.pgnoRoo
14840 74 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 69  t variable, if i
14850 74 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 73 74 61  t exists..*/.sta
14860 74 69 63 20 76 6f 69 64 20 73 65 74 4d 65 6d 70  tic void setMemp
14870 61 67 65 52 6f 6f 74 28 4d 65 6d 50 61 67 65 20  ageRoot(MemPage 
14880 2a 70 50 67 2c 20 75 33 32 20 70 67 6e 6f 52 6f  *pPg, u32 pgnoRo
14890 6f 74 29 7b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f  ot){.  pPg->pgno
148a0 52 6f 6f 74 20 3d 20 70 67 6e 6f 52 6f 6f 74 3b  Root = pgnoRoot;
148b0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
148c0 65 20 73 65 74 4d 65 6d 70 61 67 65 52 6f 6f 74  e setMempageRoot
148d0 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x,y).#endif../*
148e0 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
148f0 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
14900 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
14910 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
14920 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72  r.** call to btr
14930 65 65 47 65 74 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  eeGetPage..**.**
14940 20 50 61 67 65 31 20 69 73 20 61 20 73 70 65 63   Page1 is a spec
14950 69 61 6c 20 63 61 73 65 20 61 6e 64 20 6d 75 73  ial case and mus
14960 74 20 62 65 20 72 65 6c 65 61 73 65 64 20 75 73  t be released us
14970 69 6e 67 20 72 65 6c 65 61 73 65 50 61 67 65 4f  ing releasePageO
14980 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ne()..*/.static 
14990 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
149a0 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20  NotNull(MemPage 
149b0 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  *pPage){.  asser
149c0 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
149d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
149e0 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
149f0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50  ert( pPage->pDbP
14a00 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  age!=0 );.  asse
14a10 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
14a20 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
14a30 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
14a40 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
14a50 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
14a60 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
14a70 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
14a80 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
14a90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14aa0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
14ab0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
14ac0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
14ad0 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e  fNotNull(pPage->
14ae0 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74  pDbPage);.}.stat
14af0 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
14b00 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
14b10 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
14b20 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f   ) releasePageNo
14b30 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a  tNull(pPage);.}.
14b40 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
14b50 61 73 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61  asePageOne(MemPa
14b60 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73  ge *pPage){.  as
14b70 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20 29  sert( pPage!=0 )
14b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
14b90 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
14ba0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
14bb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
14bc0 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
14bd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
14be0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
14bf0 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
14c00 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
14c10 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
14c20 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
14c30 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
14c40 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
14c50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
14c60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
14c70 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
14c80 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
14c90 50 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e  PagerUnrefPageOn
14ca0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
14cb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  );.}../*.** Get 
14cc0 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a  an unused page..
14cd0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
14ce0 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65   just like btree
14cf0 47 65 74 50 61 67 65 28 29 20 77 69 74 68 20 74  GetPage() with t
14d00 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a  he addition:.**.
14d10 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20 70  **   *  If the p
14d20 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
14d30 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f  n use for some o
14d40 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d  ther purpose, im
14d50 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20  mediately.**    
14d60 20 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64    release it and
14d70 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
14d80 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e  E_CURRUPT error.
14d90 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75  .**   *  Make su
14da0 72 65 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c  re the isInit fl
14db0 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73  ag is clear.*/.s
14dc0 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
14dd0 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20  etUnusedPage(.  
14de0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
14df0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
14e00 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
14e10 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
14e20 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
14e30 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  e to fetch */.  
14e40 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
14e50 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
14e60 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
14e70 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
14e80 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
14e90 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
14ea0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41  _NOCONTENT or PA
14eb0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
14ec0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
14ed0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
14ee0 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  Bt, pgno, ppPage
14ef0 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
14f00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14f10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14f20 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
14f30 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
14f40 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
14f50 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
14f60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70  Page);.      *pp
14f70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
14f80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
14f90 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
14fa0 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d  }.    (*ppPage)-
14fb0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
14fc0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
14fd0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
14fe0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
14ff0 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  * During a rollb
15000 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61  ack, when the pa
15010 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f  ger reloads info
15020 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  rmation into the
15030 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61   cache.** so tha
15040 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72  t the cache is r
15050 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
15060 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74  riginal state at
15070 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
15080 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15090 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  , for each page 
150a0 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f  restored this ro
150b0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
150c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
150d0 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73  ine needs to res
150e0 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74  et the extra dat
150f0 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65  a section at the
15100 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70   end of the.** p
15110 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74  age to agree wit
15120 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64  h the restored d
15130 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
15140 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44  oid pageReinit(D
15150 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20  bPage *pData){. 
15160 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
15170 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
15180 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
15190 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
151a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
151b0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
151c0 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29  count(pData)>0 )
151d0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
151e0 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73  sInit ){.    ass
151f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15200 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
15210 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
15220 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
15230 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
15240 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
15250 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29  count(pData)>1 )
15260 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  {.      /* pPage
15270 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20   might not be a 
15280 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20  btree page;  it 
15290 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72  might be an over
152a0 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20  flow page.      
152b0 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67  ** or ptrmap pag
152c0 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65  e or a free page
152d0 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65  .  In those case
152e0 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  s, the following
152f0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74  .      ** call t
15300 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  o btreeInitPage(
15310 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  ) will likely re
15320 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
15330 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75  UPT..      ** Bu
15340 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e  t no harm is don
15350 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20  e by this.  And 
15360 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72  it is very impor
15370 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20  tant that.      
15380 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
15390 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  () be called on 
153a0 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65  every btree page
153b0 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20   so we make.    
153c0 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f    ** the call fo
153d0 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  r every page tha
153e0 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72  t comes in for r
153f0 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  e-initing. */.  
15400 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67      btreeInitPag
15410 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  e(pPage);.    }.
15420 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
15430 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
15440 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65  dler for a btree
15450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15460 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
15470 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72  andler(void *pAr
15480 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
15490 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a  pBt = (BtShared*
154a0 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28  )pArg;.  assert(
154b0 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73   pBt->db );.  as
154c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
154d0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62  tex_held(pBt->db
154e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
154f0 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f  turn sqlite3Invo
15500 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70  keBusyHandler(&p
15510 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64  Bt->db->busyHand
15520 6c 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ler,.           
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15540 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
15550 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
15560 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ger));.}../*.** 
15570 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
15580 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
15590 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
155a0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
155b0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
155c0 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
155d0 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65  * then an epheme
155e0 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  ral database is 
155f0 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65 70  created.  The ep
15600 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
15610 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63   might.** be exc
15620 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f  lusively in memo
15630 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ry, or it might 
15640 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64  use a disk-based
15650 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a   memory cache..*
15660 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  * Either way, th
15670 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
15680 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74  base will be aut
15690 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
156a0 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69  ed .** when sqli
156b0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
156c0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
156d0 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
156e0 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
156f0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
15700 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
15710 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
15720 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
15730 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
15740 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
15750 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65  e "flags" parame
15760 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
15770 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74   that might cont
15780 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a  ain bits like.**
15790 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
157a0 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45  NAL and/or BTREE
157b0 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49  _MEMORY..**.** I
157c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
157d0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
157e0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
157f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
15800 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69  .** and we are i
15810 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d  n shared cache m
15820 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70  ode, then the op
15830 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  en will fail wit
15840 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  h an.** SQLITE_C
15850 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e  ONSTRAINT error.
15860 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f    We cannot allo
15870 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74  w two or more Bt
15880 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74  Shared.** object
15890 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  s in the same da
158a0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
158b0 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f  n since doing so
158c0 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f   will lead.** to
158d0 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c   problems with l
158e0 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ocking..*/.int s
158f0 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
15900 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
15910 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46  pVfs,      /* VF
15920 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
15930 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f  s b-tree */.  co
15940 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
15950 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
15960 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
15970 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
15980 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
15990 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
159a0 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
159b0 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
159c0 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
159d0 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
159e0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
159f0 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
15a00 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
15a10 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
15a20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
15a30 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ons */.  int vfs
15a40 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
15a50 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
15a60 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
15a70 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
15a80 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
15a90 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20   *pBt = 0;      
15aa0 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
15ab0 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
15ac0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
15ad0 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15af0 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  Handle to return
15b00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
15b10 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d  tex *mutexOpen =
15b20 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73   0;  /* Prevents
15b30 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
15b40 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20  n. Ticket #3537 
15b50 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
15b60 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
15b70 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
15b80 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  de from this fun
15b90 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52  ction */.  u8 nR
15ba0 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
15bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
15bc0 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  e of unused spac
15bd0 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
15be0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
15bf0 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d  r zDbHeader[100]
15c00 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68  ;  /* Database h
15c10 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f  eader content */
15c20 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f  ..  /* True if o
15c30 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  pening an epheme
15c40 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64  ral, temporary d
15c50 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
15c60 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20  st int isTempDb 
15c70 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  = zFilename==0 |
15c80 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
15c90 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  0;..  /* Set the
15ca0 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64   variable isMemd
15cb0 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e  b to true for an
15cc0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
15cd0 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61  ase, or .  ** fa
15ce0 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62  lse for a file-b
15cf0 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  ased database.. 
15d00 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
15d10 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
15d20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
15d30 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20  mdb = 0;.#else. 
15d40 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
15d50 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20  db = (zFilename 
15d60 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  && strcmp(zFilen
15d70 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29  ame, ":memory:")
15d80 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==0).           
15d90 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
15da0 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69  isTempDb && sqli
15db0 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
15dc0 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  db)).           
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
15de0 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
15df0 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d  E_OPEN_MEMORY)!=
15e00 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  0;.#endif..  ass
15e10 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
15e20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30 20  assert( pVfs!=0 
15e30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
15e40 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15e50 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
15e60 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26 30  assert( (flags&0
15e70 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20  xff)==flags );  
15e80 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e   /* flags fit in
15e90 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a   8 bits */..  /*
15ea0 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49   Only a BTREE_SI
15eb0 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63 61  NGLE database ca
15ec0 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44  n be BTREE_UNORD
15ed0 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74  ERED */.  assert
15ee0 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
15ef0 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c  _UNORDERED)==0 |
15f00 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  | (flags & BTREE
15f10 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a  _SINGLE)!=0 );..
15f20 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e    /* A BTREE_SIN
15f30 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73 20  GLE database is 
15f40 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61  always a tempora
15f50 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65  ry and/or epheme
15f60 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ral */.  assert(
15f70 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
15f80 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73  SINGLE)==0 || is
15f90 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28  TempDb );..  if(
15fa0 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
15fb0 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d  flags |= BTREE_M
15fc0 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28  EMORY;.  }.  if(
15fd0 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
15fe0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
15ff0 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  )!=0 && (isMemdb
16000 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b   || isTempDb) ){
16010 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20  .    vfsFlags = 
16020 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c  (vfsFlags & ~SQL
16030 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
16040 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ) | SQLITE_OPEN_
16050 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70  TEMP_DB;.  }.  p
16060 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
16070 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
16080 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
16090 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
160a0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
160b0 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
160c0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
160d0 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e  p->db = db;.#ifn
160e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
160f0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70  SHARED_CACHE.  p
16100 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20  ->lock.pBtree = 
16110 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p;.  p->lock.iTa
16120 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ble = 1;.#endif.
16130 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
16140 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
16150 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
16160 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
16170 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
16180 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
16190 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
161a0 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
161b0 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
161c0 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
161d0 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
161e0 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
161f0 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
16200 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28  isTempDb==0 && (
16210 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76  isMemdb==0 || (v
16220 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
16230 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a  PEN_URI)!=0) ){.
16240 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
16250 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
16260 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
16270 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d      int nFilenam
16280 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
16290 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31  n30(zFilename)+1
162a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  ;.      int nFul
162b0 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
162c0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
162d0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
162e0 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
162f0 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46  te3Malloc(MAX(nF
16300 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c  ullPathname,nFil
16310 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d  ename));.      M
16320 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
16330 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
16340 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20  Shared; )..     
16350 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
16360 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75  ;.      if( !zFu
16370 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
16380 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
16390 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ee(p);.        r
163a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
163b0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
163c0 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d  .      if( isMem
163d0 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  db ){.        me
163e0 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61  mcpy(zFullPathna
163f0 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  me, zFilename, n
16400 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
16410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16420 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
16430 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
16440 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
16450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
16470 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
16480 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
16490 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
164a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
164b0 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
164c0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
164d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
164e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
164f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
16500 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  .      }.#if SQL
16510 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
16520 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d       mutexOpen =
16530 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
16540 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
16550 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20  STATIC_OPEN);.  
16560 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
16570 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65  x_enter(mutexOpe
16580 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53  n);.      mutexS
16590 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
165a0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
165b0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
165c0 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c  STER);.      sql
165d0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
165e0 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23  (mutexShared);.#
165f0 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28  endif.      for(
16600 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61  pBt=GLOBAL(BtSha
16610 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
16620 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42  edCacheList); pB
16630 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
16640 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
16650 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
16660 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
16670 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
16680 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
16690 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
166a0 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20  ->pPager, 0)).  
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
166c0 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66  & sqlite3PagerVf
166d0 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  s(pBt->pPager)==
166e0 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pVfs ){.        
166f0 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
16700 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d       for(iDb=db-
16710 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20  >nDb-1; iDb>=0; 
16720 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  iDb--){.        
16730 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73      Btree *pExis
16740 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69  ting = db->aDb[i
16750 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20  Db].pBt;.       
16760 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69       if( pExisti
16770 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d  ng && pExisting-
16780 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20  >pBt==pBt ){.   
16790 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
167a0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
167b0 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
167c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
167d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
167e0 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
167f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16800 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
16810 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
16820 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
16830 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
16840 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16850 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
16860 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16880 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
16890 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52           pBt->nR
168a0 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
168b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
168c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
168d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
168e0 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
168f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
16900 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
16910 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
16920 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
16930 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
16940 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   In debug mode, 
16950 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73  we mark all pers
16960 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73  istent databases
16970 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20   as sharable.   
16980 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20     ** even when 
16990 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54  they are not.  T
169a0 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68  his exercises th
169b0 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61  e locking code a
169c0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65  nd.      ** give
169d0 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  s more opportuni
169e0 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73  ty for asserts(s
169f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16a00 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74  d()).      ** st
16a10 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64  atements to find
16a20 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d   locking problem
16a30 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
16a40 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
16a50 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
16a60 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
16a70 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pBt==0 ){.    /
16a80 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
16a90 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
16aa0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
16ab0 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
16ac0 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
16ad0 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
16ae0 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
16af0 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
16b00 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
16b10 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  t result.    ** 
16b20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
16b30 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
16b40 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20  chitecture..    
16b50 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
16b60 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b  izeof(i64)==8 );
16b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
16b80 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20  eof(u64)==8 );. 
16b90 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
16ba0 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u32)==4 );.   
16bb0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
16bc0 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61  u16)==2 );.    a
16bd0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67  ssert( sizeof(Pg
16be0 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20  no)==4 );.  .   
16bf0 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61   pBt = sqlite3Ma
16c00 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
16c10 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66  (*pBt) );.    if
16c20 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
16c30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
16c40 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
16c50 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
16c60 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
16c70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16c80 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
16c90 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
16ca0 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
16cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
16cc0 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 2c 20 66  zeof(MemPage), f
16cd0 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20  lags, vfsFlags, 
16ce0 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20  pageReinit);.   
16cf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
16d10 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
16d20 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
16d30 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20  , db->szMmap);. 
16d40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16d50 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
16d60 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  ader(pBt->pPager
16d70 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65  ,sizeof(zDbHeade
16d80 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20  r),zDbHeader);. 
16d90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
16da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16db0 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
16dc0 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
16dd0 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67     pBt->openFlag
16de0 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20  s = (u8)flags;. 
16df0 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b     pBt->db = db;
16e00 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
16e10 72 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28  rSetBusyHandler(
16e20 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72  pBt->pPager, btr
16e30 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
16e40 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70  ler, pBt);.    p
16e50 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a  ->pBt = pBt;.  .
16e60 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
16e70 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70   = 0;.    pBt->p
16e80 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69  Page1 = 0;.    i
16e90 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  f( sqlite3PagerI
16ea0 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70  sreadonly(pBt->p
16eb0 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74  Pager) ) pBt->bt
16ec0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
16ed0 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 20 64 65 66  AD_ONLY;.#if def
16ee0 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 45 43 55  ined(SQLITE_SECU
16ef0 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70  RE_DELETE).    p
16f00 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
16f10 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
16f20 45 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  E;.#elif defined
16f30 28 53 51 4c 49 54 45 5f 46 41 53 54 5f 53 45 43  (SQLITE_FAST_SEC
16f40 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20  URE_DELETE).    
16f50 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
16f60 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3b 0a   BTS_OVERWRITE;.
16f70 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56  #endif.    /* EV
16f80 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38  IDENCE-OF: R-518
16f90 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67  73-39618 The pag
16fa0 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74  e size for a dat
16fb0 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20  abase file is.  
16fc0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
16fd0 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e  by the 2-byte in
16fe0 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74  teger located at
16ff0 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36   an offset of 16
17000 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20   bytes from.    
17010 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ** the beginning
17020 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
17030 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42   file. */.    pB
17040 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a  t->pageSize = (z
17050 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29  DbHeader[16]<<8)
17060 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37   | (zDbHeader[17
17070 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20  ]<<16);.    if( 
17080 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31  pBt->pageSize<51
17090 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69  2 || pBt->pageSi
170a0 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
170b0 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20  GE_SIZE.        
170c0 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53   || ((pBt->pageS
170d0 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65  ize-1)&pBt->page
170e0 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Size)!=0 ){.    
170f0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
17100 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
17110 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
17120 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
17130 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22  the magic name "
17140 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63  :memory:" will c
17150 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  reate an in-memo
17160 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ry database, the
17170 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65  n.      ** leave
17180 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20   the autoVacuum 
17190 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f  mode at 0 (do no
171a0 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20  t auto-vacuum), 
171b0 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a  even if.      **
171c0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
171d0 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72  AUTOVACUUM is tr
171e0 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  ue. On the other
171f0 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20   hand, if.      
17200 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ** SQLITE_OMIT_M
17210 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e  EMORYDB has been
17220 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22   defined, then "
17230 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73  :memory:" is jus
17240 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67  t a.      ** reg
17250 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20  ular file-name. 
17260 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
17270 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70   auto-vacuum app
17280 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d  lies as per norm
17290 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
172a0 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
172b0 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
172c0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74          pBt->aut
172d0 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  oVacuum = (SQLIT
172e0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
172f0 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20  CUUM ? 1 : 0);. 
17300 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72         pBt->incr
17310 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
17320 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
17330 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b  UUM==2 ? 1 : 0);
17340 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
17350 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
17360 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
17370 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
17380 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34  -OF: R-37497-424
17390 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  12 The size of t
173a0 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69  he reserved regi
173b0 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  on is.      ** d
173c0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
173d0 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
173e0 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
173f0 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
17400 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74   20.      ** int
17410 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
17420 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
17430 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
17440 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20  zDbHeader[20];. 
17450 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
17460 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
17470 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
17480 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17490 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70  TOVACUUM.      p
174a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
174b0 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
174c0 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
174d0 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74  ?1:0);.      pBt
174e0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
174f0 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
17500 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  der[36 + 7*4])?1
17510 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  :0);.#endif.    
17520 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
17530 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
17540 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
17550 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
17560 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69  nReserve);.    i
17570 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72  f( rc ) goto btr
17580 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
17590 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
175a0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
175b0 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20   - nReserve;.   
175c0 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70   assert( (pBt->p
175d0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
175e0 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c  );  /* 8-byte al
175f0 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53  ignment of pageS
17600 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21  ize */.   .#if !
17610 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
17620 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
17630 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
17640 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
17650 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ).    /* Add the
17660 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62   new BtShared ob
17670 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b  ject to the link
17680 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65  ed list sharable
17690 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20   BtShareds..    
176a0 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  */.    pBt->nRef
176b0 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 1;.    if( p-
176c0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
176d0 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
176e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
176f0 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
17700 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
17710 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
17720 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
17730 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
17740 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20  ATIC_MASTER);). 
17750 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
17760 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71  THREADSAFE && sq
17770 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
17780 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
17790 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74          pBt->mut
177a0 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
177b0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
177c0 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
177d0 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65     if( pBt->mute
177e0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
177f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
17800 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
17810 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
17820 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  pen_out;.       
17830 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
17840 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
17850 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
17860 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e  );.      pBt->pN
17870 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ext = GLOBAL(BtS
17880 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
17890 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
178a0 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
178b0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
178c0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
178d0 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69   pBt;.      sqli
178e0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
178f0 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
17900 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
17910 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
17920 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
17930 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
17940 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
17950 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74  ISKIO).  /* If t
17960 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65  he new Btree use
17970 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74  s a sharable pBt
17980 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e  Shared, then lin
17990 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42  k the new.  ** B
179a0 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69  tree into the li
179b0 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62  st of all sharab
179c0 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68  le Btrees for th
179d0 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  e same connectio
179e0 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74  n..  ** The list
179f0 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65   is kept in asce
17a00 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
17a10 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f  Bt address..  */
17a20 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
17a30 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  le ){.    int i;
17a40 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62  .    Btree *pSib
17a50 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
17a60 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
17a70 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20        if( (pSib 
17a80 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
17a90 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68  )!=0 && pSib->sh
17aa0 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
17ab0 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
17ac0 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70  Prev ){ pSib = p
17ad0 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20  Sib->pPrev; }.  
17ae0 20 20 20 20 20 20 69 66 28 20 28 75 70 74 72 29        if( (uptr)
17af0 70 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 53 69  p->pBt<(uptr)pSi
17b00 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
17b10 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
17b20 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Sib;.          p
17b30 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
17b40 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72         pSib->pPr
17b50 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
17b60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
17b70 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e   while( pSib->pN
17b80 65 78 74 20 26 26 20 28 75 70 74 72 29 70 53 69  ext && (uptr)pSi
17b90 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75  b->pNext->pBt<(u
17ba0 70 74 72 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20  ptr)p->pBt ){.  
17bb0 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
17bc0 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
17bd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17be0 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
17bf0 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
17c00 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
17c10 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
17c20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
17c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
17c40 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
17c50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17c60 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
17c70 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
17c80 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
17c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17ca0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
17cb0 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
17cc0 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
17cd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17ce0 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
17cf0 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
17d00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
17d10 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
17d20 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
17d30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
17d40 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
17d50 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
17d60 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
17d70 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
17d80 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a  e3_file *pFile;.
17d90 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42  .    /* If the B
17da0 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73  -Tree was succes
17db0 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73  sfully opened, s
17dc0 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  et the pager-cac
17dd0 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20  he size to the. 
17de0 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61     ** default va
17df0 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65  lue. Except, whe
17e00 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20  n opening on an 
17e10 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20  existing shared 
17e20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20  pager-cache,.   
17e30 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67   ** do not chang
17e40 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  e the pager-cach
17e50 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
17e60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
17e70 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20  reeSchema(p, 0, 
17e80 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)==0 ){.      s
17e90 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
17ea0 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e  chesize(p->pBt->
17eb0 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44  pPager, SQLITE_D
17ec0 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
17ed0 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  E);.    }..    p
17ee0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61  File = sqlite3Pa
17ef0 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
17f00 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ger);.    if( pF
17f10 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  ile->pMethods ){
17f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
17f30 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
17f40 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43  pFile, SQLITE_FC
17f50 4e 54 4c 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29  NTL_PDB, (void*)
17f60 26 70 42 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d  &pBt->db);.    }
17f70 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
17f80 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
17f90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
17fa0 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
17fb0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
17fc0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
17fd0 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61  exOpen);.  }.  a
17fe0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
17ff0 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42  E_OK || sqlite3B
18000 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f  treeConnectionCo
18010 75 6e 74 28 2a 70 70 42 74 72 65 65 29 3e 30 20  unt(*ppBtree)>0 
18020 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18030 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
18040 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
18050 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
18060 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
18070 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
18080 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
18090 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
180a0 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
180b0 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
180c0 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
180d0 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
180e0 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
180f0 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
18100 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
18110 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
18120 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
18130 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
18140 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
18150 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
18160 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58  ED_CACHE.  MUTEX
18170 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
18180 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
18190 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ).  BtShared *pL
181a0 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
181b0 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
181c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
181d0 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
181e0 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f  tex) );.  MUTEX_
181f0 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
18200 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
18210 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
18220 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
18230 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
18240 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
18250 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
18260 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
18270 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
18280 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
18290 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
182a0 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
182b0 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
182c0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
182d0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
182e0 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
182f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
18300 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
18310 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
18320 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
18330 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
18340 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
18350 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
18360 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
18370 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
18380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18390 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
183a0 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
183b0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
183c0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
183d0 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
183e0 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
183f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
18400 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
18410 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
18420 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
18430 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
18440 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
18450 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
18460 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
18470 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
18480 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
18490 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
184a0 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
184b0 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
184c0 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
184d0 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62 79  ytes with a 4-by
184e0 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61 20  te prefix for a 
184f0 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f  left-child.** po
18500 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
18510 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
18520 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
18530 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
18540 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
18550 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
18560 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
18570 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
18580 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
18590 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65  * One of the use
185a0 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70  s of pBt->pTmpSp
185b0 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74  ace is to format
185c0 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20   cells before.  
185d0 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74    ** inserting t
185e0 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20  hem into a leaf 
185f0 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66  page (function f
18600 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66  illInCell()). If
18610 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69  .    ** a cell i
18620 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79  s less than 4 by
18630 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20  tes in size, it 
18640 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  is rounded up to
18650 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20   4 bytes.    ** 
18660 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72  by the various r
18670 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e  outines that man
18680 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63  ipulate binary c
18690 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20  ells. Which.    
186a0 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74  ** can mean that
186b0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e   fillInCell() on
186c0 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  ly initializes t
186d0 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a  he first 2 or 3.
186e0 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
186f0 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74  pTmpSpace, but t
18700 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20  hat the first 4 
18710 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64  bytes are copied
18720 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20   from.    ** it 
18730 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  into a database 
18740 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  page. This is no
18750 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f  t actually a pro
18760 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20  blem, but it.   
18770 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61   ** does cause a
18780 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20   valgrind error 
18790 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20  when the 1 or 2 
187a0 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c  bytes of unitial
187b0 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74  ized .    ** dat
187c0 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73  a is passed to s
187d0 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65  ystem call write
187e0 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20  (). So to avoid 
187f0 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20  this error,.    
18800 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  ** zero the firs
18810 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d  t 4 bytes of tem
18820 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20  p space here..  
18830 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
18840 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20  :  Provide four 
18850 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c  bytes of initial
18860 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f 72  ized space befor
18870 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67  e the.    ** beg
18880 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70  inning of pTmpSp
18890 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20 61  ace as an area a
188a0 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70  vailable to prep
188b0 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c  end the.    ** l
188c0 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  eft-child pointe
188d0 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  r to the beginni
188e0 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20  ng of a cell..  
188f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74    */.    if( pBt
18900 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
18910 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d       memset(pBt-
18920 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38  >pTmpSpace, 0, 8
18930 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54  );.      pBt->pT
18940 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20  mpSpace += 4;.  
18950 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
18960 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
18970 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
18980 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
18990 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
189a0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
189b0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70  .  if( pBt->pTmp
189c0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
189d0 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34  ->pTmpSpace -= 4
189e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
189f0 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53  eFree(pBt->pTmpS
18a00 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e  pace);.    pBt->
18a10 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20  pTmpSpace = 0;. 
18a20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
18a30 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  e an open databa
18a40 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  se and invalidat
18a50 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
18a60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18a70 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70  eeClose(Btree *p
18a80 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
18a90 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
18aa0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  tCursor *pCur;..
18ab0 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
18ac0 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
18ad0 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
18ae0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
18af0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
18b00 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
18b10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
18b20 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20  nter(p);.  pCur 
18b30 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
18b40 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
18b50 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
18b60 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
18b70 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
18b80 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
18b90 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
18ba0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
18bb0 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
18bc0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
18bd0 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
18be0 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
18bf0 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
18c00 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
18c10 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
18c20 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
18c30 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
18c40 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
18c50 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
18c60 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
18c70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
18c80 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45  llback(p, SQLITE
18c90 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  _OK, 0);.  sqlit
18ca0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
18cb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
18cc0 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20  are still other 
18cd0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
18ce0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68  rences to the sh
18cf0 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20  ared-btree.  ** 
18d00 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72  structure, retur
18d10 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69  n now. The remai
18d20 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f  nder of this pro
18d30 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20  cedure cleans . 
18d40 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65   ** up the share
18d50 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  d-btree..  */.  
18d60 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
18d70 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c  oLock==0 && p->l
18d80 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
18d90 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  ( !p->sharable |
18da0 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  | removeFromShar
18db0 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a  ingList(pBt) ){.
18dc0 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69      /* The pBt i
18dd0 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74  s no longer on t
18de0 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c  he sharing list,
18df0 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73   so we can acces
18e00 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68  s.    ** it with
18e10 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f  out having to ho
18e20 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20  ld the mutex..  
18e30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61    **.    ** Clea
18e40 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65  n out and delete
18e50 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62   the BtShared ob
18e60 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ject..    */.   
18e70 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
18e80 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71  Cursor );.    sq
18e90 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
18ea0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
18eb0 64 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  db);.    if( pBt
18ec0 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
18ed0 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
18ee0 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
18ef0 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
18f00 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
18f10 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
18f20 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  , pBt->pSchema);
18f30 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
18f40 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
18f50 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
18f60 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
18f70 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
18f80 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
18f90 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
18fa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
18fb0 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
18fc0 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
18fd0 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
18fe0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
18ff0 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
19000 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
19010 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
19020 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
19030 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
19040 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19050 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f 66 74  Change the "soft
19060 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  " limit on the n
19070 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
19080 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20  n the cache..** 
19090 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64  Unused and unmod
190a0 69 66 69 65 64 20 70 61 67 65 73 20 77 69 6c 6c  ified pages will
190b0 20 62 65 20 72 65 63 79 63 6c 65 64 20 77 68 65   be recycled whe
190c0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  n the number of.
190d0 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ** pages in the 
190e0 63 61 63 68 65 20 65 78 63 65 65 64 73 20 74 68  cache exceeds th
190f0 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20  is soft limit.  
19100 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  But the size of 
19110 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69 73 20  the.** cache is 
19120 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77 20  allowed to grow 
19130 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
19140 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63 6f 6e   limit if it con
19150 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70  tains.** dirty p
19160 61 67 65 73 20 6f 72 20 70 61 67 65 73 20 73 74  ages or pages st
19170 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20 75 73  ill in active us
19180 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
19190 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
191a0 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
191b0 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
191c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
191d0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
191e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
191f0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
19200 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19210 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
19220 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
19230 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
19240 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
19250 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19260 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
19270 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19280 43 68 61 6e 67 65 20 74 68 65 20 22 73 70 69 6c  Change the "spil
19290 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  l" limit on the 
192a0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
192b0 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
192c0 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
192d0 66 20 70 61 67 65 73 20 65 78 63 65 65 64 73 20  f pages exceeds 
192e0 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72 69 6e  this limit durin
192f0 67 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  g a write transa
19300 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61  ction,.** the pa
19310 67 65 72 20 6d 69 67 68 74 20 61 74 74 65 6d 70  ger might attemp
19320 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70 61 67  t to "spill" pag
19330 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  es to the journa
19340 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72  l early in.** or
19350 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
19360 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
19370 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
19380 69 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  is the current s
19390 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a  pill size.  If z
193a0 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a 2a 2a  ero is passed.**
193b0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c   as an argument,
193c0 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   no changes are 
193d0 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70 69 6c  made to the spil
193e0 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67 2c 20  l size setting, 
193f0 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61  so.** using mxPa
19400 67 65 20 6f 66 20 30 20 69 73 20 61 20 77 61 79  ge of 0 is a way
19410 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 63 75   to query the cu
19420 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65  rrent spill size
19430 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19440 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a  BtreeSetSpillSiz
19450 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
19460 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61  mxPage){.  BtSha
19470 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
19480 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  t;.  int res;.  
19490 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
194a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
194b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
194c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
194d0 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69  p);.  res = sqli
194e0 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c  te3PagerSetSpill
194f0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
19500 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
19510 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19520 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
19530 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
19540 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f  AX_MMAP_SIZE>0./
19550 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
19560 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f  limit on the amo
19570 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  unt of the datab
19580 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61  ase file that ma
19590 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d  y be.** memory m
195a0 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  apped..*/.int sq
195b0 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61  lite3BtreeSetMma
195c0 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c  pLimit(Btree *p,
195d0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
195e0 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72  zMmap){.  BtShar
195f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
19600 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
19610 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
19620 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
19630 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
19640 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
19650 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
19660 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
19670 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74  szMmap);.  sqlit
19680 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19690 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
196a0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
196b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
196c0 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  _SIZE>0 */../*.*
196d0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79  * Change the way
196e0 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20   data is synced 
196f0 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72  to disk in order
19700 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20   to increase or 
19710 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20  decrease.** how 
19720 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73  well the databas
19730 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65  e resists damage
19740 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
19750 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20  es and power.** 
19760 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c  failures.  Level
19770 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61   1 is the same a
19780 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28  s asynchronous (
19790 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72  no syncs() occur
197a0 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73   and.** there is
197b0 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c   a high probabil
197c0 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20  ity of damage)  
197d0 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64  Level 2 is the d
197e0 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a  efault.  There.*
197f0 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20  * is a very low 
19800 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f  but non-zero pro
19810 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
19820 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64  ge.  Level 3 red
19830 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62  uces the.** prob
19840 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
19850 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62  e to near zero b
19860 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
19870 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
19880 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ction..*/.#ifnde
19890 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
198a0 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20  GER_PRAGMAS.int 
198b0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
198c0 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72  agerFlags(.  Btr
198d0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
198e0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
198f0 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66 65   to set the safe
19900 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20  ty level on */. 
19910 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67   unsigned pgFlag
19920 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f  s       /* Vario
19930 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73  us PAGER_* flags
19940 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
19950 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
19960 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19970 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
19980 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
19990 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
199a0 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
199b0 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42  PagerSetFlags(pB
199c0 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61  t->pPager, pgFla
199d0 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  gs);.  sqlite3Bt
199e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
199f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19a00 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19a10 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61   Change the defa
19a20 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61  ult pages size a
19a30 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
19a40 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
19a50 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c  per page..** Or,
19a60 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
19a70 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
19a80 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e  en fixed, return
19a90 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
19aa0 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61   .** without cha
19ab0 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a  nging anything..
19ac0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
19ad0 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
19ae0 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
19af0 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
19b00 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
19b10 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
19b20 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
19b30 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
19b40 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
19b50 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
19b60 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
19b70 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
19b80 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
19b90 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
19ba0 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
19bb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19bc0 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
19bd0 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
19be0 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
19bf0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
19c00 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
19c10 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
19c20 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
19c30 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
19c40 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
19c50 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
19c60 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
19c70 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
19c80 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
19c90 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
19ca0 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
19cb0 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
19cc0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
19cd0 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65  iFix!=0 then the
19ce0 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
19cf0 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20  XED flag is set 
19d00 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
19d10 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74   size.** and aut
19d20 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e  ovacuum mode can
19d30 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68   no longer be ch
19d40 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
19d50 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
19d60 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
19d70 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
19d80 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20  t nReserve, int 
19d90 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20  iFix){.  int rc 
19da0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
19db0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
19dc0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
19dd0 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26   nReserve>=-1 &&
19de0 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
19df0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19e00 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51  Enter(p);.#if SQ
19e10 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
19e20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42   if( nReserve>pB
19e30 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
19e40 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  e ) pBt->optimal
19e50 52 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52  Reserve = (u8)nR
19e60 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20  eserve;.#endif. 
19e70 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
19e80 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
19e90 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73  E_FIXED ){.    s
19ea0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
19eb0 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
19ec0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
19ed0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65  .  }.  if( nRese
19ee0 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65  rve<0 ){.    nRe
19ef0 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67  serve = pBt->pag
19f00 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
19f10 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61  bleSize;.  }.  a
19f20 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
19f30 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  =0 && nReserve<=
19f40 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67  255 );.  if( pag
19f50 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
19f60 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
19f70 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
19f80 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
19f90 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
19fa0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
19fb0 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
19fc0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
19fd0 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
19fe0 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
19ff0 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67  eSize = (u32)pag
1a000 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54  eSize;.    freeT
1a010 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
1a020 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
1a030 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
1a040 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
1a050 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
1a060 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d  Reserve);.  pBt-
1a070 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
1a080 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75  t->pageSize - (u
1a090 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69  16)nReserve;.  i
1a0a0 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62  f( iFix ) pBt->b
1a0b0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
1a0c0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20  AGESIZE_FIXED;. 
1a0d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a0e0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1a0f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1a100 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  urn the currentl
1a110 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73  y defined page s
1a120 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
1a130 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
1a140 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ze(Btree *p){.  
1a150 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
1a160 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ageSize;.}../*.*
1a170 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1a180 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
1a190 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
1a1a0 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74  erve(), except t
1a1b0 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e  hat it.** may on
1a1c0 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ly be called if 
1a1d0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
1a1e0 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65   that the b-tree
1a1f0 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64   mutex is alread
1a200 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a  y.** held..**.**
1a210 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20   This is useful 
1a220 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63  in one special c
1a230 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75  ase in the backu
1a240 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65  p API code where
1a250 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20   it is.** known 
1a260 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20  that the shared 
1a270 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
1a280 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75  held, but the mu
1a290 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64  tex on the .** d
1a2a0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
1a2b0 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e  hat owns *p is n
1a2c0 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ot. In this case
1a2d0 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   if sqlite3Btree
1a2e0 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20  Enter().** were 
1a2f0 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74  to be called, it
1a300 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77   might collide w
1a310 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f  ith some other o
1a320 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a  peration on the.
1a330 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
1a340 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c  le that owns *p,
1a350 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e   causing undefin
1a360 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a  ed behavior..*/.
1a370 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1a380 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65  GetReserveNoMute
1a390 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  x(Btree *p){.  i
1a3a0 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  nt n;.  assert( 
1a3b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1a3c0 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
1a3d0 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  ) );.  n = p->pB
1a3e0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
1a3f0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
1a400 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
1a410 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1a420 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1a430 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
1a440 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
1a450 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
1a460 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
1a470 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
1a480 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
1a490 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
1a4a0 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
1a4b0 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
1a4c0 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
1a4d0 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66  HAS_MUTEX is def
1a4e0 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75  ined then the nu
1a4f0 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  mber returned is
1a500 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20   the.** greater 
1a510 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
1a520 65 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e  eserved space an
1a530 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65  d the maximum re
1a540 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72  quested.** reser
1a550 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74  ve space..*/.int
1a560 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1a570 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42  OptimalReserve(B
1a580 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1a590 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
1a5a0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
1a5b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1a5c0 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70  ReserveNoMutex(p
1a5d0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1a5e0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
1a5f0 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d   n<p->pBt->optim
1a600 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20  alReserve ) n = 
1a610 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  p->pBt->optimalR
1a620 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20  eserve;.#endif. 
1a630 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a640 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1a650 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  n;.}.../*.** Set
1a660 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
1a670 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61  e count for a da
1a680 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65  tabase if mxPage
1a690 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a   is positive..**
1a6a0 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
1a6b0 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69  made if mxPage i
1a6c0 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  s 0 or negative.
1a6d0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
1a6e0 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  f the value of m
1a6f0 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
1a700 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
1a710 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
1a720 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
1a730 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  Count(Btree *p, 
1a740 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
1a750 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
1a760 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a770 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  n = sqlite3Pager
1a780 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
1a790 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
1a7a0 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
1a7b0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1a7c0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
1a7d0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
1a7e0 6c 75 65 73 20 66 6f 72 20 74 68 65 20 42 54 53  lues for the BTS
1a7f0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61  _SECURE_DELETE a
1a800 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  nd BTS_OVERWRITE
1a810 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
1a820 20 6e 65 77 46 6c 61 67 3d 3d 30 20 20 20 20 20   newFlag==0     
1a830 20 20 42 6f 74 68 20 42 54 53 5f 53 45 43 55 52    Both BTS_SECUR
1a840 45 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53  E_DELETE and BTS
1a850 5f 4f 56 45 52 57 52 49 54 45 20 61 72 65 20 63  _OVERWRITE are c
1a860 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77  leared.**    new
1a870 46 6c 61 67 3d 3d 31 20 20 20 20 20 20 20 42 54  Flag==1       BT
1a880 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
1a890 73 65 74 20 61 6e 64 20 42 54 53 5f 4f 56 45 52  set and BTS_OVER
1a8a0 57 52 49 54 45 20 69 73 20 63 6c 65 61 72 65 64  WRITE is cleared
1a8b0 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d  .**    newFlag==
1a8c0 32 20 20 20 20 20 20 20 42 54 53 5f 53 45 43 55  2       BTS_SECU
1a8d0 52 45 5f 44 45 4c 45 54 45 20 63 6c 65 61 72 65  RE_DELETE cleare
1a8e0 64 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52  d and BTS_OVERWR
1a8f0 49 54 45 20 69 73 20 73 65 74 0a 2a 2a 20 20 20  ITE is set.**   
1a900 20 6e 65 77 46 6c 61 67 3d 3d 28 2d 31 29 20 20   newFlag==(-1)  
1a910 20 20 4e 6f 20 63 68 61 6e 67 65 73 0a 2a 2a 0a    No changes.**.
1a920 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1a930 61 63 74 73 20 61 73 20 61 20 71 75 65 72 79 20  acts as a query 
1a940 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 6c 65  if newFlag is le
1a950 73 73 20 74 68 61 6e 20 7a 65 72 6f 0a 2a 2a 0a  ss than zero.**.
1a960 2a 2a 20 57 69 74 68 20 42 54 53 5f 4f 56 45 52  ** With BTS_OVER
1a970 57 52 49 54 45 20 73 65 74 2c 20 64 65 6c 65 74  WRITE set, delet
1a980 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f 76  ed content is ov
1a990 65 72 77 72 69 74 74 65 6e 20 62 79 20 7a 65 72  erwritten by zer
1a9a0 6f 73 2c 20 62 75 74 0a 2a 2a 20 66 72 65 65 6c  os, but.** freel
1a9b0 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 61  ist leaf pages a
1a9c0 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 62  re not written b
1a9d0 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62  ack to the datab
1a9e0 61 73 65 2e 20 20 54 68 75 73 20 69 6e 2d 70 61  ase.  Thus in-pa
1a9f0 67 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 63 6f  ge.** deleted co
1aa00 6e 74 65 6e 74 20 69 73 20 63 6c 65 61 72 65 64  ntent is cleared
1aa10 2c 20 62 75 74 20 66 72 65 65 6c 69 73 74 20 64  , but freelist d
1aa20 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69  eleted content i
1aa30 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  s not..**.** Wit
1aa40 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  h BTS_SECURE_DEL
1aa50 45 54 45 2c 20 6f 70 65 72 61 74 69 6f 6e 20 69  ETE, operation i
1aa60 73 20 6c 69 6b 65 20 42 54 53 5f 4f 56 45 52 57  s like BTS_OVERW
1aa70 52 49 54 45 20 77 69 74 68 20 74 68 65 20 61 64  RITE with the ad
1aa80 64 69 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 66  dition.** that f
1aa90 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67  reelist leaf pag
1aaa0 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 62  es are written b
1aab0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
1aac0 61 62 61 73 65 2c 20 69 6e 63 72 65 61 73 69 6e  abase, increasin
1aad0 67 0a 2a 2a 20 74 68 65 20 61 6d 6f 75 6e 74 20  g.** the amount 
1aae0 6f 66 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a  of disk I/O..*/.
1aaf0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ab00 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72  SecureDelete(Btr
1ab10 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c  ee *p, int newFl
1ab20 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20  ag){.  int b;.  
1ab30 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1ab40 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  n 0;.  sqlite3Bt
1ab50 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1ab60 73 73 65 72 74 28 20 42 54 53 5f 4f 56 45 52 57  ssert( BTS_OVERW
1ab70 52 49 54 45 3d 3d 42 54 53 5f 53 45 43 55 52 45  RITE==BTS_SECURE
1ab80 5f 44 45 4c 45 54 45 2a 32 20 29 3b 0a 20 20 61  _DELETE*2 );.  a
1ab90 73 73 65 72 74 28 20 42 54 53 5f 46 41 53 54 5f  ssert( BTS_FAST_
1aba0 53 45 43 55 52 45 3d 3d 28 42 54 53 5f 4f 56 45  SECURE==(BTS_OVE
1abb0 52 57 52 49 54 45 7c 42 54 53 5f 53 45 43 55 52  RWRITE|BTS_SECUR
1abc0 45 5f 44 45 4c 45 54 45 29 20 29 3b 0a 20 20 69  E_DELETE) );.  i
1abd0 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b  f( newFlag>=0 ){
1abe0 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73  .    p->pBt->bts
1abf0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 46 41  Flags &= ~BTS_FA
1ac00 53 54 5f 53 45 43 55 52 45 3b 0a 20 20 20 20 70  ST_SECURE;.    p
1ac10 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
1ac20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
1ac30 4c 45 54 45 2a 6e 65 77 46 6c 61 67 3b 0a 20 20  LETE*newFlag;.  
1ac40 7d 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d  }.  b = (p->pBt-
1ac50 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1ac60 46 41 53 54 5f 53 45 43 55 52 45 29 2f 42 54 53  FAST_SECURE)/BTS
1ac70 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
1ac80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1ac90 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1aca0 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   b;.}../*.** Cha
1acb0 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
1acc0 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
1acd0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
1ace0 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
1acf0 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
1ad00 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1ad10 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
1ad20 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
1ad30 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
1ad40 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
1ad50 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
1ad60 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
1ad70 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
1ad80 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
1ad90 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
1ada0 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
1adb0 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
1adc0 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
1add0 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
1ade0 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
1adf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
1ae00 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1ae10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
1ae20 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
1ae30 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1ae40 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
1ae50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ae60 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74   u8 av = (u8)aut
1ae70 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69  oVacuum;..  sqli
1ae80 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1ae90 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  ;.  if( (pBt->bt
1aea0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
1aeb0 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20  ESIZE_FIXED)!=0 
1aec0 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42  && (av ?1:0)!=pB
1aed0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1aee0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1aef0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c  _READONLY;.  }el
1af00 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  se{.    pBt->aut
1af10 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a  oVacuum = av ?1:
1af20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  0;.    pBt->incr
1af30 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f  Vacuum = av==2 ?
1af40 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  1:0;.  }.  sqlit
1af50 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1af60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
1af70 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
1af80 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
1af90 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  f the 'auto-vacu
1afa0 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66  um' property. If
1afb0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
1afc0 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73  .** enabled 1 is
1afd0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1afe0 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  wise 0..*/.int s
1aff0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
1b000 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
1b010 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
1b020 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1b030 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45  M.  return BTREE
1b040 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
1b050 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
1b060 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1b070 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1b080 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d   (.    (!p->pBt-
1b090 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52  >autoVacuum)?BTR
1b0a0 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
1b0b0 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  NE:.    (!p->pBt
1b0c0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54  ->incrVacuum)?BT
1b0d0 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
1b0e0 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41  ULL:.    BTREE_A
1b0f0 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20  UTOVACUUM_INCR. 
1b100 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
1b110 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1b120 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
1b130 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
1b140 75 73 65 72 20 68 61 73 20 6e 6f 74 20 73 65 74  user has not set
1b150 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65   the safety-leve
1b160 6c 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  l for this datab
1b170 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
1b180 2a 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20  * using "PRAGMA 
1b190 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 61 6e  synchronous", an
1b1a0 64 20 69 66 20 74 68 65 20 73 61 66 65 74 79 2d  d if the safety-
1b1b0 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20 61 6c 72  level is not alr
1b1c0 65 61 64 79 0a 2a 2a 20 73 65 74 20 74 6f 20 74  eady.** set to t
1b1d0 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
1b1e0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1b1f0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
1b200 61 72 61 6d 65 74 65 72 2c 0a 2a 2a 20 73 65 74  arameter,.** set
1b210 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53   it so..*/.#if S
1b220 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59  QLITE_DEFAULT_SY
1b230 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54  NCHRONOUS!=SQLIT
1b240 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59  E_DEFAULT_WAL_SY
1b250 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a 20 20 20 20  NCHRONOUS \.    
1b260 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
1b270 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 73 74 61  TE_OMIT_WAL).sta
1b280 74 69 63 20 76 6f 69 64 20 73 65 74 44 65 66 61  tic void setDefa
1b290 75 6c 74 53 79 6e 63 46 6c 61 67 28 42 74 53 68  ultSyncFlag(BtSh
1b2a0 61 72 65 64 20 2a 70 42 74 2c 20 75 38 20 73 61  ared *pBt, u8 sa
1b2b0 66 65 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73  fety_level){.  s
1b2c0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
1b2d0 20 2a 70 44 62 3b 0a 20 20 69 66 28 20 28 64 62   *pDb;.  if( (db
1b2e0 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20 26 26 20  =pBt->db)!=0 && 
1b2f0 28 70 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30  (pDb=db->aDb)!=0
1b300 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
1b310 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44  Db->pBt==0 || pD
1b320 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42 74  b->pBt->pBt!=pBt
1b330 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20   ){ pDb++; }.   
1b340 20 69 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53   if( pDb->bSyncS
1b350 65 74 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  et==0 .     && p
1b360 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1b370 21 3d 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a  !=safety_level .
1b380 20 20 20 20 20 26 26 20 70 44 62 21 3d 26 64 62       && pDb!=&db
1b390 2d 3e 61 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b  ->aDb[1] .    ){
1b3a0 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65  .      pDb->safe
1b3b0 74 79 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65 74  ty_level = safet
1b3c0 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 73  y_level;.      s
1b3d0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
1b3e0 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ags(pBt->pPager,
1b3f0 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
1b400 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28  safety_level | (
1b410 64 62 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45  db->flags & PAGE
1b420 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a  R_FLAGS_MASK));.
1b430 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
1b440 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 44 65  e.# define setDe
1b450 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42  faultSyncFlag(pB
1b460 74 2c 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a  t,safety_level).
1b470 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61  #endif../* Forwa
1b480 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
1b490 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
1b4a0 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
1b4b0 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  d*);.../*.** Get
1b4c0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1b4d0 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
1b4e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
1b4f0 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
1b500 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
1b510 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
1b520 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1b530 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
1b540 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
1b550 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
1b560 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
1b570 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
1b580 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1b590 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1b5a0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
1b5b0 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1b5c0 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
1b5d0 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
1b5e0 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
1b5f0 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
1b600 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
1b610 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
1b620 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
1b630 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1b640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1b650 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  ult code from su
1b660 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  bfunctions */.  
1b670 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
1b680 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f       /* Page 1 o
1b690 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1b6a0 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ile */.  u32 nPa
1b6b0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
1b6c0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1b6d0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1b6e0 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67 65 46   */.  u32 nPageF
1b6f0 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  ile = 0;   /* Nu
1b700 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1b710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b720 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67  le */.  u32 nPag
1b730 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20  eHeader;     /* 
1b740 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1b750 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1b760 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72  according to hdr
1b770 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
1b780 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1b790 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1b7a0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1b7b0 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72  pPage1==0 );.  r
1b7c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1b7d0 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e  SharedLock(pBt->
1b7e0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
1b7f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1b800 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
1b810 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1b820 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
1b830 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1b840 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1b850 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
1b860 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
1b870 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
1b880 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
1b890 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
1b8a0 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
1b8b0 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65  e. .  */.  nPage
1b8c0 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d   = nPageHeader =
1b8d0 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
1b8e0 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
1b8f0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
1b900 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1b910 50 61 67 65 72 2c 20 28 69 6e 74 2a 29 26 6e 50  Pager, (int*)&nP
1b920 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ageFile);.  if( 
1b930 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63  nPage==0 || memc
1b940 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65  mp(24+(u8*)pPage
1b950 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38  1->aData, 92+(u8
1b960 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
1b970 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61  4)!=0 ){.    nPa
1b980 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a  ge = nPageFile;.
1b990 20 20 7d 0a 20 20 69 66 28 20 28 70 42 74 2d 3e    }.  if( (pBt->
1b9a0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1b9b0 54 45 5f 52 65 73 65 74 44 61 74 61 62 61 73 65  TE_ResetDatabase
1b9c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67  )!=0 ){.    nPag
1b9d0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
1b9e0 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
1b9f0 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32 pageSize;.  
1ba00 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65    u32 usableSize
1ba10 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  ;.    u8 *page1 
1ba20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
1ba30 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1ba40 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20  _NOTADB;.    /* 
1ba50 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
1ba60 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72 79  3737-39999 Every
1ba70 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61   valid SQLite da
1ba80 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67 69  tabase file begi
1ba90 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  ns.    ** with t
1baa0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20  he following 16 
1bab0 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20  bytes (in hex): 
1bac0 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20 36  53 51 4c 69 74 6
1bad0 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36 64  5 20 66 6f 72 6d
1bae0 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30  .    ** 61 74 20
1baf0 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69   33 00. */.    i
1bb00 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
1bb10 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
1bb20 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
1bb30 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1bb40 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69  ailed;.    }..#i
1bb50 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
1bb60 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67  _WAL.    if( pag
1bb70 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
1bb80 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1bb90 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
1bba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1bbb0 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
1bbc0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1bbd0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1bbe0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
1bbf0 20 70 61 67 65 31 5b 31 38 5d 3e 33 20 29 7b 0a   page1[18]>3 ){.
1bc00 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
1bc10 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
1bc20 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
1bc30 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 33 20  if( page1[19]>3 
1bc40 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
1bc50 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
1bc60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1bc70 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73  f the write vers
1bc80 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c  ion is set to 2,
1bc90 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
1bca0 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65  hould be accesse
1bcb0 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20  d.    ** in WAL 
1bcc0 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67  mode. If the log
1bcd0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1bce0 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  open, open it no
1bcf0 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20  w. Then .    ** 
1bd00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bd10 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68   and return with
1bd20 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42  out populating B
1bd30 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a  tShared.pPage1..
1bd40 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
1bd50 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61  r detects this a
1bd60 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  nd calls this fu
1bd70 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68  nction again. Th
1bd80 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  is is.    ** req
1bd90 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72  uired as the ver
1bda0 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63  sion of page 1 c
1bdb0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
1bdc0 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20  page1 buffer.   
1bdd0 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74   ** may not be t
1bde0 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
1bdf0 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65  n - there may be
1be00 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20   a newer one in 
1be10 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66  the log.    ** f
1be20 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
1be30 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 3d 32  if( page1[19]>=2
1be40 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
1be50 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29  gs & BTS_NO_WAL)
1be60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1be70 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20   isOpen = 0;.   
1be80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1be90 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d  agerOpenWal(pBt-
1bea0 3e 70 50 61 67 65 72 2c 20 28 70 61 67 65 31 5b  >pPager, (page1[
1beb0 31 39 5d 3d 3d 33 29 2c 20 26 69 73 4f 70 65 6e  19]==3), &isOpen
1bec0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1bed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bee0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
1bef0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
1bf00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bf10 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e     setDefaultSyn
1bf20 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54  cFlag(pBt, SQLIT
1bf30 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59  E_DEFAULT_WAL_SY
1bf40 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20  NCHRONOUS+1);.  
1bf50 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
1bf60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1bf70 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
1bf80 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
1bf90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bfa0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
1bfb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1bfc0 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
1bfd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bfe0 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63    setDefaultSync
1bff0 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45  Flag(pBt, SQLITE
1c000 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f  _DEFAULT_SYNCHRO
1c010 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23  NOUS+1);.    }.#
1c020 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56  endif..    /* EV
1c030 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34  IDENCE-OF: R-154
1c040 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78  65-20813 The max
1c050 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d  imum and minimum
1c060 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
1c070 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f  d.    ** fractio
1c080 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20  ns and the leaf 
1c090 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e  payload fraction
1c0a0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
1c0b0 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a  64, 32, and 32..
1c0c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1c0d0 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
1c0e0 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
1c0f0 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
1c100 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
1c110 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
1c120 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
1c130 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
1c140 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
1c150 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
1c160 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
1c170 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
1c180 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1c190 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
1c1a0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1c1b0 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
1c1c0 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
1c1d0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1c1e0 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
1c1f0 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
1c200 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
1c210 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
1c220 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
1c230 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
1c240 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
1c250 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
1c260 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70     pageSize = (p
1c270 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  age1[16]<<8) | (
1c280 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a  page1[17]<<16);.
1c290 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1c2a0 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38  OF: R-25008-2168
1c2b0 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20  8 The size of a 
1c2c0 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20  page is a power 
1c2d0 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65  of two.    ** be
1c2e0 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
1c2f0 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a  536 inclusive. *
1c300 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  /.    if( ((page
1c310 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
1c320 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67  )!=0.     || pag
1c330 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
1c340 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20  _PAGE_SIZE .    
1c350 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35   || pageSize<=25
1c360 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  6 .    ){.      
1c370 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
1c380 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
1c390 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1c3a0 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
1c3b0 46 49 58 45 44 3b 0a 20 20 20 20 61 73 73 65 72  FIXED;.    asser
1c3c0 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
1c3d0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==0 );.    /* E
1c3e0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
1c3f0 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72  310-51205 The "r
1c400 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73  eserved space" s
1c410 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74  ize in the 1-byt
1c420 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72  e.    ** integer
1c430 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73   at offset 20 is
1c440 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1c450 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
1c460 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20   the end of.    
1c470 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20  ** each page to 
1c480 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65  reserve for exte
1c490 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a  nsions. .    **.
1c4a0 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
1c4b0 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
1c4c0 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
1c4d0 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
1c4e0 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  n is.    ** dete
1c4f0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
1c500 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
1c510 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
1c520 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
1c530 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
1c540 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
1c550 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73  eader. */.    us
1c560 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
1c570 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
1c580 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61  .    if( (u32)pa
1c590 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
1c5a0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
1c5b0 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
1c5c0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1c5d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
1c5e0 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
1c5f0 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
1c600 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
1c610 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
1c620 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
1c630 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
1c640 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
1c650 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
1c660 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
1c670 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
1c680 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
1c690 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1c6a0 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
1c6b0 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
1c6c0 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
1c6d0 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
1c6e0 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
1c6f0 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
1c700 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e     releasePageOn
1c710 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
1c720 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1c730 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
1c740 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
1c750 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
1c760 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
1c770 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
1c780 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c790 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
1c7a0 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
1c7b0 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
1c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1c7e0 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
1c7f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1c800 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
1c810 20 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65   sqlite3Writable
1c820 53 63 68 65 6d 61 28 70 42 74 2d 3e 64 62 29 3d  Schema(pBt->db)=
1c830 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
1c840 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
1c850 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1c860 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
1c870 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1c880 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
1c890 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1c8a0 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48   R-28312-64704 H
1c8b0 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62  owever, the usab
1c8c0 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  le size is not a
1c8d0 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a  llowed to.    **
1c8e0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38   be less than 48
1c8f0 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  0. In other word
1c900 73 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  s, if the page s
1c910 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e  ize is 512, then
1c920 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65   the.    ** rese
1c930 72 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20  rved space size 
1c940 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32  cannot exceed 32
1c950 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61  . */.    if( usa
1c960 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20  bleSize<480 ){. 
1c970 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1c980 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1c990 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65   }.    pBt->page
1c9a0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
1c9b0 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
1c9c0 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
1c9d0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
1c9e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1c9f0 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  M.    pBt->autoV
1ca00 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
1ca10 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a  e(&page1[36 + 4*
1ca20 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42  4])?1:0);.    pB
1ca30 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
1ca40 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
1ca50 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
1ca60 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
1ca70 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
1ca80 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
1ca90 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
1caa0 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
1cab0 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
1cac0 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
1cad0 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
1cae0 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
1caf0 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
1cb00 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
1cb10 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
1cb20 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
1cb30 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
1cb40 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
1cb50 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
1cb60 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
1cb70 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
1cb80 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
1cb90 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
1cba0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
1cbb0 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
1cbc0 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
1cbd0 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
1cbe0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
1cbf0 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
1cc00 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
1cc10 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
1cc20 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
1cc30 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64   pointer, a head
1cc40 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
1cc50 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
1cc60 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
1cc70 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
1cc80 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
1cc90 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
1cca0 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
1ccb0 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
1ccc0 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75  t->maxLocal = (u
1ccd0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
1cce0 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
1ccf0 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 23);.  pBt->mi
1cd00 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  nLocal = (u16)((
1cd10 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
1cd20 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
1cd30 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
1cd40 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
1cd50 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a  ableSize - 35);.
1cd60 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
1cd70 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
1cd80 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
1cd90 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20  55 - 23);.  if( 
1cda0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32  pBt->maxLocal>12
1cdb0 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  7 ){.    pBt->ma
1cdc0 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
1cdd0 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  127;.  }else{.  
1cde0 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
1cdf0 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74  ayload = (u8)pBt
1ce00 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->maxLocal;.  }.
1ce10 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
1ce20 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
1ce30 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
1ce40 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
1ce50 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42  1 = pPage1;.  pB
1ce60 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
1ce70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1ce80 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
1ce90 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
1cea0 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65  asePageOne(pPage
1ceb0 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
1cec0 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
1ced0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
1cee0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
1cef0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1cf00 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
1cf10 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f   pBt. This is fo
1cf20 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
1cf30 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
1cf40 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
1cf50 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
1cf60 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
1cf70 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ined..**.** Only
1cf80 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
1cf90 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72  re counted if wr
1cfa0 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49  Only is true.  I
1cfb0 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66  f wrOnly is.** f
1cfc0 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75  alse then all cu
1cfd0 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
1cfe0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
1cff0 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
1d000 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72  s routine, a cur
1d010 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
1d020 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
1d030 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20  able of reading 
1d040 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  or writing to th
1d050 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72  e database.  Cur
1d060 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
1d070 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
1d080 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
1d090 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
1d0a0 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
1d0b0 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
1d0c0 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
1d0d0 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
1d0e0 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
1d0f0 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
1d100 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
1d110 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
1d120 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
1d130 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1d140 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
1d150 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
1d160 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
1d170 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
1d180 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1d190 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
1d1a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
1d1b0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1d1c0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1d1d0 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
1d1e0 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
1d1f0 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
1d200 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
1d210 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
1d220 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
1d230 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
1d240 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
1d250 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
1d260 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1d270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
1d280 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
1d290 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
1d2a0 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
1d2b0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1d2c0 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
1d2d0 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
1d2e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1d2f0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1d300 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
1d310 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
1d320 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
1d330 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1d340 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1d350 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1d360 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
1d370 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
1d380 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
1d390 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
1d3a0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
1d3b0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1d3c0 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
1d3d0 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
1d3e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1d3f0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1d400 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d410 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
1d420 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1d430 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
1d440 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
1d450 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
1d460 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
1d470 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
1d480 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1d490 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20  f pBt points to 
1d4a0 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68  an empty file th
1d4b0 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
1d4c0 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e  empty file.** in
1d4d0 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64  to a new empty d
1d4e0 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
1d4f0 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
1d500 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65  t page of.** the
1d510 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1d520 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
1d530 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
1d540 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
1d550 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
1d560 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
1d570 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1d580 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1d590 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1d5a0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  );.  if( pBt->nP
1d5b0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
1d5c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d5d0 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e   }.  pP1 = pBt->
1d5e0 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
1d5f0 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
1d600 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
1d610 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1d620 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
1d630 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
1d640 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1d650 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
1d660 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
1d670 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
1d680 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
1d690 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
1d6a0 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b  )==16 );.  data[
1d6b0 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  16] = (u8)((pBt-
1d6c0 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78  >pageSize>>8)&0x
1d6d0 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20  ff);.  data[17] 
1d6e0 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
1d6f0 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29  eSize>>16)&0xff)
1d700 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
1d710 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
1d720 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1d730 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
1d740 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
1d750 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
1d760 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
1d770 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
1d780 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
1d790 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
1d7a0 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
1d7b0 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
1d7c0 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
1d7d0 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
1d7e0 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
1d7f0 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
1d800 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
1d810 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
1d820 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
1d830 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1d840 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
1d850 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
1d860 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1d870 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
1d880 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
1d890 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
1d8a0 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
1d8b0 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
1d8c0 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
1d8d0 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
1d8e0 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
1d8f0 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
1d900 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
1d910 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
1d920 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
1d930 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
1d940 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  if.  pBt->nPage 
1d950 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20  = 1;.  data[31] 
1d960 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
1d970 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1d980 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1d990 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
1d9a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d9b0 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74   (creating a dat
1d9c0 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74  abase.** consist
1d9d0 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
1d9e0 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65  page and no sche
1d9f0 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74  ma objects). Ret
1da00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
1da10 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
1da20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
1da30 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
1da40 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1da50 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65  3BtreeNewDb(Btre
1da60 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1da70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1da80 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
1da90 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
1daa0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1dab0 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69  (p->pBt);.  sqli
1dac0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1dad0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1dae0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
1daf0 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
1db00 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
1db10 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
1db20 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
1db30 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1db40 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
1db50 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
1db60 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
1db70 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
1db80 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
1db90 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
1dba0 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
1dbb0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
1dbc0 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
1dbd0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
1dbe0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
1dbf0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
1dc00 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
1dc10 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
1dc20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
1dc30 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
1dc40 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
1dc50 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
1dc60 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
1dc70 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
1dc80 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
1dc90 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
1dca0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
1dcb0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1dcc0 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
1dcd0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
1dce0 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
1dcf0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1dd00 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
1dd10 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
1dd20 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
1dd30 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
1dd40 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
1dd50 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
1dd60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1dd70 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
1dd80 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1dd90 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
1dda0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1ddb0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
1ddc0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1ddd0 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
1dde0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1ddf0 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
1de00 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1de10 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
1de20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
1de30 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
1de40 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
1de50 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
1de60 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
1de70 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
1de80 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
1de90 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1dea0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
1deb0 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
1dec0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1ded0 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
1dee0 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
1def0 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
1df00 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
1df10 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
1df20 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1df30 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
1df40 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
1df50 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
1df60 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
1df70 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
1df80 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
1df90 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
1dfa0 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
1dfb0 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
1dfc0 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
1dfd0 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
1dfe0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
1dff0 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
1e000 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
1e010 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
1e020 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
1e030 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
1e040 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
1e050 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
1e060 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
1e070 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
1e080 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
1e090 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
1e0a0 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
1e0b0 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
1e0c0 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
1e0d0 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
1e0e0 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
1e0f0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
1e100 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
1e110 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
1e120 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
1e130 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
1e140 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
1e150 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
1e160 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
1e170 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
1e180 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
1e190 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
1e1a0 6e 74 20 77 72 66 6c 61 67 2c 20 69 6e 74 20 2a  nt wrflag, int *
1e1b0 70 53 63 68 65 6d 61 56 65 72 73 69 6f 6e 29 7b  pSchemaVersion){
1e1c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1e1d0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
1e1e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e1f0 0a 20 20 69 6e 74 20 62 43 6f 6e 63 75 72 72 65  .  int bConcurre
1e200 6e 74 20 3d 20 28 70 2d 3e 64 62 2d 3e 62 43 6f  nt = (p->db->bCo
1e210 6e 63 75 72 72 65 6e 74 20 26 26 20 21 49 53 41  ncurrent && !ISA
1e220 55 54 4f 56 41 43 55 55 4d 29 3b 0a 0a 20 20 73  UTOVACUUM);..  s
1e230 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1e240 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
1e250 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
1e260 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
1e270 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
1e280 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
1e290 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
1e2a0 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
1e2b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
1e2c0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
1e2d0 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
1e2e0 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
1e2f0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
1e300 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1e310 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
1e320 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1e330 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
1e340 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
1e350 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20  ns_begun;.  }.  
1e360 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1e370 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1e380 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74  S_WRITE || IfNot
1e390 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
1e3a0 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a  runcate)==0 );..
1e3b0 20 20 69 66 28 20 28 70 2d 3e 64 62 2d 3e 66 6c    if( (p->db->fl
1e3c0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 73  ags & SQLITE_Res
1e3d0 65 74 44 61 74 61 62 61 73 65 29 20 0a 20 20 20  etDatabase) .   
1e3e0 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  && sqlite3PagerI
1e3f0 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70  sreadonly(pBt->p
1e400 50 61 67 65 72 29 3d 3d 30 20 0a 20 20 29 7b 0a  Pager)==0 .  ){.
1e410 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
1e420 73 20 26 3d 20 7e 42 54 53 5f 52 45 41 44 5f 4f  s &= ~BTS_READ_O
1e430 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  NLY;.  }..  /* W
1e440 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1e450 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  s are not possib
1e460 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c  le on a read-onl
1e470 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
1e480 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
1e490 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1e4a0 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67  LY)!=0 && wrflag
1e4b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1e4c0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1e4d0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
1e4e0 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  un;.  }..#ifndef
1e4f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1e500 52 45 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20  RED_CACHE.  {.  
1e510 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63    sqlite3 *pBloc
1e520 6b 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66  k = 0;.    /* If
1e530 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73   another databas
1e540 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72  e handle has alr
1e550 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72  eady opened a wr
1e560 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1e570 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  .    ** on this 
1e580 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
1e590 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
1e5a0 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
1e5b0 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20  ction is.    ** 
1e5c0 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
1e5d0 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
1e5e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e5f0 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
1e600 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1e610 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 20  RANS_WRITE).    
1e620 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   || (pBt->btsFla
1e630 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47  gs & BTS_PENDING
1e640 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=0.    ){.    
1e650 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e    pBlock = pBt->
1e660 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20  pWriter->db;.   
1e670 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61   }else if( wrfla
1e680 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 4c  g>1 ){.      BtL
1e690 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ock *pIter;.    
1e6a0 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
1e6b0 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
1e6c0 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
1e6d0 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t){.        if( 
1e6e0 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70  pIter->pBtree!=p
1e6f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42   ){.          pB
1e700 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42  lock = pIter->pB
1e710 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  tree->db;.      
1e720 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1e730 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e740 20 7d 0a 20 20 20 20 69 66 28 20 70 42 6c 6f 63   }.    if( pBloc
1e750 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  k ){.      sqlit
1e760 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
1e770 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63  ked(p->db, pBloc
1e780 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  k);.      rc = S
1e790 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
1e7a0 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20  REDCACHE;.      
1e7b0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1e7c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1e7d0 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61  if..  /* Any rea
1e7e0 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77  d-only or read-w
1e7f0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1e800 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d   implies a read-
1e810 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61  lock on .  ** pa
1e820 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65  ge 1. So if some
1e830 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61   other shared-ca
1e840 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61  che client alrea
1e850 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c  dy has a write-l
1e860 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67  ock .  ** on pag
1e870 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63  e 1, the transac
1e880 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f  tion cannot be o
1e890 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d  pened. */.  rc =
1e8a0 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
1e8b0 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41  eTableLock(p, MA
1e8c0 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f  STER_ROOT, READ_
1e8d0 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c  LOCK);.  if( SQL
1e8e0 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74  ITE_OK!=rc ) got
1e8f0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a  o trans_begun;..
1e900 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1e910 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c  &= ~BTS_INITIALL
1e920 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70  Y_EMPTY;.  if( p
1e930 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70  Bt->nPage==0 ) p
1e940 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1e950 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
1e960 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  PTY;.  do {.    
1e970 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65  /* Call lockBtre
1e980 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72  e() until either
1e990 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20   pBt->pPage1 is 
1e9a0 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20  populated or.   
1e9b0 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20   ** lockBtree() 
1e9c0 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e  returns somethin
1e9d0 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  g other than SQL
1e9e0 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65  ITE_OK. lockBtre
1e9f0 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72  e().    ** may r
1ea00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1ea10 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  but leave pBt->p
1ea20 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69  Page1 set to 0 i
1ea30 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72  f after.    ** r
1ea40 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74  eading page 1 it
1ea50 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20   discovers that 
1ea60 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
1ea70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
1ea80 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f     ** file is no
1ea90 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e  t pBt->pageSize.
1eaa0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f   In this case lo
1eab0 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75  ckBtree() will u
1eac0 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74  pdate.    ** pBt
1ead0 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68  ->pageSize to th
1eae0 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
1eaf0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
1eb00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
1eb10 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  e( pBt->pPage1==
1eb20 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  0 && SQLITE_OK==
1eb30 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28  (rc = lockBtree(
1eb40 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66  pBt)) );..    if
1eb50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1eb60 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
1eb70 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73     if( (pBt->bts
1eb80 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
1eb90 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20  _ONLY)!=0 ){.   
1eba0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ebb0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
1ebc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ebd0 69 6e 74 20 65 78 46 6c 61 67 20 3d 20 62 43 6f  int exFlag = bCo
1ebe0 6e 63 75 72 72 65 6e 74 20 3f 20 2d 31 20 3a 20  ncurrent ? -1 : 
1ebf0 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20  (wrflag>1);.    
1ec00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ec10 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e  PagerBegin(pBt->
1ec20 70 50 61 67 65 72 2c 20 65 78 46 6c 61 67 2c 20  pPager, exFlag, 
1ec30 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
1ec40 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  ory(p->db));.   
1ec50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ec60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ec70 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
1ec80 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
1ec90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
1eca0 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41  =SQLITE_BUSY_SNA
1ecb0 50 53 48 4f 54 20 26 26 20 70 42 74 2d 3e 69 6e  PSHOT && pBt->in
1ecc0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1ecd0 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
1ece0 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 72 65       /* if there
1ecf0 20 77 61 73 20 6e 6f 20 74 72 61 6e 73 61 63 74   was no transact
1ed00 69 6f 6e 20 6f 70 65 6e 65 64 20 77 68 65 6e 20  ion opened when 
1ed10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
1ed20 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
1ed30 61 6c 6c 65 64 20 61 6e 64 20 53 51 4c 49 54 45  alled and SQLITE
1ed40 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 20 69  _BUSY_SNAPSHOT i
1ed50 73 20 72 65 74 75 72 6e 65 64 2c 20 63 68 61 6e  s returned, chan
1ed60 67 65 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20  ge the error.   
1ed70 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 74         ** code t
1ed80 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 2a  o SQLITE_BUSY. *
1ed90 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
1eda0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1edb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1edc0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
1edd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ede0 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
1edf0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1ee00 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
1ee10 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
1ee20 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
1ee30 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1ee40 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
1ee50 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
1ee60 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
1ee70 42 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  Bt) );.  sqlite3
1ee80 50 61 67 65 72 52 65 73 65 74 4c 6f 63 6b 54 69  PagerResetLockTi
1ee90 6d 65 6f 75 74 28 70 42 74 2d 3e 70 50 61 67 65  meout(pBt->pPage
1eea0 72 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  r);..  if( rc==S
1eeb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1eec0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1eed0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
1eee0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
1eef0 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66  ction++;.#ifndef
1ef00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1ef10 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
1ef20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
1ef30 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1ef40 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  t( p->lock.pBtre
1ef50 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e  e==p && p->lock.
1ef60 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
1ef70 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f       p->lock.eLo
1ef80 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
1ef90 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
1efa0 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
1efb0 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  ck;.        pBt-
1efc0 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63  >pLock = &p->loc
1efd0 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
1efe0 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  f.    }.    p->i
1eff0 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
1f000 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
1f010 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
1f020 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
1f030 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1f040 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
1f050 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
1f060 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
1f070 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29      if( wrflag )
1f080 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
1f090 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
1f0a0 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53  Page1;.#ifndef S
1f0b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1f0c0 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73  D_CACHE.      as
1f0d0 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69  sert( !pBt->pWri
1f0e0 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ter );.      pBt
1f0f0 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20  ->pWriter = p;. 
1f100 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
1f110 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55  gs &= ~BTS_EXCLU
1f120 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIVE;.      if( 
1f130 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e  wrflag>1 ) pBt->
1f140 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1f150 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69  EXCLUSIVE;.#endi
1f160 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  f..      /* If t
1f170 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65  he db-size heade
1f180 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72  r field is incor
1f190 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20  rect (as it may 
1f1a0 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20  be if an old.   
1f1b0 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73     ** client has
1f1c0 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68   been writing th
1f1d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
1f1e0 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e  , update it now.
1f1f0 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   Doing.      ** 
1f200 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68  this sooner rath
1f210 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65  er than later me
1f220 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
1f230 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79   size can safely
1f240 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65   .      ** re-re
1f250 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
1f260 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31  size from page 1
1f270 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   if a savepoint 
1f280 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  or transaction. 
1f290 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
1f2a0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1f2b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
1f2c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1f2d0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67  f( pBt->nPage!=g
1f2e0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1f2f0 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20  >aData[28]) ){. 
1f300 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f310 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1f320 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1f330 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1f340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f350 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1f360 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
1f370 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
1f380 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f390 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 74 72   }.    }.  }..tr
1f3a0 61 6e 73 5f 62 65 67 75 6e 3a 0a 23 69 66 6e 64  ans_begun:.#ifnd
1f3b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
1f3c0 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69 66 28 20  ONCURRENT.  if( 
1f3d0 62 43 6f 6e 63 75 72 72 65 6e 74 20 26 26 20 72  bConcurrent && r
1f3e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1f3f0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 57 61  sqlite3PagerIsWa
1f400 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  l(pBt->pPager) )
1f410 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1f420 65 33 50 61 67 65 72 42 65 67 69 6e 43 6f 6e 63  e3PagerBeginConc
1f430 75 72 72 65 6e 74 28 70 42 74 2d 3e 70 50 61 67  urrent(pBt->pPag
1f440 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
1f450 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1f460 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 72 63  flag ){.      rc
1f470 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70 41 6c   = btreePtrmapAl
1f480 6c 6f 63 61 74 65 28 70 42 74 29 3b 0a 20 20 20  locate(pBt);.   
1f490 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1f4a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f4b0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  OK ){.    if( pS
1f4c0 63 68 65 6d 61 56 65 72 73 69 6f 6e 20 29 7b 0a  chemaVersion ){.
1f4d0 20 20 20 20 20 20 2a 70 53 63 68 65 6d 61 56 65        *pSchemaVe
1f4e0 72 73 69 6f 6e 20 3d 20 67 65 74 34 62 79 74 65  rsion = get4byte
1f4f0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1f500 44 61 74 61 5b 34 30 5d 29 3b 0a 20 20 20 20 7d  Data[40]);.    }
1f510 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
1f520 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
1f530 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
1f540 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1f550 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
1f560 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
1f570 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** open savepoin
1f580 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  ts. If the secon
1f590 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67  d parameter is g
1f5a0 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e  reater than 0 an
1f5b0 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73  d.      ** the s
1f5c0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  ub-journal is no
1f5d0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
1f5e0 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20  then it will be 
1f5f0 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20  opened here..   
1f600 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
1f610 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e  nSavepoint = p->
1f620 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 0a  db->nSavepoint;.
1f630 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f640 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
1f650 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
1f660 2c 20 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , nSavepoint);. 
1f670 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f680 49 54 45 5f 4f 4b 20 26 26 20 6e 53 61 76 65 70  ITE_OK && nSavep
1f690 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  oint ){.        
1f6a0 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70  rc = btreePtrmap
1f6b0 42 65 67 69 6e 28 70 42 74 2c 20 6e 53 61 76 65  Begin(pBt, nSave
1f6c0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
1f6d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72      }.  }..  btr
1f6e0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1f6f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1f700 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1f710 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1f720 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1f730 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65  VACUUM../*.** Se
1f740 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
1f750 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
1f760 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61  l children of pa
1f770 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20  ge pPage. Also, 
1f780 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74  if.** pPage cont
1f790 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20  ains cells that 
1f7a0 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
1f7b0 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65  w pages, set the
1f7c0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
1f7d0 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
1f7e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
1f7f0 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  s well..*/.stati
1f800 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74  c int setChildPt
1f810 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70  rmaps(MemPage *p
1f820 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
1f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1f850 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
1f860 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
1f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f880 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f890 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61  r of cells in pa
1f8a0 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  ge pPage */.  in
1f8b0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8d0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1f8e0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
1f8f0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1f900 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
1f910 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61  Page->pgno;..  a
1f920 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1f930 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1f940 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1f950 20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73    rc = pPage->is
1f960 49 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  Init ? SQLITE_OK
1f970 20 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   : btreeInitPage
1f980 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  (pPage);.  if( r
1f990 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1f9a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c  eturn rc;.  nCel
1f9b0 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
1f9c0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
1f9d0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
1f9e0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
1f9f0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1fa00 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f  ..    ptrmapPutO
1fa10 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 50  vflPtr(pPage, pP
1fa20 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
1fa30 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
1fa40 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1fa50 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
1fa60 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
1fa70 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
1fa80 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1fa90 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1faa0 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
1fab0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
1fac0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1fad0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
1fae0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1faf0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1fb00 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1fb10 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1fb20 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
1fb30 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
1fb40 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 72  , &rc);.  }..  r
1fb50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1fb60 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
1fb70 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74  pPage is a point
1fb80 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d  er to page iFrom
1fb90 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  .  Modify this p
1fba0 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61  ointer so.** tha
1fbb0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69  t it points to i
1fbc0 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
1fbd0 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
1fbe0 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
1fbf0 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66  r to.** be modif
1fc00 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73  ied, as  follows
1fc10 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
1fc20 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
1fc30 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
1fc40 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1fc50 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
1fc60 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1fc70 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
1fc80 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
1fc90 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
1fca0 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
1fcb0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1fcc0 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
1fcd0 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
1fce0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
1fcf0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
1fd00 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
1fd10 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
1fd20 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
1fd30 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
1fd40 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
1fd50 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1fd60 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1fd80 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1fd90 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
1fda0 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
1fdb0 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
1fdc0 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
1fdd0 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
1fde0 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
1fdf0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1fe00 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1fe10 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1fe20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
1fe30 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
1fe40 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
1fe50 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
1fe60 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1fe70 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
1fe80 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
1fe90 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
1fea0 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
1feb0 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
1fec0 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
1fed0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
1fee0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1fef0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1ff00 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
1ff10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  );.    }.    put
1ff20 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1ff30 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
1ff40 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e{.    int i;.  
1ff50 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20    int nCell;.   
1ff60 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63   int rc;..    rc
1ff70 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1ff80 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62   ? SQLITE_OK : b
1ff90 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1ffa0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1ffb0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1ffc0 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1ffd0 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
1ffe0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1fff0 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
20000 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
20010 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
20020 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
20030 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
20040 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
20050 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50  info;.        pP
20060 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
20070 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
20080 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
20090 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e  ( info.nLocal<in
200a0 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20  fo.nPayload ){. 
200b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
200c0 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20  ll+info.nSize > 
200d0 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
200e0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
200f0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
20100 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20110 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
20120 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
20130 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
20140 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
20150 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
20160 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -4) ){.         
20170 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
20180 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20  l+info.nSize-4, 
20190 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
201a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
201b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
201c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
201d0 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
201e0 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
201f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
20200 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
20210 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
20220 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
20230 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
20240 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
20250 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
20260 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
20270 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
20280 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
20290 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
202a0 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
202b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
202c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
202d0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
202e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
202f0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
20300 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
20310 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
20320 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
20330 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20340 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
20350 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
20360 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
20370 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
20380 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
20390 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
203a0 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
203b0 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
203c0 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
203d0 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
203e0 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
203f0 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
20400 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
20410 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
20420 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
20430 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
20440 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
20450 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
20460 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
20470 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
20480 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
20490 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
204a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
204b0 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
204c0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
204d0 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
204e0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
204f0 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
20500 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
20510 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
20520 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20530 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
20540 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
20550 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
20560 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
20570 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
20580 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
20590 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
205a0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
205b0 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
205c0 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
205d0 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
205e0 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
205f0 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
20600 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
20610 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
20620 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
20630 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
20640 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
20650 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
20660 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
20670 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
20680 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
20690 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
206a0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
206b0 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
206c0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
206d0 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
206e0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
206f0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
20700 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
20710 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
20720 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
20730 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
20740 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
20750 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
20760 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
20770 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
20780 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 69  >pBt==pBt );.  i
20790 66 28 20 69 44 62 50 61 67 65 3c 33 20 29 20 72  f( iDbPage<3 ) r
207a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
207b0 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a  RUPT_BKPT;..  /*
207c0 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
207d0 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
207e0 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
207f0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
20800 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
20810 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
20820 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
20830 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
20840 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
20850 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
20860 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
20870 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
20880 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
20890 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
208a0 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
208b0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
208c0 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  , isCommit);.  i
208d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
208e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
208f0 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65  c;.  }.  pDbPage
20900 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61  ->pgno = iFreePa
20910 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62  ge;..  /* If pDb
20920 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65  Page was a btree
20930 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d  -page, then it m
20940 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61  ay have child pa
20950 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73  ges and/or cells
20960 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74  .  ** that point
20970 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
20980 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  es. The pointer 
20990 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
209a0 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70  all these.  ** p
209b0 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
209c0 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20  changed..  **.  
209d0 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73  ** If pDbPage is
209e0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
209f0 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
20a00 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74  t 4 bytes may st
20a10 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74  ore a.  ** point
20a20 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65  er to a subseque
20a30 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
20a40 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
20a50 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a   case, then.  **
20a60 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
20a70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
20a80 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62  ated for the sub
20a90 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
20aa0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
20ab0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
20ac0 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
20ad0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
20ae0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
20af0 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50  hildPtrmaps(pDbP
20b00 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
20b10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20b20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20b30 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
20b40 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c     Pgno nextOvfl
20b50 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50   = get4byte(pDbP
20b60 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
20b70 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30   if( nextOvfl!=0
20b80 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
20b90 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
20ba0 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
20bb0 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20  OW2, iFreePage, 
20bc0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
20bd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20be0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20bf0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
20c00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20  }.  }..  /* Fix 
20c10 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69  the database poi
20c20 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74  nter on page iPt
20c30 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74  rPage that point
20c40 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f  ed at iDbPage so
20c50 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  .  ** that it po
20c60 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67  ints at iFreePag
20c70 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20  e. Also fix the 
20c80 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
20c90 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50  y for.  ** iPtrP
20ca0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
20cb0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
20cc0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
20cd0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
20ce0 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
20cf0 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
20d00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20d10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
20d20 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
20d30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20d40 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
20d50 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
20d60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20d70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
20d80 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
20d90 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20da0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
20db0 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
20dc0 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
20dd0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
20de0 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
20df0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
20e00 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
20e10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20e20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
20e30 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
20e40 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
20e50 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
20e60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20e70 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
20e80 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
20e90 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
20ea0 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
20eb0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
20ec0 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
20ed0 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
20ee0 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
20ef0 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
20f00 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
20f10 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
20f20 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
20f30 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  sful, return.** 
20f40 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
20f50 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
20f60 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
20f70 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20  ore no point in 
20f80 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  .** calling this
20f90 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
20fa0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
20fb0 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20  DONE. Or, if an 
20fc0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
20fd0 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74  , return some ot
20fe0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  her error code..
20ff0 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
21000 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75  fically, this fu
21010 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
21020 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74  to re-organize t
21030 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a  he database so .
21040 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  ** that the last
21050 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
21060 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
21070 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  se is no longer 
21080 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  in use..**.** Pa
21090 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20  rameter nFin is 
210a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
210b0 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61  ges that this da
210c0 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e  tabase would con
210d0 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69  tain.** were thi
210e0 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  s function calle
210f0 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  d until it retur
21100 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  ns SQLITE_DONE..
21110 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f  **.** If the bCo
21120 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69  mmit parameter i
21130 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73  s non-zero, this
21140 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
21150 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63  s that the .** c
21160 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
21170 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
21180 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69  umStep() until i
21190 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
211a0 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20  _DONE .** or an 
211b0 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69  error. bCommit i
211c0 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f  s passed true fo
211d0 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
211e0 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f  -on-commit .** o
211f0 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c  peration, or fal
21200 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d  se for an increm
21210 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f  ental vacuum..*/
21220 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
21230 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
21240 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
21250 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
21260 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  g, int bCommit){
21270 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
21280 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
21290 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
212a0 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
212b0 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e-list */.  int 
212c0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
212d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
212e0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
212f0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
21300 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
21310 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
21320 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
21330 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
21340 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
21350 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70  ) ){.    u8 eTyp
21360 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
21370 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
21380 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
21390 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
213a0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
213b0 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  ( nFreeList==0 )
213c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
213d0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
213e0 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  }..    rc = ptrm
213f0 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74  apGet(pBt, iLast
21400 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  Pg, &eType, &iPt
21410 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
21420 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21430 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
21440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
21450 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
21460 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
21470 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
21480 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
21490 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
214a0 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
214b0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  E ){.      if( b
214c0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
214d0 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
214e0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
214f0 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
21500 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
21510 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
21520 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * if bCommit is 
21530 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
21540 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
21550 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
21560 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
21570 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
21580 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
21590 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
215a0 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
215b0 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
215c0 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
215d0 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
215e0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
215f0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
21600 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
21610 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
21620 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
21630 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
21640 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
21650 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
21660 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a  BTALLOC_EXACT);.
21670 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
21680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21690 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
216a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
216b0 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
216c0 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
216d0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
216e0 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
216f0 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
21700 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
21710 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
21720 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
21730 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
21740 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
21750 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
21760 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20  astPg;.      u8 
21770 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
21780 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70  ANY;   /* Mode p
21790 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
217a0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
217b0 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69   */.      Pgno i
217c0 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Near = 0;       
217d0 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61      /* nearby pa
217e0 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
217f0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
21800 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62  */..      rc = b
21810 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
21820 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
21830 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
21840 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21850 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
21860 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
21870 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d       /* If bComm
21880 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  it is zero, this
21890 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
218a0 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
218b0 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
218c0 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
218d0 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
218e0 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
218f0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
21900 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21910 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
21920 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20  and, if bCommit 
21930 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
21940 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a  zero, then keep.
21950 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67        ** looping
21960 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61   until a free-pa
21970 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69  ge located withi
21980 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e  n the first nFin
21990 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
219a0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66  of the file is f
219b0 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ound..      */. 
219c0 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
219d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
219e0 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c  Mode = BTALLOC_L
219f0 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72  E;.        iNear
21a00 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d   = nFin;.      }
21a10 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
21a20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
21a30 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
21a40 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
21a50 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
21a60 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e  Pg, &iFreePg, iN
21a70 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ear, eMode);.   
21a80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
21a90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21aa0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
21ab0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
21ac0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21ad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21ae0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
21af0 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
21b00 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20  ile( bCommit && 
21b10 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
21b20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
21b30 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
21b40 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
21b50 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
21b60 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
21b70 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
21b80 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29  FreePg, bCommit)
21b90 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
21ba0 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
21bb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21bc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21bd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
21be0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
21bf0 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
21c00 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  ){.    do {.    
21c10 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
21c20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67   }while( iLastPg
21c30 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
21c40 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d  AGE(pBt) || PTRM
21c50 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
21c60 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70  LastPg) );.    p
21c70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
21c80 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50  = 1;.    pBt->nP
21c90 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20  age = iLastPg;. 
21ca0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
21cb0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
21cc0 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  The database ope
21cd0 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
21ce0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
21cf0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
21d00 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61  base.** nOrig pa
21d10 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74  ges in size cont
21d20 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65  aining nFree fre
21d30 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  e pages. Return 
21d40 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
21d50 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
21d60 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66  abase in pages f
21d70 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f  ollowing an auto
21d80 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f  -vacuum operatio
21d90 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  n..*/.static Pgn
21da0 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74  o finalDbSize(Bt
21db0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
21dc0 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46  o nOrig, Pgno nF
21dd0 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74  ree){.  int nEnt
21de0 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
21df0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21e00 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
21e10 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20  one ptrmap page 
21e20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61  */.  Pgno nPtrma
21e30 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
21e40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21e50 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74  f PtrMap pages t
21e60 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
21e70 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e90 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
21ea0 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70  */..  nEntry = p
21eb0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
21ec0 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e  ;.  nPtrmap = (n
21ed0 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
21ee0 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
21ef0 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e  rig)+nEntry)/nEn
21f00 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f  try;.  nFin = nO
21f10 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
21f20 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72  trmap;.  if( nOr
21f30 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
21f40 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
21f50 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  n<PENDING_BYTE_P
21f60 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
21f70 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68  nFin--;.  }.  wh
21f80 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
21f90 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c  GE(pBt, nFin) ||
21fa0 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   nFin==PENDING_B
21fb0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
21fc0 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
21fd0 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b  ..  return nFin;
21fe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74  .}../*.** A writ
21ff0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
22000 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66  st be opened bef
22010 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
22020 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
22030 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67   performs a sing
22040 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20  le unit of work 
22050 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65  towards an incre
22060 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
22070 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72  *.** If the incr
22080 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69  emental vacuum i
22090 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72  s finished after
220a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
220b0 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54  as run,.** SQLIT
220c0 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
220d0 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
220e0 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e   finished, but n
220f0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  o error occurred
22100 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
22110 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
22120 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
22130 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
22140 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22150 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
22160 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
22170 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
22180 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
22190 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
221a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
221b0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
221c0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
221d0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
221e0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
221f0 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
22200 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
22210 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
22220 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72  se{.    Pgno nOr
22230 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
22240 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67  unt(pBt);.    Pg
22250 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  no nFree = get4b
22260 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
22270 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
22280 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69    Pgno nFin = fi
22290 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
222a0 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20  Orig, nFree);.. 
222b0 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69     if( nOrig<nFi
222c0 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
222d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
222e0 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  KPT;.    }else i
222f0 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  f( nFree>0 ){.  
22300 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
22310 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
22320 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
22330 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22340 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
22350 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
22360 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
22370 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
22380 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e  tep(pBt, nFin, n
22390 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  Orig, 0);.      
223a0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
223b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
223c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
223d0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
223e0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
223f0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
22400 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
22410 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
22420 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
22430 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
22440 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
22450 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ONE;.    }.  }. 
22460 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
22470 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
22480 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
22490 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
224a0 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
224b0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
224c0 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
224d0 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74  on.** is committ
224e0 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
224f0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
22500 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
22510 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
22520 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
22530 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
22540 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
22550 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22560 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
22570 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
22580 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
22590 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
225a0 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
225b0 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
225c0 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
225d0 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
225e0 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
225f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22600 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
22610 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
22620 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
22630 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
22640 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
22650 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c  Pager;.  VVA_ONL
22660 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  Y( int nRef = sq
22670 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
22680 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a 0a 20  nt(pPager); ).. 
22690 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
226a0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
226b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
226c0 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
226d0 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
226e0 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
226f0 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
22700 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
22710 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
22720 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
22730 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
22740 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61  database after a
22750 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a  utovacuuming */.
22760 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20      Pgno nFree; 
22770 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
22780 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
22790 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61   freelist initia
227a0 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  lly */.    Pgno 
227b0 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  iFree;        /*
227c0 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74   The next page t
227d0 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
227e0 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
227f0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
22800 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65   size before fre
22810 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72  eing */..    nOr
22820 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
22830 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66  unt(pBt);.    if
22840 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
22850 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e  pBt, nOrig) || n
22860 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
22870 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
22880 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
22890 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
228a0 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
228b0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66   for which the f
228c0 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20  inal page.      
228d0 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70  ** is either a p
228e0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
228f0 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
22900 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65  yte page. If one
22910 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63  .      ** is enc
22920 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69  ountered, this i
22930 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74  ndicates corrupt
22940 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
22950 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22960 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
22970 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65      }..    nFree
22980 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
22990 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
229a0 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  36]);.    nFin =
229b0 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
229c0 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
229d0 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f  .    if( nFin>nO
229e0 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rig ) return SQL
229f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
22a00 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e  ;.    if( nFin<n
22a10 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
22a20 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
22a30 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
22a40 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65    }.    for(iFre
22a50 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e  e=nOrig; iFree>n
22a60 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Fin && rc==SQLIT
22a70 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a  E_OK; iFree--){.
22a80 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
22a90 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
22aa0 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a  Fin, iFree, 1);.
22ab0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
22ac0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c  c==SQLITE_DONE |
22ad0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc==SQLITE_OK)
22ae0 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20   && nFree>0 ){. 
22af0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22b00 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
22b10 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
22b20 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
22b30 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
22b40 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20  aData[32], 0);. 
22b50 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
22b60 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
22b70 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[36], 0);.     
22b80 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
22b90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
22ba0 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20  ], nFin);.      
22bb0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
22bc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d   = 1;.      pBt-
22bd0 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20  >nPage = nFin;. 
22be0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
22bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22c00 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
22c10 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
22c20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
22c30 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c  ssert( nRef>=sql
22c40 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
22c50 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  t(pPager) );.  r
22c60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
22c70 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  se /* ifndef SQL
22c80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
22c90 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  UUM */.# define 
22ca0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
22cb0 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  x) SQLITE_OK.#en
22cc0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
22cd0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
22ce0 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ENT./*.** This f
22cf0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
22d00 64 20 61 73 20 70 61 72 74 20 6f 66 20 6d 65 72  d as part of mer
22d10 67 69 6e 67 20 61 6e 20 43 4f 4e 43 55 52 52 45  ging an CONCURRE
22d20 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  NT transaction w
22d30 69 74 68 0a 2a 2a 20 74 68 65 20 73 6e 61 70 73  ith.** the snaps
22d40 68 6f 74 20 61 74 20 74 68 65 20 68 65 61 64 20  hot at the head 
22d50 6f 66 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2e  of the wal file.
22d60 20 49 74 20 72 65 6c 6f 63 61 74 65 73 20 61 6c   It relocates al
22d70 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 0a 2a  l pages in the.*
22d80 2a 20 72 61 6e 67 65 20 69 46 69 72 73 74 2e 2e  * range iFirst..
22d90 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65  iLast, inclusive
22da0 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
22db0 74 68 61 74 20 74 68 65 20 42 74 72 65 65 50 74  that the BtreePt
22dc0 72 6d 61 70 20 0a 2a 2a 20 73 74 72 75 63 74 75  rmap .** structu
22dd0 72 65 20 61 74 20 42 74 53 68 61 72 65 64 2e 70  re at BtShared.p
22de0 4d 61 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  Map contains the
22df0 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
22e00 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 65 61 63   pointers to eac
22e10 68 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65  h.** page in the
22e20 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   range..**.** If
22e30 20 70 6e 43 75 72 72 65 6e 74 20 69 73 20 4e 55   pnCurrent is NU
22e40 4c 4c 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  LL, then all pag
22e50 65 73 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20  es in the range 
22e60 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 63 75 72  are moved to cur
22e70 72 65 6e 74 6c 79 0a 2a 2a 20 66 72 65 65 20 6c  rently.** free l
22e80 6f 63 61 74 69 6f 6e 73 20 28 69 2e 65 2e 20 66  ocations (i.e. f
22e90 72 65 65 2d 6c 69 73 74 20 65 6e 74 72 69 65 73  ree-list entries
22ea0 29 20 77 69 74 68 69 6e 20 74 68 65 20 64 61 74  ) within the dat
22eb0 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
22ec0 65 20 70 61 67 65 0a 2a 2a 20 69 46 69 72 73 74  e page.** iFirst
22ed0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 70  ..**.** Or, if p
22ee0 6e 43 75 72 72 65 6e 74 20 69 73 20 6e 6f 74 20  nCurrent is not 
22ef0 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 70 6f  NULL, then it po
22f00 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 75 65 20  ints to a value 
22f10 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a  containing the.*
22f20 2a 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * current size o
22f30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
22f40 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 6e  ile in pages. In
22f50 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 6c 20   this case, all 
22f60 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 72 65 6c  pages are.** rel
22f70 6f 63 61 74 65 64 20 74 6f 20 74 68 65 20 65 6e  ocated to the en
22f80 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
22f90 65 20 66 69 6c 65 20 2d 20 70 61 67 65 20 69 46  e file - page iF
22fa0 69 72 73 74 20 69 73 20 72 65 6c 6f 63 61 74 65  irst is relocate
22fb0 64 20 74 6f 0a 2a 2a 20 70 61 67 65 20 28 2a 70  d to.** page (*p
22fc0 6e 43 75 72 72 65 6e 74 2b 31 29 2c 20 70 61 67  nCurrent+1), pag
22fd0 65 20 69 46 69 72 73 74 2b 31 20 74 6f 20 70 61  e iFirst+1 to pa
22fe0 67 65 20 28 2a 70 6e 43 75 72 72 65 6e 74 2b 32  ge (*pnCurrent+2
22ff0 29 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a  ), and so on..**
23000 20 56 61 6c 75 65 20 2a 70 6e 43 75 72 72 65 6e   Value *pnCurren
23010 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
23020 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20  new size of the 
23030 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
23040 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
23050 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  n returns..**.**
23060 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
23070 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
23080 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
23090 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
230a0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
230b0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
230c0 52 65 6c 6f 63 61 74 65 52 61 6e 67 65 28 0a 20  RelocateRange(. 
230d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230f0 20 2f 2a 20 42 2d 74 72 65 65 20 68 61 6e 64 6c   /* B-tree handl
23100 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 69 72  e */.  Pgno iFir
23110 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
23120 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
23130 70 61 67 65 20 74 6f 20 72 65 6c 6f 63 61 74 65  page to relocate
23140 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74   */.  Pgno iLast
23150 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23160 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61        /* Last pa
23170 67 65 20 74 6f 20 72 65 6c 6f 63 61 74 65 20 2a  ge to relocate *
23180 2f 0a 20 20 50 67 6e 6f 20 2a 70 6e 43 75 72 72  /.  Pgno *pnCurr
23190 65 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ent             
231a0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
231b0 4c 4c 2c 20 49 4e 2f 4f 55 54 3a 20 44 61 74 61  LL, IN/OUT: Data
231c0 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a  base size */.){.
231d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
231e0 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 50 74 72  E_OK;.  BtreePtr
231f0 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d  map *pMap = pBt-
23200 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69 50  >pMap;.  Pgno iP
23210 67 3b 0a 0a 20 20 66 6f 72 28 69 50 67 3d 69 46  g;..  for(iPg=iF
23220 69 72 73 74 3b 20 69 50 67 3c 3d 69 4c 61 73 74  irst; iPg<=iLast
23230 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
23240 4b 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 4d  K; iPg++){.    M
23250 65 6d 50 61 67 65 20 2a 70 46 72 65 65 20 3d 20  emPage *pFree = 
23260 30 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 61  0;     /* Page a
23270 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d 20 66 72  llocated from fr
23280 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 20 20 4d  ee-list */.    M
23290 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
232a0 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 3b 20  .    Pgno iNew; 
232b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
232c0 4e 65 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  New page number 
232d0 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 20 20 50  for pPg */.    P
232e0 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74  trmapEntry *pEnt
232f0 72 79 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ry;    /* Pointe
23300 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
23310 70 61 67 65 20 69 50 67 20 2a 2f 0a 0a 20 20 20  page iPg */..   
23320 20 69 66 28 20 69 50 67 3d 3d 50 45 4e 44 49 4e   if( iPg==PENDIN
23330 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
23340 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23350 20 70 45 6e 74 72 79 20 3d 20 26 70 4d 61 70 2d   pEntry = &pMap-
23360 3e 61 50 74 72 5b 69 50 67 20 2d 20 70 4d 61 70  >aPtr[iPg - pMap
23370 2d 3e 69 46 69 72 73 74 5d 3b 0a 0a 20 20 20 20  ->iFirst];..    
23380 69 66 28 20 70 45 6e 74 72 79 2d 3e 65 54 79 70  if( pEntry->eTyp
23390 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
233a0 47 45 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  GE ){.      Pgno
233b0 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 72 63   dummy;.      rc
233c0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
233d0 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
233e0 2c 20 26 64 75 6d 6d 79 2c 20 69 50 67 2c 20 42  , &dummy, iPg, B
233f0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20  TALLOC_EXACT);. 
23400 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29       if( pFree )
23410 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
23420 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
23430 67 65 52 65 66 63 6f 75 6e 74 28 70 46 72 65 65  geRefcount(pFree
23440 2d 3e 70 44 62 50 61 67 65 29 3d 3d 31 20 29 3b  ->pDbPage)==1 );
23450 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23460 50 63 61 63 68 65 44 72 6f 70 28 70 46 72 65 65  PcacheDrop(pFree
23470 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
23480 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
23490 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
234a0 7c 7c 20 64 75 6d 6d 79 3d 3d 69 50 67 20 29 3b  || dummy==iPg );
234b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
234c0 6e 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20  nCurrent ){.    
234d0 20 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70    btreeGetPage(p
234e0 42 74 2c 20 69 50 67 2c 20 26 70 50 67 2c 20 30  Bt, iPg, &pPg, 0
234f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
23500 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
23510 72 69 74 65 61 62 6c 65 28 70 50 67 2d 3e 70 44  riteable(pPg->pD
23520 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
23530 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
23540 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
23550 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3d 3d  (pPg->pDbPage)==
23560 31 20 29 3b 0a 20 20 20 20 20 20 69 4e 65 77 20  1 );.      iNew 
23570 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65 6e 74 29  = ++(*pnCurrent)
23580 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4e 65 77  ;.      if( iNew
23590 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
235a0 41 47 45 28 70 42 74 29 20 29 20 69 4e 65 77 20  AGE(pBt) ) iNew 
235b0 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65 6e 74 29  = ++(*pnCurrent)
235c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c  ;.      rc = rel
235d0 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
235e0 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65 54 79 70  Pg, pEntry->eTyp
235f0 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e  e, pEntry->paren
23600 74 2c 20 69 4e 65 77 2c 20 31 29 3b 0a 20 20 20  t, iNew, 1);.   
23610 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f     releasePageNo
23620 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20  tNull(pPg);.    
23630 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
23640 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
23650 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 2c  age(pBt, &pFree,
23660 20 26 69 4e 65 77 2c 20 69 46 69 72 73 74 2d 31   &iNew, iFirst-1
23670 2c 20 42 54 41 4c 4c 4f 43 5f 4c 45 29 3b 0a 20  , BTALLOC_LE);. 
23680 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
23690 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 4e  =SQLITE_OK || iN
236a0 65 77 3c 69 46 69 72 73 74 20 29 3b 0a 20 20 20  ew<iFirst );.   
236b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
236c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
236d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
236e0 65 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65  e);.        btre
236f0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
23700 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20  g, &pPg, 0);.   
23710 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
23720 74 65 50 61 67 65 28 70 42 74 2c 20 70 50 67 2c  tePage(pBt, pPg,
23730 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c 20   pEntry->eType, 
23740 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74 2c 69  pEntry->parent,i
23750 4e 65 77 2c 31 29 3b 0a 20 20 20 20 20 20 20 20  New,1);.        
23760 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
23770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23780 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23790 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28  .}../* !defined(
237a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
237b0 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54 68  URRENT).**.** Th
237c0 65 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  e b-tree handle 
237d0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
237e0 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  ly argument is a
237f0 62 6f 75 74 20 74 6f 20 63 6f 6d 6d 69 74 20 61  bout to commit a
23800 6e 0a 2a 2a 20 43 4f 4e 43 55 52 52 45 4e 54 20  n.** CONCURRENT 
23810 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 74 20  transaction. At 
23820 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
23830 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
23840 20 74 68 69 73 20 69 73 20 0a 2a 2a 20 70 6f 73   this is .** pos
23850 73 69 62 6c 65 20 2d 20 74 68 65 20 77 61 6c 20  sible - the wal 
23860 57 52 49 54 45 52 20 6c 6f 63 6b 20 69 73 20 68  WRITER lock is h
23870 65 6c 64 20 61 6e 64 20 69 74 20 69 73 20 6b 6e  eld and it is kn
23880 6f 77 6e 20 74 68 61 74 20 74 68 65 72 65 20 61  own that there a
23890 72 65 20 0a 2a 2a 20 6e 6f 20 63 6f 6e 66 6c 69  re .** no confli
238a0 63 74 73 20 77 69 74 68 20 63 6f 6d 6d 69 74 74  cts with committ
238b0 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ed transactions.
238c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
238d0 74 72 65 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28  treeFixUnlocked(
238e0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
238f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
23900 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
23910 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
23920 61 67 65 31 3b 0a 20 20 75 38 20 2a 70 31 20 3d  age1;.  u8 *p1 =
23930 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a   pPage1->aData;.
23940 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
23950 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
23960 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23970 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 61  _OK;..  /* If pa
23980 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
23990 62 61 73 65 20 69 73 20 6e 6f 74 20 77 72 69 74  base is not writ
239a0 61 62 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 70 61  able, then no pa
239b0 67 65 73 20 77 65 72 65 20 61 6c 6c 6f 63 61 74  ges were allocat
239c0 65 64 0a 20 20 2a 2a 20 6f 72 20 66 72 65 65 64  ed.  ** or freed
239d0 20 62 79 20 74 68 69 73 20 74 72 61 6e 73 61 63   by this transac
239e0 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
239f0 73 65 20 6e 6f 20 73 70 65 63 69 61 6c 20 68 61  se no special ha
23a00 6e 64 6c 69 6e 67 20 69 73 20 0a 20 20 2a 2a 20  ndling is .  ** 
23a10 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
23a20 69 73 65 2c 20 69 66 20 70 61 67 65 20 31 20 69  ise, if page 1 i
23a30 73 20 64 69 72 74 79 2c 20 70 72 6f 63 65 65 64  s dirty, proceed
23a40 2e 20 20 2a 2f 0a 20 20 42 74 72 65 65 50 74 72  .  */.  BtreePtr
23a50 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d  map *pMap = pBt-
23a60 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69 54  >pMap;.  Pgno iT
23a70 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
23a80 26 70 31 5b 33 32 5d 29 3b 0a 20 20 50 67 6e 6f  &p1[32]);.  Pgno
23a90 20 6e 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   nPage = btreePa
23aa0 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
23ab0 75 33 32 20 6e 46 72 65 65 20 3d 20 67 65 74 34  u32 nFree = get4
23ac0 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a  byte(&p1[36]);..
23ad0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
23ae0 4d 61 70 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  Map );.  rc = sq
23af0 6c 69 74 65 33 50 61 67 65 72 55 70 67 72 61 64  lite3PagerUpgrad
23b00 65 53 6e 61 70 73 68 6f 74 28 70 50 61 67 65 72  eSnapshot(pPager
23b10 2c 20 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  , pPage1->pDbPag
23b20 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31  e);.  assert( p1
23b30 3d 3d 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ==pPage1->aData 
23b40 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
23b50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
23b60 67 6e 6f 20 6e 48 50 61 67 65 20 3d 20 67 65 74  gno nHPage = get
23b70 34 62 79 74 65 28 26 70 31 5b 32 38 5d 29 3b 0a  4byte(&p1[28]);.
23b80 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
23b90 6e 48 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  nHPage;         
23ba0 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 61 66  /* Size of db af
23bb0 74 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ter transaction 
23bc0 6d 65 72 67 65 20 2a 2f 0a 0a 20 20 20 20 69 66  merge */..    if
23bd0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
23be0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
23bf0 2d 3e 70 44 62 50 61 67 65 29 20 29 7b 0a 20 20  ->pDbPage) ){.  
23c00 20 20 20 20 50 67 6e 6f 20 69 48 54 72 75 6e 6b      Pgno iHTrunk
23c10 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 31 5b   = get4byte(&p1[
23c20 33 32 5d 29 3b 0a 20 20 20 20 20 20 75 33 32 20  32]);.      u32 
23c30 6e 48 46 72 65 65 20 3d 20 67 65 74 34 62 79 74  nHFree = get4byt
23c40 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a 20 20 20  e(&p1[36]);..   
23c50 20 20 20 62 74 72 65 65 50 74 72 6d 61 70 43 68     btreePtrmapCh
23c60 65 63 6b 28 70 42 74 2c 20 6e 50 61 67 65 29 3b  eck(pBt, nPage);
23c70 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63  ..      /* Attac
23c80 68 20 74 68 65 20 68 65 61 64 20 64 61 74 61 62  h the head datab
23c90 61 73 65 20 66 72 65 65 20 6c 69 73 74 20 74 6f  ase free list to
23ca0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
23cb0 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  current.      **
23cc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 66 72   transactions fr
23cd0 65 65 2d 6c 69 73 74 20 28 69 66 20 61 6e 79 29  ee-list (if any)
23ce0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
23cf0 69 54 72 75 6e 6b 21 3d 30 20 29 7b 0a 20 20 20  iTrunk!=0 ){.   
23d00 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
23d10 31 5b 33 36 5d 2c 20 6e 48 46 72 65 65 20 2b 20  1[36], nHFree + 
23d20 6e 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  nFree);.        
23d30 70 75 74 34 62 79 74 65 28 26 70 31 5b 33 32 5d  put4byte(&p1[32]
23d40 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  , iTrunk);.     
23d50 20 20 20 77 68 69 6c 65 28 20 69 54 72 75 6e 6b     while( iTrunk
23d60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62   ){.          Db
23d70 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 73  Page *pTrunk = s
23d80 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
23d90 70 28 70 50 61 67 65 72 2c 20 69 54 72 75 6e 6b  p(pPager, iTrunk
23da0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 54 72  );.          iTr
23db0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 28  unk = get4byte((
23dc0 75 38 2a 29 70 54 72 75 6e 6b 2d 3e 70 44 61 74  u8*)pTrunk->pDat
23dd0 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  a);.          if
23de0 28 20 69 54 72 75 6e 6b 3d 3d 30 20 29 7b 0a 20  ( iTrunk==0 ){. 
23df0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
23e00 79 74 65 28 28 75 38 2a 29 70 54 72 75 6e 6b 2d  yte((u8*)pTrunk-
23e10 3e 70 44 61 74 61 2c 20 69 48 54 72 75 6e 6b 29  >pData, iHTrunk)
23e20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23e30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
23e40 61 67 65 72 55 6e 72 65 66 28 70 54 72 75 6e 6b  agerUnref(pTrunk
23e50 29 3b 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20  );.        };.  
23e60 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
23e70 20 6e 48 50 61 67 65 3c 28 70 4d 61 70 2d 3e 69   nHPage<(pMap->i
23e80 46 69 72 73 74 2d 31 29 20 29 7b 0a 20 20 20 20  First-1) ){.    
23e90 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
23ea0 61 73 65 20 63 6f 6e 73 69 73 74 65 64 20 6f 66  ase consisted of
23eb0 20 28 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31   (pMap->iFirst-1
23ec0 29 20 70 61 67 65 73 20 77 68 65 6e 20 74 68 65  ) pages when the
23ed0 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20   current.       
23ee0 20 2a 2a 20 63 6f 6e 63 75 72 72 65 6e 74 20 74   ** concurrent t
23ef0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f  ransaction was o
23f00 70 65 6e 65 64 2e 20 41 6e 64 20 61 6e 20 63 6f  pened. And an co
23f10 6e 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63  ncurrent transac
23f20 74 69 6f 6e 20 6d 61 79 0a 20 20 20 20 20 20 20  tion may.       
23f30 20 2a 2a 20 6e 6f 74 20 62 65 20 65 78 65 63 75   ** not be execu
23f40 74 65 64 20 6f 6e 20 61 6e 20 61 75 74 6f 2d 76  ted on an auto-v
23f50 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 20 2d  acuum database -
23f60 20 73 6f 20 74 68 65 20 64 62 20 73 68 6f 75 6c   so the db shoul
23f70 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  d .        ** no
23f80 74 20 68 61 76 65 20 73 68 72 75 6e 6b 20 73 69  t have shrunk si
23f90 6e 63 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  nce the transact
23fa0 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
23fb0 54 68 65 72 65 66 6f 72 65 20 6e 48 50 61 67 65  Therefore nHPage
23fc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 75  .        ** shou
23fd0 6c 64 20 62 65 20 73 65 74 20 74 6f 20 28 70 4d  ld be set to (pM
23fe0 61 70 2d 3e 69 46 69 72 73 74 2d 31 29 20 6f 72  ap->iFirst-1) or
23ff0 20 67 72 65 61 74 65 72 2e 20 2a 2f 0a 20 20 20   greater. */.   
24000 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24010 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
24020 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24030 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
24040 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  nt transaction a
24050 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 73 20 70  llocated pages p
24060 4d 61 70 2d 3e 69 46 69 72 73 74 20 74 68 72 6f  Map->iFirst thro
24070 75 67 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  ugh.        ** n
24080 50 61 67 65 20 28 69 6e 63 6c 75 73 69 76 65 29  Page (inclusive)
24090 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
240a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
240b0 2e 20 4d 65 61 6e 77 68 69 6c 65 2c 0a 20 20 20  . Meanwhile,.   
240c0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 74 72       ** other tr
240d0 61 6e 73 61 63 74 69 6f 6e 73 20 68 61 76 65 20  ansactions have 
240e0 61 6c 6c 6f 63 61 74 65 64 20 28 69 46 69 72 73  allocated (iFirs
240f0 74 2e 2e 6e 48 50 61 67 65 29 2e 20 53 6f 20 6d  t..nHPage). So m
24100 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ove.        ** p
24110 61 67 65 73 20 28 69 46 69 72 73 74 2e 2e 4d 49  ages (iFirst..MI
24120 4e 28 6e 50 61 67 65 2c 6e 48 50 61 67 65 29 29  N(nPage,nHPage))
24130 20 74 6f 20 28 4d 41 58 28 6e 50 61 67 65 2c 6e   to (MAX(nPage,n
24140 48 50 61 67 65 29 2b 31 29 2e 20 2a 2f 0a 20 20  HPage)+1). */.  
24150 20 20 20 20 20 20 50 67 6e 6f 20 69 4c 61 73 74        Pgno iLast
24160 20 3d 20 4d 49 4e 28 6e 50 61 67 65 2c 20 6e 48   = MIN(nPage, nH
24170 50 61 67 65 29 3b 20 20 20 20 2f 2a 20 4c 61 73  Page);    /* Las
24180 74 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  t page to move *
24190 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e  /.        Pgno n
241a0 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20  Current;        
241b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
241c0 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   Current size of
241d0 20 64 62 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20   db */..        
241e0 6e 43 75 72 72 65 6e 74 20 3d 20 4d 41 58 28 6e  nCurrent = MAX(n
241f0 50 61 67 65 2c 20 6e 48 50 61 67 65 29 3b 0a 20  Page, nHPage);. 
24200 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67         pBt->nPag
24210 65 20 3d 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20  e = nCurrent;.  
24220 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
24230 52 65 6c 6f 63 61 74 65 52 61 6e 67 65 28 70 42  RelocateRange(pB
24240 74 2c 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 2c  t, pMap->iFirst,
24250 20 69 4c 61 73 74 2c 20 26 6e 43 75 72 72 65 6e   iLast, &nCurren
24260 74 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  t);..        /* 
24270 54 68 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f  There are now no
24280 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 69 74 68   collisions with
24290 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 61 74   the snapshot at
242a0 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65   the head of the
242b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
242c0 62 61 73 65 20 66 69 6c 65 2e 20 53 6f 20 61 74  base file. So at
242d0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77   this point it w
242e0 6f 75 6c 64 20 62 65 20 70 6f 73 73 69 62 6c 65  ould be possible
242f0 20 74 6f 20 77 72 69 74 65 0a 20 20 20 20 20 20   to write.      
24300 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
24310 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
24320 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 73  . Before doing s
24330 6f 20 74 68 6f 75 67 68 2c 20 61 74 74 65 6d 70  o though, attemp
24340 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  t to.        ** 
24350 72 65 6c 6f 63 61 74 65 20 73 6f 6d 65 20 6f 66  relocate some of
24360 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 74   the new pages t
24370 6f 20 66 72 65 65 20 6c 6f 63 61 74 69 6f 6e 73  o free locations
24380 20 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79   within the body
24390 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
243a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
243b0 20 28 69 2e 65 2e 20 66 72 65 65 2d 6c 69 73 74   (i.e. free-list
243c0 20 65 6e 74 72 69 65 73 29 2e 20 2a 2f 0a 20 20   entries). */.  
243d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
243e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
243f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 75       assert( nCu
24400 72 72 65 6e 74 21 3d 50 45 4e 44 49 4e 47 5f 42  rrent!=PENDING_B
24410 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
24420 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
24430 65 33 50 61 67 65 72 53 65 74 44 62 73 69 7a 65  e3PagerSetDbsize
24440 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 43  (pBt->pPager, nC
24450 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  urrent);.       
24460 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62     nFree = get4b
24470 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 20 20  yte(&p1[36]);.  
24480 20 20 20 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e          nFin = n
24490 43 75 72 72 65 6e 74 2d 6e 46 72 65 65 3b 0a 20  Current-nFree;. 
244a0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 75           if( nCu
244b0 72 72 65 6e 74 3e 50 45 4e 44 49 4e 47 5f 42 59  rrent>PENDING_BY
244c0 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
244d0 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin<=PENDING_BY
244e0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
244f0 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 69 6e              nFin
24500 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  --;.          }.
24510 20 20 20 20 20 20 20 20 20 20 6e 46 69 6e 20 3d            nFin =
24520 20 4d 41 58 28 6e 46 69 6e 2c 20 6e 48 50 61 67   MAX(nFin, nHPag
24530 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  e);.          rc
24540 20 3d 20 62 74 72 65 65 52 65 6c 6f 63 61 74 65   = btreeRelocate
24550 52 61 6e 67 65 28 70 42 74 2c 20 6e 46 69 6e 2b  Range(pBt, nFin+
24560 31 2c 20 6e 43 75 72 72 65 6e 74 2c 20 30 29 3b  1, nCurrent, 0);
24570 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
24580 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 31      put4byte(&p1
24590 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  [28], nFin);.   
245a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
245b0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 62  qlite3PagerSetDb
245c0 73 69 7a 65 28 70 50 61 67 65 72 2c 20 6e 46 69  size(pPager, nFi
245d0 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  n);.  }..  retur
245e0 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  n rc;.}.#else.# 
245f0 64 65 66 69 6e 65 20 62 74 72 65 65 46 69 78 55  define btreeFixU
24600 6e 6c 6f 63 6b 65 64 28 58 29 20 20 53 51 4c 49  nlocked(X)  SQLI
24610 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 20 2f 2a 20  TE_OK.#endif /* 
24620 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
24630 55 52 52 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  URRENT */../*.**
24640 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
24650 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
24660 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
24670 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
24680 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
24690 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
246a0 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
246b0 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
246c0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
246d0 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
246e0 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
246f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
24700 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
24710 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
24720 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
24730 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
24740 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
24750 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
24760 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
24770 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
24780 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
24790 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
247a0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
247b0 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
247c0 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
247d0 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
247e0 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
247f0 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
24800 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
24810 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
24820 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
24830 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
24840 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
24850 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
24860 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
24870 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
24880 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
24890 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
248a0 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
248b0 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
248c0 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
248d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
248e0 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
248f0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
24900 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
24910 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
24920 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
24930 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
24940 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
24950 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
24960 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
24970 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
24980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24990 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
249a0 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
249b0 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
249c0 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
249d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
249e0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
249f0 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
24a00 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
24a10 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
24a20 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
24a30 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
24a40 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
24a50 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
24a60 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
24a70 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
24a80 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
24a90 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
24aa0 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
24ab0 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
24ac0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
24ad0 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
24ae0 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
24af0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
24b00 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
24b10 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
24b20 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
24b30 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
24b40 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
24b50 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
24b60 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
24b70 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
24b80 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
24b90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
24ba0 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
24bb0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
24bc0 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
24bd0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24be0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
24bf0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
24c00 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
24c10 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
24c20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
24c30 6e 74 65 72 28 70 29 3b 0a 0a 23 69 66 6e 64 65  nter(p);..#ifnde
24c40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
24c50 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
24c60 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
24c70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
24c80 28 20 49 53 43 4f 4e 43 55 52 52 45 4e 54 3d 3d  ( ISCONCURRENT==
24c90 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
24ca0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
24cb0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (pBt);.      if(
24cc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24cd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24ce0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
24cf0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
24d00 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
24d10 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44  .    if( pBt->bD
24d20 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20  oTruncate ){.   
24d30 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
24d40 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
24d50 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e  ->pPager, pBt->n
24d60 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Page);.    }.#en
24d70 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  dif.    if( rc==
24d80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 49 53 43  SQLITE_OK && ISC
24d90 4f 4e 43 55 52 52 45 4e 54 20 29 7b 0a 20 20 20  ONCURRENT ){.   
24da0 20 20 20 72 63 20 3d 20 62 74 72 65 65 46 69 78     rc = btreeFix
24db0 55 6e 6c 6f 63 6b 65 64 28 70 29 3b 0a 20 20 20  Unlocked(p);.   
24dc0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
24dd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24de0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
24df0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
24e00 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
24e10 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
24e20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
24e30 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
24e40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24e50 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24e60 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72  ion is called fr
24e70 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d  om both BtreeCom
24e80 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e  mitPhaseTwo() an
24e90 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  d BtreeRollback(
24ea0 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  ).** at the conc
24eb0 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e  lusion of a tran
24ec0 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
24ed0 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64  ic void btreeEnd
24ee0 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65  Transaction(Btre
24ef0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
24f00 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
24f10 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
24f20 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
24f30 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
24f40 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a  ldsMutex(p) );..
24f50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24f60 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
24f70 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
24f80 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 0;.#endif.  
24f90 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  if( p->inTrans>T
24fa0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d  RANS_NONE && db-
24fb0 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a  >nVdbeRead>1 ){.
24fc0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
24fd0 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65  are other active
24fe0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
24ff0 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20   belong to this 
25000 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
25010 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64  handle, downgrad
25020 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e to a read-only
25030 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
25040 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  e other statemen
25050 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74  ts.    ** may st
25060 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66  ill be reading f
25070 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
25080 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72  .  */.    downgr
25090 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
250a0 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
250b0 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
250c0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
250d0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
250e0 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61  the handle had a
250f0 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73  ny kind of trans
25100 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63  action open, dec
25110 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20  rement the .    
25120 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
25130 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72  ount of the shar
25140 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65  ed btree. If the
25150 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
25160 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68  nt .    ** reach
25170 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68  es 0, set the sh
25180 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
25190 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e  ANS_NONE. The un
251a0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
251b0 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  d().    ** call 
251c0 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63  below will unloc
251d0 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f  k the pager.  */
251e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
251f0 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans!=TRANS_NONE 
25200 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c  ){.      clearAl
25210 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
25220 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20  eLocks(p);.     
25230 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
25240 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  on--;.      if( 
25250 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
25260 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tion ){.        
25270 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
25280 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
25290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
252a0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63      /* Set the c
252b0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
252c0 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  on state to TRAN
252d0 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63  S_NONE and unloc
252e0 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61  k the .    ** pa
252f0 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c  ger if this call
25300 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79   closed the only
25310 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
25320 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a  ransaction.  */.
25330 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
25340 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
25350 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
25360 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  used(pBt);.  }..
25370 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
25380 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74   an CONCURRENT t
25390 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 65 6c 65  ransaction, dele
253a0 74 65 20 74 68 65 20 70 42 74 2d 3e 70 4d 61 70  te the pBt->pMap
253b0 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 41 6c   object..  ** Al
253c0 73 6f 20 63 61 6c 6c 20 50 61 67 65 72 45 6e 64  so call PagerEnd
253d0 43 6f 6e 63 75 72 72 65 6e 74 28 29 20 74 6f 20  Concurrent() to 
253e0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
253f0 70 61 67 65 72 20 68 61 73 20 64 69 73 63 61 72  pager has discar
25400 64 65 64 0a 20 20 2a 2a 20 74 68 65 20 72 65 63  ded.  ** the rec
25410 6f 72 64 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ord of all pages
25420 20 72 65 61 64 20 77 69 74 68 69 6e 20 74 68 65   read within the
25430 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
25440 2f 0a 20 20 62 74 72 65 65 50 74 72 6d 61 70 44  /.  btreePtrmapD
25450 65 6c 65 74 65 28 70 42 74 29 3b 0a 20 20 73 71  elete(pBt);.  sq
25460 6c 69 74 65 33 50 61 67 65 72 45 6e 64 43 6f 6e  lite3PagerEndCon
25470 63 75 72 72 65 6e 74 28 70 42 74 2d 3e 70 50 61  current(pBt->pPa
25480 67 65 72 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  ger);.  btreeInt
25490 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
254a0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
254b0 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
254c0 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
254d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
254e0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
254f0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
25500 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
25510 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
25520 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
25530 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
25540 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
25550 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
25560 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
25570 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
25580 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
25590 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
255a0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
255b0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
255c0 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
255d0 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
255e0 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
255f0 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
25600 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
25610 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
25620 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
25630 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
25640 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
25650 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
25660 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
25670 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
25680 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
25690 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
256a0 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
256b0 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
256c0 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
256d0 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
256e0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
256f0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
25700 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61  urs while the pa
25710 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74  ger layer is att
25720 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66  empting to .** f
25730 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  inalize the unde
25740 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  rlying journal f
25750 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
25760 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
25770 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75  ror and.** the u
25780 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
25790 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61  attempt a rollba
257a0 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ck. However, if 
257b0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
257c0 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  ent.** is non-ze
257d0 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74  ro then this b-t
257e0 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ree transaction 
257f0 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  is part of a mul
25800 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e  ti-file .** tran
25810 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
25820 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73   case, the trans
25830 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
25840 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  dy been committe
25850 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69  d .** (by deleti
25860 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
25870 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
25880 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67  e caller will ig
25890 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  nore this .** fu
258a0 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63  nctions return c
258b0 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66  ode. So, even if
258c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
258d0 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61   in the pager la
258e0 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68  yer,.** reset th
258f0 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73  e b-tree objects
25900 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
25910 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
25920 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72   the write.** tr
25930 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
25940 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  en closed. This 
25950 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61  is quite safe, a
25960 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  s the pager will
25970 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74   have.** transit
25980 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72  ioned to the err
25990 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
259a0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
259b0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
259c0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
259d0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
259e0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
259f0 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
25a00 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
25a10 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
25a20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
25a30 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
25a40 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61  ee *p, int bClea
25a50 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e  nup){..  if( p->
25a60 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
25a70 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
25a80 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
25a90 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
25aa0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
25ab0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
25ac0 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
25ad0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
25ae0 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
25af0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
25b00 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
25b10 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
25b20 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
25b30 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
25b40 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
25b50 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
25b60 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
25b70 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
25b80 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
25b90 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
25ba0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
25bb0 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
25bc0 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
25bd0 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
25be0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
25bf0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
25c00 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
25c10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25c20 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30  K && bCleanup==0
25c30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25c40 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
25c50 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
25c60 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44  .    }.    p->iD
25c70 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f  ataVersion--;  /
25c80 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72  * Compensate for
25c90 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
25ca0 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20  rsion++; */.    
25cb0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
25cc0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
25cd0 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
25ce0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
25cf0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
25d00 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
25d10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
25d20 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
25d30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
25d40 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
25d50 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
25d60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
25d70 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
25d80 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
25d90 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
25da0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
25db0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
25dc0 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
25dd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25de0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
25df0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
25e00 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29  itPhaseTwo(p, 0)
25e10 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
25e20 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
25e30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25e40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25e50 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
25e60 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
25e70 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
25e80 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
25e90 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
25ea0 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65  r on any BtShare
25eb0 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a  d that pBtree.**
25ec0 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72   references.  Or
25ed0 20 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   if the writeOnl
25ee0 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  y flag is set to
25ef0 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a   1, then only.**
25f00 20 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73   trip write curs
25f10 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65  ors and leave re
25f20 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61  ad cursors uncha
25f30 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  nged..**.** Ever
25f40 79 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61  y cursor is a ca
25f50 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72  ndidate to be tr
25f60 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67  ipped, including
25f70 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74   cursors.** that
25f80 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72   belong to other
25f90 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
25fa0 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65  tions that happe
25fb0 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69  n to be.** shari
25fc0 6e 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74  ng the cache wit
25fd0 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  h pBtree..**.** 
25fe0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
25ff0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
26000 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
26010 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
26020 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  y.** flag is tru
26030 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69  e, then only wri
26040 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20  te-cursors need 
26050 62 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61  be tripped - rea
26060 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72  d-only.** cursor
26070 73 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72  s save their cur
26080 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73  rent positions s
26090 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20  o that they may 
260a0 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c  continue .** fol
260b0 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  lowing the rollb
260c0 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74  ack. Or, if writ
260d0 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20  eOnly is false, 
260e0 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
260f0 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20  .** tripped. In 
26100 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e  general, writeOn
26110 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  ly is false if t
26120 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
26130 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  eing.** rolled b
26140 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65  ack modified the
26150 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
26160 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62  . In this case b
26170 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  -tree root.** pa
26180 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64  ges may be moved
26190 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   or deleted from
261a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
261b0 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67  together, making
261c0 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f  .** it unsafe fo
261d0 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74  r read cursors t
261e0 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a  o continue..**.*
261f0 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e  * If the writeOn
26200 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  ly flag is true 
26210 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20  and an error is 
26220 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c  encountered whil
26230 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65  e .** saving the
26240 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
26250 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  n of a read-only
26260 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72   cursor, all cur
26270 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64  sors, .** includ
26280 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72  ing all read-cur
26290 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
262a0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
262b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
262c0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
262d0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
262e0 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69  rs while.** savi
262f0 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69  ng a cursor posi
26300 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20  tion, an SQLite 
26310 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69  error code..*/.i
26320 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  nt sqlite3BtreeT
26330 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
26340 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
26350 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72   errCode, int wr
26360 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75  iteOnly){.  BtCu
26370 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72  rsor *p;.  int r
26380 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
26390 20 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65    assert( (write
263a0 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65  Only==0 || write
263b0 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46  Only==1) && BTCF
263c0 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b  _WriteFlag==1 );
263d0 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
263e0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
263f0 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
26400 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65      for(p=pBtree
26410 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
26420 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
26430 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 4f        if( writeO
26440 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c  nly && (p->curFl
26450 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
26460 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Flag)==0 ){.    
26470 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
26480 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
26490 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  || p->eState==CU
264a0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b  RSOR_SKIPNEXT ){
264b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
264c0 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
264d0 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  on(p);.         
264e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
264f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
26500 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42    (void)sqlite3B
26510 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
26520 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30  rs(pBtree, rc, 0
26530 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
26540 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
26550 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26570 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
26580 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
26590 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
265a0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
265b0 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65         p->skipNe
265c0 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
265d0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 74 72 65      }.      btre
265e0 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
265f0 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 7d  rPages(p);.    }
26600 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
26610 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
26620 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
26630 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
26640 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
26650 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  on in progress..
26660 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64  **.** If tripCod
26670 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
26680 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20  OK then cursors 
26690 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
266a0 74 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a  ted (tripped)..*
266b0 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
266c0 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
266d0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
266e0 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75   true but all cu
266f0 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69  rsors are.** tri
26700 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
26710 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79  y is false.  Any
26720 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a   attempt to use.
26730 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72  ** a tripped cur
26740 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  sor will result 
26750 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
26760 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
26770 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
26780 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
26790 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
267a0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
267b0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
267c0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
267d0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
267e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
267f0 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
26800 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
26810 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
26820 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
26830 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
26840 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
26850 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65  *pPage1;..  asse
26860 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31  rt( writeOnly==1
26870 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30   || writeOnly==0
26880 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72   );.  assert( tr
26890 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41  ipCode==SQLITE_A
268a0 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  BORT_ROLLBACK ||
268b0 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
268c0 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
268d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
268e0 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d    if( tripCode==
268f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26900 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d   rc = tripCode =
26910 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
26920 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
26930 69 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e  if( rc ) writeOn
26940 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ly = 0;.  }else{
26950 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
26960 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  _OK;.  }.  if( t
26970 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  ripCode ){.    i
26980 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
26990 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
269a0 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c  ors(p, tripCode,
269b0 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20   writeOnly);.   
269c0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
269d0 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65  ITE_OK || (write
269e0 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d  Only==0 && rc2==
269f0 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20  SQLITE_OK) );.  
26a00 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
26a10 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
26a20 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65  .  }.  btreeInte
26a30 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
26a40 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
26a50 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
26a60 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
26a70 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
26a80 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
26a90 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
26aa0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
26ab0 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
26ac0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
26ad0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
26ae0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
26af0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
26b00 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
26b10 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
26b20 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
26b30 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
26b40 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
26b50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
26b60 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
26b70 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
26b80 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
26b90 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
26ba0 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
26bb0 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
26bc0 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
26bd0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
26be0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
26bf0 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
26c00 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73  Data);.      tes
26c10 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20  tcase( nPage==0 
26c20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  );.      if( nPa
26c30 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  ge==0 ) sqlite3P
26c40 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
26c50 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
26c60 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
26c70 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
26c80 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70  nPage );.      p
26c90 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
26ca0 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e;.      release
26cb0 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b  PageOne(pPage1);
26cc0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
26cd0 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
26ce0 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20  sors(pBt, 1)==0 
26cf0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
26d00 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
26d10 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
26d20 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
26d30 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
26d40 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
26d50 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
26d60 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
26d70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26d80 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
26d90 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
26da0 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
26db0 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  nsaction can be 
26dc0 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
26dd0 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
26de0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
26df0 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
26e00 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
26e10 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
26e20 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
26e30 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
26e40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
26e50 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
26e60 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
26e70 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
26e80 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
26e90 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
26ea0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
26eb0 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
26ec0 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
26ed0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
26ee0 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
26ef0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
26f00 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
26f10 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
26f20 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
26f30 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
26f40 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
26f50 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
26f60 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
26f70 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
26f80 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
26f90 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
26fa0 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
26fb0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
26fc0 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
26fd0 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
26fe0 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
26ff0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
27000 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
27010 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
27020 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
27030 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
27040 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
27050 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
27060 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
27070 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
27080 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
27090 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
270a0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
270b0 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
270c0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
270d0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
270e0 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
270f0 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
27100 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
27110 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
27120 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
27130 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
27140 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
27150 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
27160 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
27170 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
27180 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
27190 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
271a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
271b0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
271c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
271d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
271e0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
271f0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
27200 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
27210 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
27220 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
27230 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
27240 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
27250 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
27260 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
27270 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
27280 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
27290 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
272a0 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
272b0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
272c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
272d0 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
272e0 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
272f0 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
27300 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
27310 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
27320 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
27330 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
27340 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
27350 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
27360 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
27370 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
27380 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
27390 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
273a0 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
273b0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
273c0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
273d0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
273e0 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
273f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27400 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
27410 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28 70  reePtrmapBegin(p
27420 42 74 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b  Bt, iStatement);
27430 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
27440 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
27450 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
27460 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
27470 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
27480 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
27490 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
274a0 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
274b0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
274c0 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
274d0 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
274e0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
274f0 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
27500 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
27510 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
27520 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
27530 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
27540 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
27550 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
27560 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
27570 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
27580 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
27590 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
275a0 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
275b0 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
275c0 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
275d0 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
275e0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
275f0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
27600 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
27610 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
27620 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
27630 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
27640 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
27650 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
27660 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
27670 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
27680 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
27690 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
276a0 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
276b0 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
276c0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
276d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
276e0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
276f0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
27700 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
27710 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
27720 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
27730 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
27740 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
27750 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
27760 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
27770 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
27780 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
27790 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
277a0 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
277b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
277c0 74 65 72 28 70 29 3b 0a 20 20 20 20 62 74 72 65  ter(p);.    btre
277d0 65 50 74 72 6d 61 70 45 6e 64 28 70 42 74 2c 20  ePtrmapEnd(pBt, 
277e0 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
277f0 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56  .    if( op==SAV
27800 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
27810 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
27820 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
27830 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
27840 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27850 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
27860 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
27870 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
27880 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
27890 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oint);.    }.   
278a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
278b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
278c0 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20  iSavepoint<0 && 
278d0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
278e0 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
278f0 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  MPTY)!=0 ){.    
27900 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
27910 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
27920 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
27930 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  se(pBt);.      p
27940 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34  Bt->nPage = get4
27950 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70  byte(28 + pBt->p
27960 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a  Page1->aData);..
27970 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
27980 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77  abase size was w
27990 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
279a0 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65  offset 28 of the
279b0 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a   header.      **
279c0 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
279d0 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73  ction started, s
279e0 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
279f0 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73  he value at offs
27a00 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69  et.      ** 28 i
27a10 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20  s nonzero. */.  
27a20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
27a30 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  >nPage>0 );.    
27a40 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
27a50 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
27a60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27a70 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
27a80 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
27a90 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
27aa0 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
27ab0 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20  e.** iTable. If 
27ac0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
27ad0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
27ae0 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
27af0 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hat.** the calle
27b00 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74  r already has at
27b10 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e   least a read-on
27b20 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ly transaction o
27b30 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  pen.** on the da
27b40 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20  tabase already. 
27b50 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  If a write-curso
27b60 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
27b70 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  then.** the call
27b80 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
27b90 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
27ba0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
27bb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 54  .**.** If the BT
27bc0 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 6f 66  REE_WRCSR bit of
27bd0 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65 61 72   wrFlag is clear
27be0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
27bf0 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65  r can only.** be
27c00 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
27c10 67 2e 20 20 49 66 20 74 68 65 20 42 54 52 45 45  g.  If the BTREE
27c20 5f 57 52 43 53 52 20 62 69 74 20 69 73 20 73 65  _WRCSR bit is se
27c30 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
27c40 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  or.** can be use
27c50 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
27c60 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69 66 20   for writing if 
27c70 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73  other conditions
27c80 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20   for writing.** 
27c90 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
27ca0 68 65 73 65 20 61 72 65 20 74 68 65 20 63 6f 6e  hese are the con
27cb0 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  ditions that mus
27cc0 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65  t be met in orde
27cd0 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e 67  r.** for writing
27ce0 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a   to be allowed:.
27cf0 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75  **.** 1:  The cu
27d00 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
27d10 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20  een opened with 
27d20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e  wrFlag containin
27d30 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a  g BTREE_WRCSR.**
27d40 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
27d50 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
27d60 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
27d70 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
27d80 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
27d90 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
27da0 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
27db0 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
27dc0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
27dd0 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
27de0 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
27df0 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
27e00 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
27e10 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
27e20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
27e30 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
27e40 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
27e50 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
27e60 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
27e70 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
27e80 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
27e90 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
27ea0 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
27eb0 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
27ec0 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
27ed0 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
27ee0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
27ef0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52  n..**.** The BTR
27f00 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62 69 74  EE_FORDELETE bit
27f10 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79 20 6f   of wrFlag may o
27f20 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74  ptionally be set
27f30 20 69 66 20 42 54 52 45 45 5f 57 52 43 53 52 0a   if BTREE_WRCSR.
27f40 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66 20 46  ** is set.  If F
27f50 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65 74 2c  ORDELETE is set,
27f60 20 74 68 61 74 20 69 73 20 61 20 68 69 6e 74 20   that is a hint 
27f70 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
27f80 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68  ation that.** th
27f90 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f  is cursor will o
27fa0 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f 20 73  nly be used to s
27fb0 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65 74  eek to and delet
27fc0 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61 6e 20  e entries of an 
27fd0 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61 72 74  index.** as part
27fe0 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44 45 4c   of a larger DEL
27ff0 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ETE statement.  
28000 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20 68 69  The FORDELETE hi
28010 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  nt is not used b
28020 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d  y.** this implem
28030 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  entation.  But i
28040 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63 61 6c  n a hypothetical
28050 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74 6f   alternative sto
28060 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20  rage engine .** 
28070 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 65  in which index e
28080 6e 74 72 69 65 73 20 61 72 65 20 61 75 74 6f 6d  ntries are autom
28090 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
280a0 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64   when correspond
280b0 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77  ing table.** row
280c0 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 74  s are deleted, t
280d0 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c 61  he FORDELETE fla
280e0 67 20 69 73 20 61 20 68 69 6e 74 20 74 68 61 74  g is a hint that
280f0 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44 45   all SEEK and DE
28100 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  LETE.** operatio
28110 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f  ns on this curso
28120 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20  r can be no-ops 
28130 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f 70 65  and all READ ope
28140 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20  rations can .** 
28150 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f  return a null ro
28160 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78 30 31  w (2-bytes: 0x01
28170 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   0x00)..**.** No
28180 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
28190 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
281a0 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
281b0 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
281c0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
281d0 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
281e0 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
281f0 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
28200 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
28210 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a   correctly..**.*
28220 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
28230 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
28240 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
28250 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
28260 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20  d.** on pCur to 
28270 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
28280 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f  emory space prio
28290 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
282a0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  is routine..*/.s
282b0 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
282c0 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
282d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
282e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282f0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
28300 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28320 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
28330 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
28340 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
28350 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
28360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28370 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
28380 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
28390 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
283a0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
283b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
283c0 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
283d0 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
283e0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
283f0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
28400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
28410 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
28420 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  r */.){.  BtShar
28430 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
28440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28450 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65   /* Shared b-tre
28460 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
28470 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20  Cursor *pX;     
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 4c 6f 6f 70 69 6e 67 20       /* Looping 
284a0 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63  over other all c
284b0 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73  ursors */..  ass
284c0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
284d0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
284e0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
284f0 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c  ag==0 .       ||
28500 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57   wrFlag==BTREE_W
28510 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  RCSR .       || 
28520 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57  wrFlag==(BTREE_W
28530 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45  RCSR|BTREE_FORDE
28540 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f  LETE) .  );..  /
28550 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
28560 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
28570 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66  s verify that if
28580 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61   this is a shara
28590 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65  ble .  ** b-tree
285a0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
285b0 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
285c0 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65  ding the require
285d0 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a  d table locks, .
285e0 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f    ** and that no
285f0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
28600 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63  n has any open c
28610 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c  ursor that confl
28620 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20  icts with .  ** 
28630 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  this lock.  */. 
28640 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
28650 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
28660 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79  (p, iTable, pKey
28670 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67  Info!=0, (wrFlag
28680 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73 65  ?2:1)) );.  asse
28690 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
286a0 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
286b0 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
286c0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
286d0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
286e0 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
286f0 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
28700 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
28710 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
28720 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
28730 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
28740 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
28750 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
28760 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
28770 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
28780 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
28790 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
287a0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
287b0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
287c0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72  ==0 );..  if( wr
287d0 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f  Flag ){.    allo
287e0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
287f0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  t);.    if( pBt-
28800 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20  >pTmpSpace==0 ) 
28810 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
28820 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
28830 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26  if( iTable==1 &&
28840 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
28850 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pBt)==0 ){.    a
28860 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
28870 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d   );.    iTable =
28880 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f   0;.  }..  /* No
28890 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  w that no other 
288a0 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72  errors can occur
288b0 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67  , finish filling
288c0 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72   in the BtCursor
288d0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  .  ** variables 
288e0 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72  and link the cur
288f0 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53  sor into the BtS
28900 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a  hared list.  */.
28910 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
28920 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b   = (Pgno)iTable;
28930 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
28940 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65   -1;.  pCur->pKe
28950 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
28960 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65  ;.  pCur->pBtree
28970 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42   = p;.  pCur->pB
28980 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d  t = pBt;.  pCur-
28990 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c  >curFlags = wrFl
289a0 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74 65 46  ag ? BTCF_WriteF
289b0 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d  lag : 0;.  pCur-
289c0 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 3d  >curPagerFlags =
289d0 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50 41   wrFlag ? 0 : PA
289e0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
289f0 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ;.  /* If there 
28a00 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
28a10 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
28a20 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
28a30 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63 75  all such.  ** cu
28a40 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61 76  rsors *must* hav
28a50 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  e the BTCF_Multi
28a60 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f  ple flag set. */
28a70 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70  .  for(pX=pBt->p
28a80 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70  Cursor; pX; pX=p
28a90 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  X->pNext){.    i
28aa0 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  f( pX->pgnoRoot=
28ab0 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b  =(Pgno)iTable ){
28ac0 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46 6c  .      pX->curFl
28ad0 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74  ags |= BTCF_Mult
28ae0 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75 72  iple;.      pCur
28af0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
28b00 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20  CF_Multiple;.   
28b10 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70   }.  }.  pCur->p
28b20 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72  Next = pBt->pCur
28b30 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72  sor;.  pBt->pCur
28b40 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
28b50 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
28b60 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
28b70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28b80 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
28b90 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
28ba0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28bd0 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
28be0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c00 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
28c10 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
28c20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
28c30 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
28c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c50 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
28c60 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
28c70 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
28c80 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
28c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ca0 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
28cb0 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a  o xCompare() */.
28cc0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28cf0 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f   Write new curso
28d00 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
28d10 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61  nt rc;.  if( iTa
28d20 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20  ble<1 ){.    rc 
28d30 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
28d40 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BKPT;.  }else{.
28d50 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
28d60 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
28d70 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
28d80 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
28d90 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
28da0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
28db0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
28dc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28dd0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
28de0 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75  e size of a BtCu
28df0 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62  rsor object in b
28e00 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ytes..**.** This
28e10 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
28e20 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73  eeded so that us
28e30 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ers of cursors c
28e40 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a  an preallocate.*
28e50 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f  * sufficient sto
28e60 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63  rage to hold a c
28e70 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75  ursor.  The BtCu
28e80 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  rsor object is o
28e90 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72  paque.** to user
28ea0 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74  s so they cannot
28eb0 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29   do the sizeof()
28ec0 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68   themselves - th
28ed0 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20  ey must call.** 
28ee0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
28ef0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
28f00 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64  eCursorSize(void
28f10 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e  ){.  return ROUN
28f20 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73  D8(sizeof(BtCurs
28f30 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  or));.}../*.** I
28f40 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
28f50 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f   that will be co
28f60 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42  nverted into a B
28f70 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a  tCursor object..
28f80 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65  **.** The simple
28f90 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77   approach here w
28fa0 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65  ould be to memse
28fb0 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f  t() the entire o
28fc0 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f  bject.** to zero
28fd0 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20  .  But it turns 
28fe0 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50  out that the apP
28ff0 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b  age[] and aiIdx[
29000 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e  ] arrays.** do n
29010 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65  ot need to be ze
29020 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72  roed and they ar
29030 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63  e large, so we c
29040 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a  an save a lot.**
29050 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20   of run-time by 
29060 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
29070 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
29080 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a  hose elements..*
29090 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
290a0 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74  reeCursorZero(Bt
290b0 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65  Cursor *p){.  me
290c0 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65  mset(p, 0, offse
290d0 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 42 54  tof(BtCursor, BT
290e0 43 55 52 53 4f 52 5f 46 49 52 53 54 5f 55 4e 49  CURSOR_FIRST_UNI
290f0 4e 49 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  NIT));.}../*.** 
29100 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20  Close a cursor. 
29110 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f   The read lock o
29120 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
29130 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a  ile is released.
29140 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
29150 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65   cursor is close
29160 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
29170 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
29180 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
29190 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  ){.  Btree *pBtr
291a0 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  ee = pCur->pBtre
291b0 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  e;.  if( pBtree 
291c0 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
291d0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
291e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
291f0 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
29200 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
29210 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  ->pCursor!=0 );.
29220 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75      if( pBt->pCu
29230 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20  rsor==pCur ){.  
29240 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
29250 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
29260 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29270 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76   BtCursor *pPrev
29280 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
29290 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
292a0 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e     if( pPrev->pN
292b0 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  ext==pCur ){.   
292c0 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e         pPrev->pN
292d0 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
292e0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  t;.          bre
292f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
29300 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50        pPrev = pP
29310 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  rev->pNext;.    
29320 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53    }while( ALWAYS
29330 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d  (pPrev) );.    }
29340 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73  .    btreeReleas
29350 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
29360 70 43 75 72 29 3b 0a 20 20 20 20 75 6e 6c 6f 63  pCur);.    unloc
29370 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
29380 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
29390 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65  _free(pCur->aOve
293a0 72 66 6c 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69  rflow);.    sqli
293b0 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
293c0 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Key);.    sqlite
293d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
293e0 65 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ee);.    pCur->p
293f0 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
29400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29410 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
29420 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
29430 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
29440 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
29450 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
29460 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
29470 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
29480 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
29490 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  all.** btreePars
294a0 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
294b0 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
294c0 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
294d0 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
294e0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
294f0 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
29500 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
29510 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
29520 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
29530 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
29540 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  )..*/.#ifndef ND
29550 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 69 6e  EBUG.  static in
29560 74 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28  t cellInfoEqual(
29570 43 65 6c 6c 49 6e 66 6f 20 2a 61 2c 20 43 65 6c  CellInfo *a, Cel
29580 6c 49 6e 66 6f 20 2a 62 29 7b 0a 20 20 20 20 69  lInfo *b){.    i
29590 66 28 20 61 2d 3e 6e 4b 65 79 21 3d 62 2d 3e 6e  f( a->nKey!=b->n
295a0 4b 65 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Key ) return 0;.
295b0 20 20 20 20 69 66 28 20 61 2d 3e 70 50 61 79 6c      if( a->pPayl
295c0 6f 61 64 21 3d 62 2d 3e 70 50 61 79 6c 6f 61 64  oad!=b->pPayload
295d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
295e0 20 69 66 28 20 61 2d 3e 6e 50 61 79 6c 6f 61 64   if( a->nPayload
295f0 21 3d 62 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 20  !=b->nPayload ) 
29600 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
29610 28 20 61 2d 3e 6e 4c 6f 63 61 6c 21 3d 62 2d 3e  ( a->nLocal!=b->
29620 6e 4c 6f 63 61 6c 20 29 20 72 65 74 75 72 6e 20  nLocal ) return 
29630 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 53  0;.    if( a->nS
29640 69 7a 65 21 3d 62 2d 3e 6e 53 69 7a 65 20 29 20  ize!=b->nSize ) 
29650 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65  return 0;.    re
29660 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 74  turn 1;.  }.  st
29670 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
29680 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
29690 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
296a0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
296b0 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30   memset(&info, 0
296c0 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b  , sizeof(info));
296d0 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
296e0 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c  ell(pCur->pPage,
296f0 20 70 43 75 72 2d 3e 69 78 2c 20 26 69 6e 66 6f   pCur->ix, &info
29700 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43  );.    assert( C
29710 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 63 65 6c  ORRUPT_DB || cel
29720 6c 49 6e 66 6f 45 71 75 61 6c 28 26 69 6e 66 6f  lInfoEqual(&info
29730 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 20 29  , &pCur->info) )
29740 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
29750 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
29760 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73  Info(x).#endif.s
29770 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
29780 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65  NLINE void getCe
29790 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
297a0 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43  *pCur){.  if( pC
297b0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
297c0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 63  0 ){.    pCur->c
297d0 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
297e0 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62  ValidNKey;.    b
297f0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
29800 75 72 2d 3e 70 50 61 67 65 2c 70 43 75 72 2d 3e  ur->pPage,pCur->
29810 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  ix,&pCur->info);
29820 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
29830 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
29840 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  r);.  }.}..#ifnd
29850 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68  ef NDEBUG  /* Th
29860 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75  e next routine u
29870 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
29880 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
29890 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74  nts */./*.** Ret
298a0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
298b0 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69  given BtCursor i
298c0 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69  s valid.  A vali
298d0 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a  d cursor is one.
298e0 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65  ** that is curre
298f0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
29900 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e   a row in a (non
29910 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a  -empty) table..*
29920 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69  * This is a veri
29930 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  fication routine
29940 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69   is used only wi
29950 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
29960 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  atements..*/.int
29970 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
29980 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72  sorIsValid(BtCur
29990 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
299a0 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75  turn pCur && pCu
299b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
299c0 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69  R_VALID;.}.#endi
299d0 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 69  f /* NDEBUG */.i
299e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
299f0 75 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e 28 42  ursorIsValidNN(B
29a00 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
29a10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
29a20 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  0 );.  return pC
29a30 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
29a40 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  OR_VALID;.}../*.
29a50 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
29a60 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
29a70 65 72 20 6b 65 79 20 6f 72 20 22 72 6f 77 69 64  er key or "rowid
29a80 22 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62 74  " for a table bt
29a90 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ree..** This rou
29aa0 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c  tine is only val
29ab0 69 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20  id for a cursor 
29ac0 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67  that is pointing
29ad0 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e   into a.** ordin
29ae0 61 72 79 20 74 61 62 6c 65 20 62 74 72 65 65 2e  ary table btree.
29af0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
29b00 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64  points to an ind
29b10 65 78 20 62 74 72 65 65 20 6f 72 0a 2a 2a 20 69  ex btree or.** i
29b20 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 20 72  s invalid, the r
29b30 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 72 6f  esult of this ro
29b40 75 74 69 6e 65 20 69 73 20 75 6e 64 65 66 69 6e  utine is undefin
29b50 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  ed..*/.i64 sqlit
29b60 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
29b70 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
29b80 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
29b90 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
29ba0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29bb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29bc0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
29bd0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
29be0 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 67 65  urIntKey );.  ge
29bf0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
29c00 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
29c10 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23 69  info.nKey;.}..#i
29c20 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
29c30 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55  LE_OFFSET_SQL_FU
29c40 4e 43 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  NC./*.** Return 
29c50 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
29c60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29c70 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  e for the start 
29c80 6f 66 20 74 68 65 0a 2a 2a 20 70 61 79 6c 6f 61  of the.** payloa
29c90 64 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  d to which the c
29ca0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
29cb0 67 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  g..*/.i64 sqlite
29cc0 33 42 74 72 65 65 4f 66 66 73 65 74 28 42 74 43  3BtreeOffset(BtC
29cd0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
29ce0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
29cf0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
29d00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29d10 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29d20 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43  _VALID );.  getC
29d30 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
29d40 20 72 65 74 75 72 6e 20 28 69 36 34 29 70 43 75   return (i64)pCu
29d50 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  r->pBt->pageSize
29d60 2a 28 28 69 36 34 29 70 43 75 72 2d 3e 70 50 61  *((i64)pCur->pPa
29d70 67 65 2d 3e 70 67 6e 6f 20 2d 20 31 29 20 2b 0a  ge->pgno - 1) +.
29d80 20 20 20 20 20 20 20 20 20 28 69 36 34 29 28 70           (i64)(p
29d90 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
29da0 61 64 20 2d 20 70 43 75 72 2d 3e 70 50 61 67 65  ad - pCur->pPage
29db0 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a 23 65 6e 64  ->aData);.}.#end
29dc0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
29dd0 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46  BLE_OFFSET_SQL_F
29de0 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  UNC */../*.** Re
29df0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
29e00 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c  of bytes of payl
29e10 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e 74 72  oad for the entr
29e20 79 20 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a  y that pCur is.*
29e30 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  * currently poin
29e40 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74 61  ting to.  For ta
29e50 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68 69 73  ble btrees, this
29e60 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f   will be the amo
29e70 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  unt.** of data. 
29e80 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72 65 65   For index btree
29e90 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  s, this will be 
29ea0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
29eb0 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  key..**.** The c
29ec0 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61  aller must guara
29ed0 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75  ntee that the cu
29ee0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
29ef0 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a   to a non-NULL.*
29f00 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20  * valid entry.  
29f10 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
29f20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
29f30 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61  edure must guara
29f40 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  ntee.** that the
29f50 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73   cursor has Curs
29f60 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  or.eState==CURSO
29f70 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20  R_VALID..*/.u32 
29f80 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
29f90 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73 6f 72  oadSize(BtCursor
29fa0 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
29fb0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
29fc0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
29fd0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29fe0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
29ff0 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  D );.  getCellIn
2a000 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  fo(pCur);.  retu
2a010 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  rn pCur->info.nP
2a020 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ayload;.}../*.**
2a030 20 52 65 74 75 72 6e 20 61 6e 20 75 70 70 65 72   Return an upper
2a040 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 69   bound on the si
2a050 7a 65 20 6f 66 20 61 6e 79 20 72 65 63 6f 72 64  ze of any record
2a060 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 0a 2a   for the table.*
2a070 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  * that the curso
2a080 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  r is pointing in
2a090 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  to..**.** This i
2a0a0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
2a0b0 6e 2e 20 20 45 76 65 72 79 74 68 69 6e 67 20 77  n.  Everything w
2a0c0 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69  ill still work i
2a0d0 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  f this.** routin
2a0e0 65 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  e always returns
2a0f0 20 32 31 34 37 34 38 33 36 34 37 20 28 77 68 69   2147483647 (whi
2a100 63 68 20 69 73 20 74 68 65 20 6c 61 72 67 65 73  ch is the larges
2a110 74 20 72 65 63 6f 72 64 0a 2a 2a 20 74 68 61 74  t record.** that
2a120 20 53 51 4c 69 74 65 20 63 61 6e 20 68 61 6e 64   SQLite can hand
2a130 6c 65 29 20 6f 72 20 6d 6f 72 65 2e 20 20 42 75  le) or more.  Bu
2a140 74 20 72 65 74 75 72 6e 69 6e 67 20 61 20 73 6d  t returning a sm
2a150 61 6c 6c 65 72 20 76 61 6c 75 65 20 6d 69 67 68  aller value migh
2a160 74 0a 2a 2a 20 70 72 65 76 65 6e 74 20 6c 61 72  t.** prevent lar
2a170 67 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ge memory alloca
2a180 74 69 6f 6e 73 20 77 68 65 6e 20 74 72 79 69 6e  tions when tryin
2a190 67 20 74 6f 20 69 6e 74 65 72 70 72 65 74 20 61  g to interpret a
2a1a0 0a 2a 2a 20 63 6f 72 72 75 70 74 20 64 61 74 72  .** corrupt datr
2a1b0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
2a1c0 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
2a1d0 6e 74 61 74 69 6f 6e 20 6d 65 72 65 6c 79 20 72  ntation merely r
2a1e0 65 74 75 72 6e 73 20 74 68 65 20 73 69 7a 65 20  eturns the size 
2a1f0 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
2a200 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  g.** database fi
2a210 6c 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  le..*/.sqlite3_i
2a220 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  nt64 sqlite3Btre
2a230 65 4d 61 78 52 65 63 6f 72 64 53 69 7a 65 28 42  eMaxRecordSize(B
2a240 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2a250 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2a260 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2a270 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a280 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2a290 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 65  OR_VALID );.  re
2a2a0 74 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 2d 3e  turn pCur->pBt->
2a2b0 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69  pageSize * (sqli
2a2c0 74 65 33 5f 69 6e 74 36 34 29 70 43 75 72 2d 3e  te3_int64)pCur->
2a2d0 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 0a 2f  pBt->nPage;.}../
2a2e0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70  *.** Given the p
2a2f0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  age number of an
2a300 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
2a310 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
2a320 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66  parameter.** ovf
2a330 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  l), this functio
2a340 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65  n finds the page
2a350 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
2a360 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
2a370 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  .** linked list 
2a380 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
2a390 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  s. If possible, 
2a3a0 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f  it uses the auto
2a3b0 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74  -vacuum.** point
2a3c0 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74  er-map data inst
2a3d0 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74  ead of reading t
2a3e0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
2a3f0 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f  ge ovfl to do so
2a400 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
2a410 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53  rror occurs an S
2a420 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
2a430 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
2a440 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54  herwise:.**.** T
2a450 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
2a460 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
2a470 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
2a480 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a  linked list is .
2a490 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
2a4a0 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
2a4b0 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61  e ovfl is the la
2a4c0 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c  st page in its l
2a4d0 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20  inked .** list, 
2a4e0 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
2a4f0 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
2a500 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
2a510 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72  ot NULL, and a r
2a520 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
2a530 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63  MemPage object c
2a540 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
2a550 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
2a560 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65  Ovfl was obtaine
2a570 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  d, then *ppPage 
2a580 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
2a590 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  to that.** refer
2a5a0 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20  ence. It is the 
2a5b0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
2a5c0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
2a5d0 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
2a5e0 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65  ().** on *ppPage
2a5f0 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66   to free the ref
2a600 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65  erence. In no re
2a610 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61  ference was obta
2a620 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a  ined (because.**
2a630 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2a640 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74   was used to obt
2a650 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f  ain the value fo
2a660 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74  r *pPgnoNext), t
2a670 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69  hen.** *ppPage i
2a680 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a  s set to zero..*
2a690 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
2a6a0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
2a6b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
2a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a6d0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
2a6e0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  e */.  Pgno ovfl
2a6f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a700 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
2a710 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
2a720 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ber */.  MemPage
2a730 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
2a740 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65        /* OUT: Me
2a750 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61  mPage handle (ma
2a760 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20  y be NULL) */.  
2a770 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
2a780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a790 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
2a7a0 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
2a7b0 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
2a7c0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
2a7d0 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
2a7e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a7f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2a800 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2a810 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2a820 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78   assert(pPgnoNex
2a830 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
2a840 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2a850 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  UUM.  /* Try to 
2a860 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61  find the next pa
2a870 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
2a880 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ow list using th
2a890 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75  e.  ** autovacuu
2a8a0 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  m pointer-map pa
2a8b0 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20  ges. Guess that 
2a8c0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
2a8d0 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66   .  ** the overf
2a8e0 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65  low list is page
2a8f0 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29   number (ovfl+1)
2a900 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20  . If that guess 
2a910 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20  turns .  ** out 
2a920 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c  to be wrong, fal
2a930 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e  l back to loadin
2a940 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61  g the data of pa
2a950 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ge .  ** number 
2a960 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e  ovfl to determin
2a970 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  e the next page 
2a980 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  number..  */.  i
2a990 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2a9a0 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
2a9b0 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47  gno;.    Pgno iG
2a9c0 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20  uess = ovfl+1;. 
2a9d0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20     u8 eType;..  
2a9e0 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
2a9f0 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65  ISPAGE(pBt, iGue
2aa00 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50  ss) || iGuess==P
2aa10 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2aa20 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69  (pBt) ){.      i
2aa30 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Guess++;.    }..
2aa40 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d      if( iGuess<=
2aa50 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
2aa60 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
2aa70 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
2aa80 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
2aa90 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
2aaa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2aab0 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   && eType==PTRMA
2aac0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
2aad0 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
2aae0 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
2aaf0 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ss;.        rc =
2ab00 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
2ab10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2ab20 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
2ab30 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d  ( next==0 || rc=
2ab40 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
2ab50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ab60 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
2ab70 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2ab80 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
2ab90 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41  (ppPage==0) ? PA
2aba0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
2abb0 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72   : 0);.    asser
2abc0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2abd0 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a   || pPage==0 );.
2abe0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2abf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
2ac00 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70  ext = get4byte(p
2ac10 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
2ac20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e    }.  }..  *pPgn
2ac30 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20  oNext = next;.  
2ac40 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20  if( ppPage ){.  
2ac50 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
2ac60 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
2ac70 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2ac80 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
2ac90 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
2aca0 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  E ? SQLITE_OK : 
2acb0 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc);.}../*.** Co
2acc0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  py data from a b
2acd0 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c  uffer to a page,
2ace0 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20   or from a page 
2acf0 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  to a buffer..**.
2ad00 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61  ** pPayload is a
2ad10 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
2ad20 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62   stored on datab
2ad30 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
2ad40 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  ..** If argument
2ad50 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74   eOp is false, t
2ad60 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20  hen nByte bytes 
2ad70 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
2ad80 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c  ed.** from pPayl
2ad90 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  oad to the buffe
2ada0 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20  r pointed at by 
2adb0 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20  pBuf. If eOp is 
2adc0 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71  true,.** then sq
2add0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2ade0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ) is called on p
2adf0 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65  DbPage and nByte
2ae00 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
2ae10 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  a are copied fro
2ae20 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
2ae30 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a  f to pPayload..*
2ae40 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
2ae50 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
2ae60 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65  ccess, otherwise
2ae70 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
2ae80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
2ae90 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69  pyPayload(.  voi
2aea0 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20  d *pPayload,    
2aeb0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2aec0 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a  r to page data *
2aed0 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
2aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2aef0 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
2af00 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  er */.  int nByt
2af10 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2af20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2af30 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  ytes to copy */.
2af40 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20    int eOp,      
2af50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
2af60 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61   -> copy from pa
2af70 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f  ge, 1 -> copy to
2af80 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67   page */.  DbPag
2af90 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20  e *pDbPage      
2afa0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
2afb0 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64  taining pPayload
2afc0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70   */.){.  if( eOp
2afd0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   ){.    /* Copy 
2afe0 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72  data from buffer
2aff0 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74   to page (a writ
2b000 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  e operation) */.
2b010 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
2b020 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2b030 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2b040 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b050 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2b060 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  c;.    }.    mem
2b070 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42  cpy(pPayload, pB
2b080 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  uf, nByte);.  }e
2b090 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  lse{.    /* Copy
2b0a0 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20   data from page 
2b0b0 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61  to buffer (a rea
2b0c0 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  d operation) */.
2b0d0 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
2b0e0 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65   pPayload, nByte
2b0f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b100 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2b110 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2b120 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
2b130 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70  d or overwrite p
2b140 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
2b150 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  on.** for the en
2b160 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75  try that the pCu
2b170 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
2b180 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70  ting to. The eOp
2b190 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20  .** argument is 
2b1a0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  interpreted as f
2b1b0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
2b1c0 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  0: The operation
2b1d0 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75   is a read. Popu
2b1e0 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
2b1f0 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a  w cache..**   1:
2b200 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
2b210 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c  s a write. Popul
2b220 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
2b230 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20   cache..**.** A 
2b240 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
2b250 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72  ytes are read or
2b260 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69   written beginni
2b270 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ng at "offset"..
2b280 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20  ** Data is read 
2b290 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62  to or from the b
2b2a0 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
2b2b0 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65  * The content be
2b2c0 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74  ing read or writ
2b2d0 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72  ten might appear
2b2e0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67   on the main pag
2b2f0 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74  e.** or be scatt
2b300 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
2b310 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  iple overflow pa
2b320 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ges..**.** If th
2b330 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
2b340 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20   entry uses one 
2b350 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
2b360 20 70 61 67 65 73 0a 2a 2a 20 74 68 69 73 20 66   pages.** this f
2b370 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f  unction may allo
2b380 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61  cate space for a
2b390 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  nd lazily popula
2b3a0 74 65 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  te.** the overfl
2b3b0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
2b3c0 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73  he array (BtCurs
2b3d0 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a  or.aOverflow). .
2b3e0 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
2b3f0 6c 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63  lls use this cac
2b400 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
2b410 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
2b420 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f  ed offset .** mo
2b430 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
2b440 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
2b450 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
2b460 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
2b470 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 75 73 74  located, it must
2b480 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
2b490 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
2b4a0 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
2b4b0 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
2b4c0 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
2b4d0 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
2b4e0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
2b4f0 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
2b500 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
2b510 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
2b520 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
2b530 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
2b540 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
2b550 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
2b560 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
2b570 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
2b580 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
2b590 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
2b5a0 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
2b5b0 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
2b5c0 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
2b5d0 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
2b5e0 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
2b5f0 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
2b600 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
2b610 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
2b620 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
2b630 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
2b640 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  om */.  u32 offs
2b650 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
2b660 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
2b670 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
2b680 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  oad */.  u32 amt
2b690 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2b6a0 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
2b6b0 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
2b6c0 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
2b6d0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
2b6e0 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
2b6f0 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f  fer */ .  int eO
2b700 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
2b710 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20  * zero to read. 
2b720 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74  non-zero to writ
2b730 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  e. */.){.  unsig
2b740 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
2b750 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ad;.  int rc = S
2b760 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2b770 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  iIdx = 0;.  MemP
2b780 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2b790 72 2d 3e 70 50 61 67 65 3b 20 20 20 20 20 20 20  r->pPage;       
2b7a0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
2b7b0 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74   page of current
2b7c0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68   entry */.  BtSh
2b7d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
2b7e0 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
2b7f0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
2b800 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c   this cursor bel
2b810 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65  ongs to */.#ifde
2b820 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
2b830 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
2b840 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20  unsigned char * 
2b850 63 6f 6e 73 74 20 70 42 75 66 53 74 61 72 74 20  const pBufStart 
2b860 3d 20 70 42 75 66 3b 20 20 20 20 20 2f 2a 20 53  = pBuf;     /* S
2b870 74 61 72 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c  tart of original
2b880 20 6f 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 23   out buffer */.#
2b890 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
2b8a0 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
2b8b0 72 74 28 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f  rt( eOp==0 || eO
2b8c0 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  p==1 );.  assert
2b8d0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2b8e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2b8f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b900 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ix<pPage->nCell 
2b910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
2b920 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2b930 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c  ur) );..  getCel
2b940 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
2b950 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
2b960 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20  info.pPayload;. 
2b970 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b   assert( offset+
2b980 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66  amt <= pCur->inf
2b990 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20  o.nPayload );.. 
2b9a0 20 61 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61   assert( aPayloa
2b9b0 64 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  d > pPage->aData
2b9c0 20 29 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29   );.  if( (uptr)
2b9d0 28 61 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67  (aPayload - pPag
2b9e0 65 2d 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74  e->aData) > (pBt
2b9f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70  ->usableSize - p
2ba00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
2ba10 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69  ) ){.    /* Tryi
2ba20 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
2ba30 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
2ba40 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
2ba50 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20  an error.  The. 
2ba60 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61     ** conditiona
2ba70 6c 20 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c  l above is reall
2ba80 79 3a 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50  y:.    **    &aP
2ba90 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
2baa0 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
2bab0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
2bac0 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a  sableSize].    *
2bad0 2a 20 62 75 74 20 69 73 20 72 65 63 61 73 74 20  * but is recast 
2bae0 69 6e 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74  into its current
2baf0 20 66 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69   form to avoid i
2bb00 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20  nteger overflow 
2bb10 70 72 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a  problems.    */.
2bb20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2bb30 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
2bb40 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
2bb50 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
2bb60 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
2bb70 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
2bb80 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
2bb90 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
2bba0 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
2bbb0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
2bbc0 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
2bbd0 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
2bbe0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
2bbf0 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
2bc00 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
2bc10 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
2bc20 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
2bc30 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
2bc40 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
2bc50 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
2bc60 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
2bc70 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
2bc80 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
2bc90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
2bca0 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
2bcb0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20  .nLocal;.  }... 
2bcc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bcd0 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
2bce0 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66     const u32 ovf
2bcf0 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  lSize = pBt->usa
2bd00 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a  bleSize - 4;  /*
2bd10 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70   Bytes content p
2bd20 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a  er ovfl page */.
2bd30 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67      Pgno nextPag
2bd40 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65  e;..    nextPage
2bd50 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61   = get4byte(&aPa
2bd60 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
2bd70 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20  .nLocal]);..    
2bd80 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  /* If the BtCurs
2bd90 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68  or.aOverflow[] h
2bda0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
2bdb0 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20  cated, allocate 
2bdc0 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20  it now..    **. 
2bdd0 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66     ** The aOverf
2bde0 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73  low[] array is s
2bdf0 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72  ized at one entr
2be00 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
2be10 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  low page.    ** 
2be20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
2be30 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20  chain. The page 
2be40 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
2be50 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
2be60 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72  e is.    ** stor
2be70 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b  ed in aOverflow[
2be80 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65  0], etc. A value
2be90 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
2bea0 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20  erflow[] array. 
2beb0 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74     ** means "not
2bec0 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65   yet known" (the
2bed0 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
2bee0 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
2bef0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75   */.    if( (pCu
2bf00 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2bf10 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
2bf20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
2bf30 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66  vfl = (pCur->inf
2bf40 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d  o.nPayload-pCur-
2bf50 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66  >info.nLocal+ovf
2bf60 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a  lSize-1)/ovflSiz
2bf70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  e;.      if( pCu
2bf80 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 3d 3d 30 0a  r->aOverflow==0.
2bf90 20 20 20 20 20 20 20 7c 7c 20 6e 4f 76 66 6c 2a         || nOvfl*
2bfa0 28 69 6e 74 29 73 69 7a 65 6f 66 28 50 67 6e 6f  (int)sizeof(Pgno
2bfb0 29 20 3e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ) > sqlite3Mallo
2bfc0 63 53 69 7a 65 28 70 43 75 72 2d 3e 61 4f 76 65  cSize(pCur->aOve
2bfd0 72 66 6c 6f 77 29 0a 20 20 20 20 20 20 29 7b 0a  rflow).      ){.
2bfe0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e          Pgno *aN
2bff0 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69  ew = (Pgno*)sqli
2c000 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20  te3Realloc(.    
2c010 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
2c020 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32  verflow, nOvfl*2
2c030 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20  *sizeof(Pgno).  
2c040 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2c050 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
2c060 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2c070 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2c080 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  PT;.        }els
2c090 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  e{.          pCu
2c0a0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61  r->aOverflow = a
2c0b0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  New;.        }. 
2c0c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
2c0d0 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  set(pCur->aOverf
2c0e0 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69  low, 0, nOvfl*si
2c0f0 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20  zeof(Pgno));.   
2c100 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2c110 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f  s |= BTCF_ValidO
2c120 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  vfl;.    }else{.
2c130 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2c140 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
2c150 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
2c160 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
2c170 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74  the.      ** ent
2c180 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
2c190 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
2c1a0 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
2c1b0 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20  , skip.      ** 
2c1c0 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
2c1d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2c1e0 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
2c1f0 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
2c200 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ze] ){.        i
2c210 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
2c220 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  flSize);.       
2c230 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
2c240 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
2c250 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  ];.        offse
2c260 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
2c270 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
2c280 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
2c290 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c2a0 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20  && amt>0 );.    
2c2b0 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67 65 20  while( nextPage 
2c2c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ){.      /* If r
2c2d0 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
2c2e0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
2c2f0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
2c300 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2c310 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
2c320 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20  [iIdx]==0.      
2c330 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d          || pCur-
2c340 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
2c350 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20  ==nextPage.     
2c360 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52           || CORR
2c370 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20  UPT_DB );.      
2c380 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
2c390 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
2c3a0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  ;..      if( off
2c3b0 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
2c3c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2c3d0 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
2c3e0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
2c3f0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
2c400 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
2c410 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
2c420 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
2c430 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
2c440 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
2c450 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
2c460 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
2c470 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
2c480 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
2c490 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
2c4a0 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
2c4b0 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
2c4c0 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
2c4d0 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
2c4e0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
2c4f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2c500 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
2c510 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2c520 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20  alidOvfl );.    
2c530 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2c540 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42  ->pBtree->db==pB
2c550 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20  t->db );.       
2c560 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
2c570 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
2c580 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
2c590 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
2c5a0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
2c5b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c5c0 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
2c5d0 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
2c5e0 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
2c5f0 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
2c600 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73    }.        offs
2c610 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
2c620 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c630 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
2c640 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
2c650 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
2c660 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
2c670 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
2c680 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
2c690 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
2c6a0 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
2c6b0 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
2c6c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
2c6d0 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
2c6e0 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
2c6f0 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
2c700 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
2c710 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
2c720 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64  .        }..#ifd
2c730 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
2c740 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
2c750 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
2c760 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
2c770 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20  re true:.       
2c780 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2c790 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65   1) this is a re
2c7a0 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e  ad operation, an
2c7b0 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  d .        **   
2c7c0 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69  2) data is requi
2c7d0 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  red from the sta
2c7e0 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66  rt of this overf
2c7f0 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20  low page, and.  
2c800 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68        **   3) th
2c810 65 72 65 20 61 72 65 20 6e 6f 20 64 69 72 74 79  ere are no dirty
2c820 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
2c830 67 65 2d 63 61 63 68 65 0a 20 20 20 20 20 20 20  ge-cache.       
2c840 20 2a 2a 20 20 20 34 29 20 74 68 65 20 64 61 74   **   4) the dat
2c850 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61  abase is file-ba
2c860 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20  cked, and.      
2c870 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 70 61    **   5) the pa
2c880 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
2c890 20 57 41 4c 20 66 69 6c 65 0a 20 20 20 20 20 20   WAL file.      
2c8a0 20 20 2a 2a 20 20 20 36 29 20 61 74 20 6c 65 61    **   6) at lea
2c8b0 73 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20  st 4 bytes have 
2c8c0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61  already been rea
2c8d0 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  d into the outpu
2c8e0 74 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20  t buffer .      
2c8f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2c900 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65  then data can be
2c910 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66   read directly f
2c920 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2c930 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20   file into the. 
2c940 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
2c950 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69   buffer, bypassi
2c960 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  ng the page-cach
2c970 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68  e altogether. Th
2c980 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20  is speeds.      
2c990 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20    ** up loading 
2c9a0 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68  large records th
2c9b0 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65  at span many ove
2c9c0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20  rflow pages..   
2c9d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2c9e0 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20  if( eOp==0      
2c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca10 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
2ca20 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66  .         && off
2ca30 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20  set==0          
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca60 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20  /* (2) */.      
2ca70 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
2ca80 65 72 44 69 72 65 63 74 52 65 61 64 4f 6b 28 70  erDirectReadOk(p
2ca90 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
2caa0 50 61 67 65 29 20 20 20 20 2f 2a 20 28 33 2c 34  Page)    /* (3,4
2cab0 2c 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ,5) */.         
2cac0 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42  && &pBuf[-4]>=pB
2cad0 75 66 53 74 61 72 74 20 20 20 20 20 20 20 20 20  ufStart         
2cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2caf0 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a        /* (6) */.
2cb00 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2cb10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
2cb20 65 20 2a 66 64 20 3d 20 73 71 6c 69 74 65 33 50  e *fd = sqlite3P
2cb30 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50  agerFile(pBt->pP
2cb40 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
2cb50 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20   u8 aSave[4];.  
2cb60 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69          u8 *aWri
2cb70 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a  te = &pBuf[-4];.
2cb80 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2cb90 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74  ( aWrite>=pBufSt
2cba0 61 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20  art );          
2cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cbc0 2a 20 64 75 65 20 74 6f 20 28 36 29 20 2a 2f 0a  * due to (6) */.
2cbd0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2cbe0 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20  (aSave, aWrite, 
2cbf0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  4);.          rc
2cc00 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
2cc10 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34  (fd, aWrite, a+4
2cc20 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65  , (i64)pBt->page
2cc30 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31  Size*(nextPage-1
2cc40 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65  ));.          ne
2cc50 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
2cc60 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20  e(aWrite);.     
2cc70 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69       memcpy(aWri
2cc80 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20  te, aSave, 4);. 
2cc90 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
2cca0 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20  dif..        {. 
2ccb0 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20           DbPage 
2ccc0 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20  *pDbPage;.      
2ccd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cce0 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
2ccf0 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
2cd00 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20  &pDbPage,.      
2cd10 20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30 20          (eOp==0 
2cd20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
2cd30 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20  ONLY : 0).      
2cd40 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
2cd50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2cd60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2cd70 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
2cd80 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
2cd90 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
2cda0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
2cdb0 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
2cdc0 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
2cdd0 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
2cde0 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
2cdf0 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
2ce00 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a   eOp, pDbPage);.
2ce10 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2ce20 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
2ce30 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2ce40 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
2ce50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ce60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d      }.        am
2ce70 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
2ce80 69 66 28 20 61 6d 74 3d 3d 30 20 29 20 72 65 74  if( amt==0 ) ret
2ce90 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2cea0 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
2ceb0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
2cec0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
2ced0 49 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Idx++;.    }.  }
2cee0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
2cef0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
2cf00 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  {.    /* Overflo
2cf10 77 20 63 68 61 69 6e 20 65 6e 64 73 20 70 72 65  w chain ends pre
2cf20 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20 20 20  maturely */.    
2cf30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2cf40 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
2cf50 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2cf60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
2cf70 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61  d part of the pa
2cf80 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 6f  yload for the ro
2cf90 77 20 61 74 20 77 68 69 63 68 20 74 68 61 74 20  w at which that 
2cfa0 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 63  cursor pCur is c
2cfb0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
2cfc0 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79 74  ting.  "amt" byt
2cfd0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
2cfe0 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66  ferred into pBuf
2cff0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
2d000 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
2d010 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70  offset"..**.** p
2d020 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e 74  Cur can be point
2d030 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61 20  ing to either a 
2d040 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65  table or an inde
2d050 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20  x b-tree..** If 
2d060 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61  pointing to a ta
2d070 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ble btree, then 
2d080 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63 74  the content sect
2d090 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49 66  ion is read.  If
2d0a0 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e  .** pCur is poin
2d0b0 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
2d0c0 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68 65   b-tree then the
2d0d0 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73 20   key section is 
2d0e0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  read..**.** For 
2d0f0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
2d100 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c 65  oad(), the calle
2d110 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
2d120 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  at pCur is point
2d130 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
2d140 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62  d row in the tab
2d150 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65 33  le.  For sqlite3
2d160 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63  BtreePayloadChec
2d170 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75  ked(), the.** cu
2d180 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69 6e  rsor might be in
2d190 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20 6e  valid or might n
2d1a0 65 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eed to be restor
2d1b0 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
2d1c0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  read..**.** Retu
2d1d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
2d1e0 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
2d1f0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
2d200 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
2d210 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
2d220 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
2d230 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
2d240 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
2d250 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
2d260 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2d270 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74  3BtreePayload(Bt
2d280 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
2d290 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
2d2a0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
2d2b0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2d2c0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2d2d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2d2e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2d2f0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2d300 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2d310 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50  e>=0 && pCur->pP
2d320 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
2d330 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e   pCur->ix<pCur->
2d340 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2d350 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
2d360 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
2d370 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
2d380 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
2d390 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
2d3a0 73 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71 6c  s variant of sql
2d3b0 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
2d3c0 28 29 20 77 6f 72 6b 73 20 65 76 65 6e 20 69 66  () works even if
2d3d0 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
2d3e0 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 43 55  not.** in the CU
2d3f0 52 53 4f 52 5f 56 41 4c 49 44 20 73 74 61 74 65  RSOR_VALID state
2d400 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73  .  It is only us
2d410 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ed by the sqlite
2d420 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a  3_blob_read().**
2d430 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23   interface..*/.#
2d440 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d450 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74 61 74  IT_INCRBLOB.stat
2d460 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
2d470 4e 45 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  NE int accessPay
2d480 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a 20 20 42  loadChecked(.  B
2d490 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20  tCursor *pCur,. 
2d4a0 20 75 33 32 20 6f 66 66 73 65 74 2c 0a 20 20 75   u32 offset,.  u
2d4b0 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64 20 2a  32 amt,.  void *
2d4c0 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 72 63  pBuf.){.  int rc
2d4d0 3b 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65  ;.  if ( pCur->e
2d4e0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
2d4f0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
2d500 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
2d510 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2d520 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2d530 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ed(pCur) );.  rc
2d540 20 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65 43   = btreeRestoreC
2d550 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2d560 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
2d570 20 3f 20 72 63 20 3a 20 61 63 63 65 73 73 50 61   ? rc : accessPa
2d580 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
2d590 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
2d5a0 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
2d5b0 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63  BtreePayloadChec
2d5c0 6b 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ked(BtCursor *pC
2d5d0 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
2d5e0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
2d5f0 42 75 66 29 7b 0a 20 20 69 66 28 20 70 43 75 72  Buf){.  if( pCur
2d600 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2d610 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73  _VALID ){.    as
2d620 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2d630 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2d640 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63  ;.    return acc
2d650 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
2d660 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
2d670 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  uf, 0);.  }else{
2d680 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65  .    return acce
2d690 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64  ssPayloadChecked
2d6a0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
2d6b0 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d  mt, pBuf);.  }.}
2d6c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2d6d0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20  E_OMIT_INCRBLOB 
2d6e0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
2d6f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
2d700 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
2d710 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
2d720 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
2d730 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
2d740 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
2d750 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
2d760 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
2d770 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65   the key if inde
2d780 78 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  x btrees (pPage-
2d790 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20  >intKey==0) and 
2d7a0 69 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a  is the data for.
2d7b0 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20  ** table btrees 
2d7c0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
2d7d0 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1). The number o
2d7e0 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
2d7f0 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61  able.** key/data
2d800 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
2d810 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
2d820 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
2d830 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  alue.** returned
2d840 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76   will not be a v
2d850 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
2d860 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2d870 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
2d880 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
2d890 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
2d8a0 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
2d8b0 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
2d8c0 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
2d8d0 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
2d8e0 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
2d8f0 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
2d900 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
2d910 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
2d920 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
2d930 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
2d940 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
2d950 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
2d960 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
2d970 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
2d980 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
2d990 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
2d9a0 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
2d9b0 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
2d9c0 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
2d9d0 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
2d9e0 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
2d9f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
2da00 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
2da10 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
2da20 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
2da30 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
2da40 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
2da50 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
2da60 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
2da70 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
2da80 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
2da90 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2daa0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
2dab0 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50  nst void *fetchP
2dac0 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
2dad0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
2dae0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
2daf0 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
2db00 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
2db10 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20   *pAmt          
2db20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
2db30 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
2db40 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
2db50 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20  .){.  int amt;. 
2db60 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
2db70 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
2db80 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67  =0 && pCur->pPag
2db90 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  e);.  assert( pC
2dba0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2dbb0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2dbc0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2dbd0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2dbe0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2dbf0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
2dc00 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2dc10 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2dc20 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43  ert( pCur->ix<pC
2dc30 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2dc40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2dc50 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30  ur->info.nSize>0
2dc60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2dc70 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
2dc80 64 3e 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61  d>pCur->pPage->a
2dc90 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Data || CORRUPT_
2dca0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
2dcb0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
2dcc0 6f 61 64 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  oad<pCur->pPage-
2dcd0 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52  >aDataEnd ||CORR
2dce0 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d  UPT_DB);.  amt =
2dcf0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
2dd00 61 6c 3b 0a 20 20 69 66 28 20 61 6d 74 3e 28 69  al;.  if( amt>(i
2dd10 6e 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d  nt)(pCur->pPage-
2dd20 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72  >aDataEnd - pCur
2dd30 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29  ->info.pPayload)
2dd40 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
2dd50 20 69 73 20 74 6f 6f 20 6c 69 74 74 6c 65 20 73   is too little s
2dd60 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
2dd70 20 66 6f 72 20 74 68 65 20 65 78 70 65 63 74 65   for the expecte
2dd80 64 20 61 6d 6f 75 6e 74 0a 20 20 20 20 2a 2a 20  d amount.    ** 
2dd90 6f 66 20 6c 6f 63 61 6c 20 63 6f 6e 74 65 6e 74  of local content
2dda0 2e 20 44 61 74 61 62 61 73 65 20 6d 75 73 74 20  . Database must 
2ddb0 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
2ddc0 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
2ddd0 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 6d 74  PT_DB );.    amt
2dde0 20 3d 20 4d 41 58 28 30 2c 20 28 69 6e 74 29 28   = MAX(0, (int)(
2ddf0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61  pCur->pPage->aDa
2de00 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e  taEnd - pCur->in
2de10 66 6f 2e 70 50 61 79 6c 6f 61 64 29 29 3b 0a 20  fo.pPayload));. 
2de20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 28 75 33   }.  *pAmt = (u3
2de30 32 29 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20  2)amt;.  return 
2de40 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66  (void*)pCur->inf
2de50 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  o.pPayload;.}...
2de60 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
2de70 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
2de80 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
2de90 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
2dea0 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
2deb0 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
2dec0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
2ded0 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
2dee0 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
2def0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
2df00 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
2df10 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
2df20 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
2df30 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
2df40 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
2df50 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
2df60 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
2df70 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
2df80 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
2df90 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
2dfa0 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
2dfb0 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
2dfc0 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
2dfd0 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
2dfe0 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
2dff0 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
2e000 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
2e010 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
2e020 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
2e030 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
2e040 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
2e050 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
2e060 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
2e070 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
2e080 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
2e090 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
2e0a0 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
2e0b0 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
2e0c0 61 64 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  adFetch(BtCursor
2e0d0 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
2e0e0 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74  t){.  return fet
2e0f0 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
2e100 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pAmt);.}.../*.**
2e110 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2e120 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
2e130 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
2e140 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
2e150 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
2e160 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
2e170 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
2e180 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   to..**.** This 
2e190 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2e1a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
2e1b0 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  if the page-head
2e1c0 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  er flags field o
2e1d0 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69  f.** the new chi
2e1e0 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74  ld page does not
2e1f0 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73   match the flags
2e200 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
2e210 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66  rent (i.e..** if
2e220 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20   an intkey page 
2e230 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68  appears to be th
2e240 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f  e parent of a no
2e250 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f  n-intkey page, o
2e260 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29  r.** vice-versa)
2e270 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e280 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
2e290 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
2e2a0 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68  newPgno){.  BtSh
2e2b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
2e2c0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
2e2d0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2e2e0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2e2f0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2e300 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2e310 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2e320 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2e330 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
2e340 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  AX_DEPTH );.  as
2e350 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2e360 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e>=0 );.  if( pC
2e370 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55  ur->iPage>=(BTCU
2e380 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31  RSOR_MAX_DEPTH-1
2e390 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2e3a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2e3b0 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  KPT;.  }.  pCur-
2e3c0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2e3d0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2e3e0 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
2e3f0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2e400 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61  Ovfl);.  pCur->a
2e410 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2e420 5d 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20  ] = pCur->ix;.  
2e430 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2e440 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72  r->iPage] = pCur
2e450 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  ->pPage;.  pCur-
2e460 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  >ix = 0;.  pCur-
2e470 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 72 63 20 3d  >iPage++;.  rc =
2e480 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
2e490 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
2e4a0 43 75 72 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20  Cur->pPage,.    
2e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4c0 20 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e      pCur, pCur->
2e4d0 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a  curPagerFlags);.
2e4e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e4f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 65 74 4d 65  _OK ){.    setMe
2e500 6d 70 61 67 65 52 6f 6f 74 28 70 43 75 72 2d 3e  mpageRoot(pCur->
2e510 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 67 6e  pPage, pCur->pgn
2e520 6f 52 6f 6f 74 29 3b 0a 20 20 7d 0a 20 20 72 65  oRoot);.  }.  re
2e530 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
2e540 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2e550 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
2e560 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
2e570 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
2e580 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
2e590 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
2e5a0 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
2e5b0 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
2e5c0 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
2e5d0 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
2e5e0 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
2e5f0 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
2e600 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
2e610 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
2e620 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
2e630 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
2e640 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
2e650 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
2e660 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
2e670 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
2e680 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
2e690 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
2e6a0 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
2e6b0 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28  o iChild){.  if(
2e6c0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
2e6d0 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
2e6e0 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20  nditions tested 
2e6f0 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20  below might not 
2e700 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20  be true.        
2e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e720 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72      ** in a corr
2e730 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  upt database */.
2e740 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
2e750 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
2e760 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
2e770 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
2e780 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
2e790 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
2e7a0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
2e7b0 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
2e7c0 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
2e7d0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
2e7e0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2e7f0 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
2e800 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
2e810 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
2e820 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
2e830 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
2e840 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2e850 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
2e860 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
2e870 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
2e880 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
2e890 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
2e8a0 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
2e8b0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
2e8c0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
2e8d0 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
2e8e0 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
2e8f0 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
2e900 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
2e910 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
2e920 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
2e930 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
2e940 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
2e950 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
2e960 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
2e970 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
2e980 20 2a 70 4c 65 61 66 3b 0a 20 20 61 73 73 65 72   *pLeaf;.  asser
2e990 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2e9a0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2e9b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2e9c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2e9d0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2e9e0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
2e9f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2ea00 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ->pPage );.  ass
2ea10 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
2ea20 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
2ea30 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
2ea40 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
2ea50 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
2ea60 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61  , .    pCur->pPa
2ea70 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  ge->pgno.  );.  
2ea80 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e  testcase( pCur->
2ea90 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2eaa0 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50  e-1] > pCur->apP
2eab0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
2eac0 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70  1]->nCell );.  p
2ead0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2eae0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2eaf0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2eb00 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2eb10 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75  alidOvfl);.  pCu
2eb20 72 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69  r->ix = pCur->ai
2eb30 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
2eb40 31 5d 3b 0a 20 20 70 4c 65 61 66 20 3d 20 70 43  1];.  pLeaf = pC
2eb50 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75  ur->pPage;.  pCu
2eb60 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d  r->pPage = pCur-
2eb70 3e 61 70 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e  >apPage[--pCur->
2eb80 69 50 61 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73  iPage];.  releas
2eb90 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65  ePageNotNull(pLe
2eba0 61 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  af);.}../*.** Mo
2ebb0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2ebc0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
2ebd0 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
2ebe0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2ebf0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
2ec00 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
2ec10 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
2ec20 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2ec30 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
2ec40 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
2ec50 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
2ec60 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
2ec70 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
2ec80 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
2ec90 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
2eca0 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
2ecb0 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
2ecc0 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
2ecd0 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
2ece0 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
2ecf0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
2ed00 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
2ed10 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
2ed20 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
2ed30 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
2ed40 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
2ed50 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
2ed60 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
2ed70 4c 49 44 20 61 6e 64 20 74 68 69 73 20 72 6f 75  LID and this rou
2ed80 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
2ed90 49 54 45 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72  ITE_EMPTY. Other
2eda0 77 69 73 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72  wise,.** the cur
2edb0 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f  sor is set to po
2edc0 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  int to the first
2edd0 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e   cell located on
2ede0 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72   the root.** (or
2edf0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70   virtual root) p
2ee00 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73  age and the curs
2ee10 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
2ee20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  to CURSOR_VALID.
2ee30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
2ee40 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2ee50 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74  successfully, it
2ee60 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20   may be assumed 
2ee70 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65  that the.** page
2ee80 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e  -header flags in
2ee90 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
2eea0 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70  [virtual] root-p
2eeb0 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63  age is the expec
2eec0 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20  ted .** kind of 
2eed0 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65  b-tree page (i.e
2eee0 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e  . if when openin
2eef0 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65  g the cursor the
2ef00 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a   caller did not.
2ef10 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  ** specify a Key
2ef20 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
2ef30 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
2ef40 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20   set to 0x05 or 
2ef50 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  0x0D,.** indicat
2ef60 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72  ing a table b-tr
2ef70 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61  ee, or if the ca
2ef80 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79  ller did specify
2ef90 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73   a KeyInfo .** s
2efa0 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
2efb0 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
2efc0 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20  o 0x02 or 0x0A, 
2efd0 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
2efe0 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a  dex.** b-tree)..
2eff0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2f000 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f  veToRoot(BtCurso
2f010 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
2f020 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e  age *pRoot;.  in
2f030 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2f040 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2f050 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2f060 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2f070 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
2f080 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
2f090 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
2f0a0 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
2f0b0 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
2f0c0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
2f0d0 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
2f0e0 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
2f0f0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
2f100 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2f110 74 65 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  te < CURSOR_REQU
2f120 49 52 45 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d  IRESEEK || pCur-
2f130 3e 69 50 61 67 65 3c 30 20 29 3b 0a 20 20 61 73  >iPage<0 );.  as
2f140 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2f150 52 6f 6f 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e  Root>0 || pCur->
2f160 69 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66  iPage<0 );..  if
2f170 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
2f180 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
2f190 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
2f1a0 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
2f1b0 75 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 29  ull(pCur->pPage)
2f1c0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2d  ;.      while( -
2f1d0 2d 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a  -pCur->iPage ){.
2f1e0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2f1f0 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d  ageNotNull(pCur-
2f200 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2f210 61 67 65 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  age]);.      }. 
2f220 20 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65       pCur->pPage
2f230 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2f240 30 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  0];.      goto s
2f250 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a  kip_init;.    }.
2f260 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72    }else if( pCur
2f270 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b  ->pgnoRoot==0 ){
2f280 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2f290 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2f2a0 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ID;.    return S
2f2b0 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d  QLITE_EMPTY;.  }
2f2c0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2f2d0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28  ( pCur->iPage==(
2f2e0 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  -1) );.    if( p
2f2f0 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
2f300 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2f310 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
2f320 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2f330 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
2f340 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2f350 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
2f360 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
2f370 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
2f380 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
2f390 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
2f3a0 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
2f3b0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  r);.    }.    rc
2f3c0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
2f3d0 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
2f3e0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
2f3f0 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67  oot, &pCur->pPag
2f400 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2f410 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43             0, pC
2f420 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
2f430 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
2f440 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f450 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2f460 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2f470 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2f480 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  c;.    }.    set
2f490 4d 65 6d 70 61 67 65 52 6f 6f 74 28 70 43 75 72  MempageRoot(pCur
2f4a0 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 70  ->pPage, pCur->p
2f4b0 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 70 43  gnoRoot);.    pC
2f4c0 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
2f4d0 20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b     pCur->curIntK
2f4e0 65 79 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ey = pCur->pPage
2f4f0 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20  ->intKey;.  }.  
2f500 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50  pRoot = pCur->pP
2f510 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
2f520 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
2f530 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20  ->pgnoRoot );.. 
2f540 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
2f550 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
2f560 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
2f570 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
2f580 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  his cursor.  ** 
2f590 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
2f5a0 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
2f5b0 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
2f5c0 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
2f5d0 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  s.  ** NULL, the
2f5e0 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
2f5f0 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
2f600 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
2f610 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65  he case,.  ** re
2f620 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
2f630 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20  ORRUPT error. . 
2f640 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72   **.  ** Earlier
2f650 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
2f660 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ite assumed that
2f670 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64   this test could
2f680 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69   not fail.  ** i
2f690 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
2f6a0 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64  was already load
2f6b0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
2f6c0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
2f6d0 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70   (i.e..  ** if p
2f6e0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20  Cur->iPage>=0). 
2f6f0 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
2f700 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61  so if the databa
2f710 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
2f720 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20  .  ** in such a 
2f730 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52  way that page pR
2f740 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e  oot is linked in
2f750 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72  to a second b-tr
2f760 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28  ee table .  ** (
2f770 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29  or the freelist)
2f780 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2f790 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pRoot->intKey==1
2f7a0 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65   || pRoot->intKe
2f7b0 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  y==0 );.  if( pR
2f7c0 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c  oot->isInit==0 |
2f7d0 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  | (pCur->pKeyInf
2f7e0 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)!=pRoot->in
2f7f0 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
2f800 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2f810 54 5f 50 41 47 45 28 70 43 75 72 2d 3e 70 50 61  T_PAGE(pCur->pPa
2f820 67 65 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69  ge);.  }..skip_i
2f830 6e 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69  nit:  .  pCur->i
2f840 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  x = 0;.  pCur->i
2f850 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2f860 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2f870 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74  &= ~(BTCF_AtLast
2f880 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  |BTCF_ValidNKey|
2f890 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2f8a0 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  ..  pRoot = pCur
2f8b0 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70  ->pPage;.  if( p
2f8c0 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Root->nCell>0 ){
2f8d0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2f8e0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2f8f0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
2f900 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
2f910 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
2f920 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70      if( pRoot->p
2f930 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20  gno!=1 ) return 
2f940 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2f950 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65  KPT;.    subpage
2f960 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
2f970 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
2f980 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2f990 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2f9a0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
2f9b0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2f9c0 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
2f9d0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
2f9e0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2f9f0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2fa00 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2fa10 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 20 20 72  E_EMPTY;.  }.  r
2fa20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2fa30 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2fa40 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
2fa50 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
2fa60 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
2fa70 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
2fa80 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
2fa90 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
2faa0 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
2fab0 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
2fac0 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
2fad0 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
2fae0 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
2faf0 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
2fb00 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
2fb10 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
2fb20 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
2fb30 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
2fb40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
2fb50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
2fb60 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2fb70 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2fb80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2fb90 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2fba0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
2fbb0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2fbc0 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
2fbd0 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61  Cur->pPage)->lea
2fbe0 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
2fbf0 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d   pCur->ix<pPage-
2fc00 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
2fc10 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
2fc20 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
2fc30 75 72 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72 63  ur->ix));.    rc
2fc40 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2fc50 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
2fc60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2fc70 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
2fc80 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
2fc90 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
2fca0 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
2fcb0 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
2fcc0 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
2fcd0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
2fce0 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
2fcf0 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
2fd00 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2fd10 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
2fd20 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
2fd30 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
2fd40 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
2fd50 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
2fd60 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
2fd70 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
2fd80 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
2fd90 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
2fda0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
2fdb0 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
2fdc0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2fdd0 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
2fde0 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
2fdf0 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
2fe00 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
2fe10 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
2fe20 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
2fe30 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
2fe40 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
2fe50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
2fe60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
2fe70 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
2fe80 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2fe90 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2fea0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2feb0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2fec0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2fed0 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65    while( !(pPage
2fee0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d   = pCur->pPage)-
2fef0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
2ff00 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
2ff10 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2ff20 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2ff30 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  .    pCur->ix = 
2ff40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
2ff50 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2ff60 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
2ff70 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2ff80 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
2ff90 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e  ur->ix = pPage->
2ffa0 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72  nCell-1;.  asser
2ffb0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
2ffc0 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ize==0 );.  asse
2ffd0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2ffe0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2fff0 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65  NKey)==0 );.  re
30000 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30010 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
30020 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
30030 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
30040 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
30050 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
30060 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
30070 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
30080 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
30090 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
300a0 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
300b0 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
300c0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
300d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
300e0 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
300f0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
30100 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  s){.  int rc;.. 
30110 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
30120 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
30130 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
30140 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
30150 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
30160 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
30170 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
30180 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
30190 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
301a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
301b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
301c0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
301d0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
301e0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
301f0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
30200 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a  SQLITE_EMPTY ){.
30210 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
30220 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
30230 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
30240 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70  ell==0 );.    *p
30250 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20  Res = 1;.    rc 
30260 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
30270 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30280 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
30290 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
302a0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
302b0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
302c0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
302d0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
302e0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
302f0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
30300 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
30310 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
30320 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
30330 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
30340 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
30350 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
30360 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
30370 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
30380 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
30390 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
303a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
303b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
303c0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
303d0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
303e0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   If the cursor a
303f0 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f  lready points to
30400 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c   the last entry,
30410 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
30420 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f  . */.  if( CURSO
30430 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
30440 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e  State && (pCur->
30450 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
30460 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69  AtLast)!=0 ){.#i
30470 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
30480 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
30490 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
304a0 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
304b0 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
304c0 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
304d0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
304e0 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
304f0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
30500 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
30510 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
30520 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
30530 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
30540 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
30550 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
30560 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
30570 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43 75 72  ( pCur->ix==pCur
30580 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  ->pPage->nCell-1
30590 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
305a0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61  pCur->pPage->lea
305b0 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
305c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
305d0 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
305e0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
305f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30600 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
30610 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
30620 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
30630 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
30640 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
30650 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
30660 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30670 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
30680 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
30690 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20   BTCF_AtLast;.  
306a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
306b0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
306c0 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20   ~BTCF_AtLast;. 
306d0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
306e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54   rc==SQLITE_EMPT
306f0 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  Y ){.    assert(
30700 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
30710 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67  =0 || pCur->pPag
30720 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
30730 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
30740 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
30750 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
30760 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
30770 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
30780 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
30790 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20   entry near the 
307a0 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  key .** specifie
307b0 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20  d by pIdxKey or 
307c0 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e  intKey.   Return
307d0 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
307e0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
307f0 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e  Y tables, the in
30800 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  tKey parameter i
30810 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79  s used.  pIdxKey
30820 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c   .** must be NUL
30830 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
30840 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73  bles, pIdxKey is
30850 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79   used and intKey
30860 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  .** is ignored..
30870 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
30880 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
30890 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
308a0 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
308b0 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
308c0 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
308d0 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
308e0 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
308f0 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
30900 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
30910 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
30920 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
30930 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
30940 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
30950 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73  ** An integer is
30960 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
30970 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65  Res which is the
30980 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f   result of.** co
30990 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
309a0 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
309b0 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73  o which the curs
309c0 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69  or is .** pointi
309d0 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  ng.  The meaning
309e0 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
309f0 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
30a00 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c  *pRes is as foll
30a10 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ows:.**.**     *
30a20 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20  pRes<0      The 
30a30 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
30a40 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
30a50 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
30a60 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
30a70 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74  smaller than int
30a80 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69  Key/pIdxKey or i
30a90 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
30aa0 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  mpty.**         
30ab0 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65           and the
30ac0 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65   cursor is there
30ad0 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20  fore left point 
30ae0 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  to nothing..**.*
30af0 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20  *     *pRes==0  
30b00 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
30b10 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
30b20 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
30b30 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
30b40 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63      exactly matc
30b50 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  hes intKey/pIdxK
30b60 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
30b70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
30b80 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
30b90 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
30ba0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
30bb0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
30bc0 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  arger than intKe
30bd0 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
30be0 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
30bf0 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d 3e  s, the pIdxKey->
30c00 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73 20  eqSeen field is 
30c10 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 72  set to 1 if ther
30c20 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20 65  e.** exists an e
30c30 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
30c40 65 20 74 68 61 74 20 65 78 61 63 74 6c 79 20 6d  e that exactly m
30c50 61 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e 20  atches pIdxKey. 
30c60 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
30c70 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
30c80 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
30c90 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
30ca0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
30cb0 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55   be moved */.  U
30cc0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
30cd0 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63  IdxKey, /* Unpac
30ce0 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
30cf0 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20  .  i64 intKey,  
30d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30d10 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a  he table key */.
30d20 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
30d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
30d40 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
30d50 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
30d60 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
30d70 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
30d80 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
30d90 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
30da0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
30db0 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72  ;.  RecordCompar
30dc0 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  e xRecordCompare
30dd0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
30de0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
30df0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
30e00 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
30e10 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
30e20 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
30e30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
30e40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
30e50 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
30e60 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20  r->pKeyInfo==0) 
30e70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
30e80 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
30e90 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64 78  R_VALID || (pIdx
30ea0 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
30eb0 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29 3b  curIntKey!=0) );
30ec0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
30ed0 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
30ee0 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
30ef0 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
30f00 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
30f10 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
30f20 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
30f30 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
30f40 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d  /.  if( pIdxKey=
30f50 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 65  =0.   && pCur->e
30f60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
30f70 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75  LID && (pCur->cu
30f80 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
30f90 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29 7b  lidNKey)!=0.  ){
30fa0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
30fb0 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
30fc0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
30fd0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
30fe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
30ff0 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
31000 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
31010 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  y ){.      if( (
31020 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
31030 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
31040 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
31050 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  s = -1;.        
31060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31080 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  /* If the reques
31090 74 65 64 20 6b 65 79 20 69 73 20 6f 6e 65 20 6d  ted key is one m
310a0 6f 72 65 20 74 68 61 6e 20 74 68 65 20 70 72 65  ore than the pre
310b0 76 69 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e 0a  vious key, then.
310c0 20 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f 20        ** try to 
310d0 67 65 74 20 74 68 65 72 65 20 75 73 69 6e 67 20  get there using 
310e0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
310f0 28 29 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  () rather than a
31100 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 62   full.      ** b
31110 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20 54  inary search.  T
31120 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
31130 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54 68  zation only.  Th
31140 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
31150 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
31160 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68  ll obtained with
31170 6f 75 74 20 74 68 69 73 20 63 61 73 65 2c 20 6f  out this case, o
31180 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72  nly a little mor
31190 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20 20  e slowely */.   
311a0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
311b0 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65 79  o.nKey+1==intKey
311c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
311d0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  s = 0;.        r
311e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
311f0 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a 20  Next(pCur, 0);. 
31200 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
31210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31220 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66        getCellInf
31230 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 20  o(pCur);.       
31240 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
31250 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  o.nKey==intKey )
31260 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
31270 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31280 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31290 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
312a0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
312b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
312c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
312d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
312e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
312f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31300 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
31310 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20  ( pIdxKey ){.   
31320 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
31330 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  = sqlite3VdbeFin
31340 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79  dCompare(pIdxKey
31350 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e  );.    pIdxKey->
31360 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  errCode = 0;.   
31370 20 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79   assert( pIdxKey
31380 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20  ->default_rc==1 
31390 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
313a0 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
313b0 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==0 .         ||
313c0 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
313d0 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a  t_rc==-1.    );.
313e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65    }else{.    xRe
313f0 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b  cordCompare = 0;
31400 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65   /* All keys are
31410 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d   integers */.  }
31420 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
31430 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
31440 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72   rc ){.    if( r
31450 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20  c==SQLITE_EMPTY 
31460 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
31470 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
31480 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67  =0 || pCur->pPag
31490 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
314a0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b       *pRes = -1;
314b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
314c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
314d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
314e0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
314f0 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ->pPage );.  ass
31500 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
31510 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
31520 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
31530 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
31540 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
31550 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
31560 20 3e 20 30 20 29 3b 0a 20 20 61 73 73 65 72 74   > 0 );.  assert
31570 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
31580 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
31590 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75  [0]->intKey==pCu
315a0 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a  r->curIntKey );.
315b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
315c0 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64  curIntKey || pId
315d0 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b  xKey );.  for(;;
315e0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
315f0 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20  upr, idx, c;.   
31600 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
31610 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
31620 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
31630 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
31640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31650 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
31660 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
31670 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
31680 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
31690 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
316a0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
316b0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
316c0 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
316d0 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
316e0 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
316f0 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
31700 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
31710 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
31720 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
31730 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
31740 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
31750 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
31760 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
31770 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
31780 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
31790 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
317a0 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
317b0 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
317c0 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
317d0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
317e0 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
317f0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
31800 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
31810 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
31820 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
31830 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
31840 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
31850 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
31860 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
31870 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
31880 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
31890 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
318a0 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72  ell-1;.    asser
318b0 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20  t( biasRight==0 
318c0 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20  || biasRight==1 
318d0 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72  );.    idx = upr
318e0 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b  >>(1-biasRight);
318f0 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69   /* idx = biasRi
31900 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72  ght ? upr : (lwr
31910 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
31920 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
31930 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65  idx;.    if( xRe
31940 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29  cordCompare==0 )
31950 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
31960 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
31970 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  llKey;.        p
31980 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
31990 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
319a0 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
319b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
319c0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  f ){.          w
319d0 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28  hile( 0x80 <= *(
319e0 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20  pCell++) ){.    
319f0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
31a00 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  l>=pPage->aDataE
31a10 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
31a20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31a30 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
31a40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
31a50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
31a60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31a70 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
31a80 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
31a90 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
31aa0 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
31ab0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  y ){.          l
31ac0 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
31ad0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
31ae0 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65  r ){ c = -1; bre
31af0 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
31b00 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
31b10 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
31b20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
31b30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31b40 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b  lwr>upr ){ c = +
31b50 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
31b60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31b70 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
31b80 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b  llKey==intKey );
31b90 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
31ba0 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  >ix = (u16)idx;.
31bb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
31bc0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
31bd0 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
31be0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  idx;.           
31bf0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78   goto moveto_nex
31c00 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20  t_layer;.       
31c10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31c20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
31c30 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
31c40 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  idNKey;.        
31c50 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
31c60 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a  Key = nCellKey;.
31c70 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
31c80 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
31c90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  ;.            *p
31ca0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
31cb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
31cc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
31cd0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
31ce0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
31cf0 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
31d00 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
31d10 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
31d20 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
31d30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
31d40 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b  se{.      for(;;
31d50 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
31d60 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  Cell;  /* Size o
31d70 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c  f the pCell cell
31d80 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
31d90 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
31da0 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61  dCellPastPtr(pPa
31db0 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20  ge, idx);..     
31dc0 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
31dd0 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
31de0 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62  -size is 65536 b
31df0 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
31e00 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
31e10 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
31e20 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
31e30 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
31e40 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
31e50 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
31e60 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34   less than 16384
31e70 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62   bytes and may b
31e80 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
31e90 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
31ea0 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
31eb0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
31ec0 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
31ed0 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
31ee0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
31ef0 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
31f00 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
31f10 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
31f20 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
31f30 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
31f40 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
31f50 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
31f60 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
31f70 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
31f80 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
31f90 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
31fa0 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43        nCell = pC
31fb0 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
31fc0 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65  if( nCell<=pPage
31fd0 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
31fe0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  d ){.          /
31ff0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
32000 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ns if the record
32010 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
32020 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20  he cell is a.   
32030 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
32040 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
32050 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73   the record fits
32060 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
32070 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20   main.          
32080 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
32090 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
320a0 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
320b0 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+1==pPage->aD
320c0 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
320d0 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
320e0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
320f0 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
32100 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
32110 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
32120 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
32130 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
32140 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
32150 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
32160 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
32170 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a  ocal.        ){.
32180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
32190 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
321a0 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76  ld is a 2 byte v
321b0 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
321c0 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20  cord .          
321d0 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  ** fits entirely
321e0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
321f0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
32200 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
32210 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d  ( pCell+nCell+2=
32220 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
32230 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
32240 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
32250 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
32260 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65  pCell[2], pIdxKe
32270 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
32280 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
32290 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73  The record flows
322a0 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f   over onto one o
322b0 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
322c0 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20  pages. In.      
322d0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
322e0 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20   the whole cell 
322f0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73  needs to be pars
32300 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ed, a buffer all
32310 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20  ocated.         
32320 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61   ** and accessPa
32330 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20  yload() used to 
32340 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63  retrieve the rec
32350 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ord into the.   
32360 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
32370 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f   before VdbeReco
32380 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20  rdCompare() can 
32390 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20  be called. .    
323a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
323b0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63     ** If the rec
323c0 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ord is corrupt, 
323d0 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  the xRecordCompa
323e0 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72  re routine may r
323f0 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ead.          **
32400 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e   up to two varin
32410 74 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ts past the end 
32420 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41  of the buffer. A
32430 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20  n extra 18 .    
32440 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f        ** bytes o
32450 66 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c  f padding is all
32460 6f 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e  ocated at the en
32470 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  d of the buffer 
32480 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
32490 63 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e  case this happen
324a0 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  s.  */.         
324b0 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
324c0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
324d0 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
324e0 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
324f0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
32500 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
32510 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
32520 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
32530 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
32540 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e       nCell = (in
32550 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
32560 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  y;.          tes
32570 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29  tcase( nCell<0 )
32580 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b  ;   /* True if k
32590 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20  ey size is 2^32 
325a0 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20  or more */.     
325b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
325c0 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49  Cell==0 );  /* I
325d0 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a  nvalid key size:
325e0 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30    0x80 0x80 0x00
325f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
32600 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31  stcase( nCell==1
32610 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
32620 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
32630 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20  0x80 0x01 */.   
32640 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
32650 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a   nCell==2 );  /*
32660 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69   Minimum legal i
32670 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f  ndex key size */
32680 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
32690 43 65 6c 6c 3c 32 20 7c 7c 20 6e 43 65 6c 6c 2f  Cell<2 || nCell/
326a0 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  pCur->pBt->usabl
326b0 65 53 69 7a 65 3e 70 43 75 72 2d 3e 70 42 74 2d  eSize>pCur->pBt-
326c0 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >nPage ){.      
326d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
326e0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
326f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
32700 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
32710 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
32720 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65   }.          pCe
32730 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
32740 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20  alloc( nCell+18 
32750 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
32760 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
32770 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
32780 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
32790 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
327a0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
327b0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
327c0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
327d0 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
327e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
327f0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
32800 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
32810 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
32820 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  lKey, 0);.      
32830 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
32840 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69  gs &= ~BTCF_Vali
32850 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20 20 20  dOvfl;.         
32860 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
32870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
32880 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
32890 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
328a0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
328b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
328c0 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
328d0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
328e0 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65  e(nCell, pCellKe
328f0 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
32900 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
32910 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
32920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32930 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
32940 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e        (pIdxKey->
32950 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
32960 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29  CORRUPT || c==0)
32970 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49  .         && (pI
32980 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d  dxKey->errCode!=
32990 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
329a0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
329b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a  ->mallocFailed).
329c0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
329d0 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
329e0 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
329f0 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x+1;.        }el
32a00 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20  se if( c>0 ){.  
32a10 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
32a20 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x-1;.        }el
32a30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
32a40 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20  sert( c==0 );.  
32a50 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
32a60 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
32a70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
32a80 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20         pCur->ix 
32a90 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
32aa0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65        if( pIdxKe
32ab0 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20  y->errCode ) rc 
32ac0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
32ad0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
32ae0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
32af0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ish;.        }. 
32b00 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
32b10 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  pr ) break;.    
32b20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
32b30 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
32b40 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
32b50 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
32b60 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20  (lwr+upr)/2 */. 
32b70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
32b80 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
32b90 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69  r+1 || (pPage->i
32ba0 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
32bb0 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73  >leaf) );.    as
32bc0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
32bd0 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nit );.    if( p
32be0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
32bf0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
32c00 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  ->ix<pCur->pPage
32c10 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
32c20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
32c30 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65  )idx;.      *pRe
32c40 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
32c50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
32c60 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
32c70 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76  inish;.    }.mov
32c80 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a  eto_next_layer:.
32c90 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61      if( lwr>=pPa
32ca0 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
32cb0 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
32cc0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
32cd0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
32ce0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
32cf0 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67  se{.      chldPg
32d00 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
32d10 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29  Cell(pPage, lwr)
32d20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
32d30 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 6c 77 72  r->ix = (u16)lwr
32d40 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
32d50 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
32d60 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
32d70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f   ) break;.  }.mo
32d80 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70  veto_finish:.  p
32d90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
32da0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28  = 0;.  assert( (
32db0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
32dc0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
32dd0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
32de0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
32df0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
32e00 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
32e10 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
32e20 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
32e30 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
32e40 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
32e50 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
32e60 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
32e70 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
32e80 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
32e90 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
32ea0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
32eb0 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
32ec0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
32ed0 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
32ee0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
32ef0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
32f00 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
32f10 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
32f20 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
32f30 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
32f40 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
32f50 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
32f60 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
32f70 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
32f80 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
32f90 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
32fa0 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
32fb0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
32fc0 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
32fd0 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
32fe0 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
32ff0 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
33000 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
33010 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ate);.}../*.** R
33020 65 74 75 72 6e 20 61 6e 20 65 73 74 69 6d 61 74  eturn an estimat
33030 65 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72  e for the number
33040 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
33050 74 61 62 6c 65 20 74 68 61 74 20 70 43 75 72 20  table that pCur 
33060 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  is.** pointing t
33070 6f 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  o.  Return a neg
33080 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
33090 6e 6f 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  no estimate is c
330a0 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 61 76 61  urrently .** ava
330b0 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73  ilable..*/.i64 s
330c0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 77 43 6f  qlite3BtreeRowCo
330d0 75 6e 74 45 73 74 28 42 74 43 75 72 73 6f 72 20  untEst(BtCursor 
330e0 2a 70 43 75 72 29 7b 0a 20 20 69 36 34 20 6e 3b  *pCur){.  i64 n;
330f0 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61 73 73 65  .  u8 i;..  asse
33100 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
33110 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
33120 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
33130 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
33140 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
33150 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  utex) );..  /* C
33160 75 72 72 65 6e 74 6c 79 20 74 68 69 73 20 69 6e  urrently this in
33170 74 65 72 66 61 63 65 20 69 73 20 6f 6e 6c 79 20  terface is only 
33180 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 4f 50  called by the OP
33190 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20  _IfSmaller.  ** 
331a0 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69 74 20 74  opcode, and it t
331b0 68 61 74 20 63 61 73 65 20 74 68 65 20 63 75 72  hat case the cur
331c0 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  sor will always 
331d0 62 65 20 76 61 6c 69 64 20 61 6e 64 0a 20 20 2a  be valid and.  *
331e0 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f  * will always po
331f0 69 6e 74 20 74 6f 20 61 20 6c 65 61 66 20 6e 6f  int to a leaf no
33200 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  de. */.  if( NEV
33210 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65 21  ER(pCur->eState!
33220 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29  =CURSOR_VALID) )
33230 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66   return -1;.  if
33240 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 70 50  ( NEVER(pCur->pP
33250 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 20 29 20  age->leaf==0) ) 
33260 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 6e 20  return -1;..  n 
33270 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  = pCur->pPage->n
33280 43 65 6c 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Cell;.  for(i=0;
33290 20 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20   i<pCur->iPage; 
332a0 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a 3d 20 70  i++){.    n *= p
332b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e  Cur->apPage[i]->
332c0 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65 74  nCell;.  }.  ret
332d0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
332e0 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
332f0 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
33300 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
33310 62 61 73 65 2e 20 0a 2a 2a 20 52 65 74 75 72 6e  base. .** Return
33320 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   value:.**.**   
33330 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20   SQLITE_OK      
33340 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20 20    success.**    
33350 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 20 20  SQLITE_DONE     
33360 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
33370 64 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  dy pointing at t
33380 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 0a  he last element.
33390 2a 2a 20 20 20 20 6f 74 68 65 72 77 69 73 65 20  **    otherwise 
333a0 20 20 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64         some kind
333b0 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72   of error occurr
333c0 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  ed.**.** The mai
333d0 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
333e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
333f0 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69  t().  That routi
33400 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a  ne is optimized.
33410 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ** for the commo
33420 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79  n case of merely
33430 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   incrementing th
33440 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42  e cell counter B
33450 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a  tCursor.aiIdx.**
33460 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c   to the next cel
33470 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  l on the current
33480 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f   page.  The (slo
33490 77 65 72 29 20 62 74 72 65 65 4e 65 78 74 28 29  wer) btreeNext()
334a0 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69   helper.** routi
334b0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
334c0 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
334d0 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
334e0 69 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72  ifferent page or
334f0 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74  .** to restore t
33500 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
33510 20 49 66 20 62 69 74 20 30 78 30 31 20 6f 66 20   If bit 0x01 of 
33520 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20 69  the F argument i
33530 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  n sqlite3BtreeNe
33540 78 74 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68  xt(C,F) is 1, th
33550 65 6e 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  en the.** cursor
33560 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
33570 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
33580 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
33590 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  uld have been.**
335a0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
335b0 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
335c0 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  en a unique inde
335d0 78 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d 65  x.  The F argume
335e0 6e 74 0a 2a 2a 20 69 73 20 61 20 68 69 6e 74 20  nt.** is a hint 
335f0 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
33600 2e 20 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  .  SQLite btree 
33610 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
33620 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 74  oes not use.** t
33630 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43 4f  his hint, but CO
33640 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74  MDB2 does..*/.st
33650 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
33660 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65  LINE int btreeNe
33670 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
33680 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
33690 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
336a0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
336b0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
336c0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
336d0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
336e0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
336f0 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ID ){.    assert
33700 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
33710 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
33720 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  fl)==0 );.    rc
33730 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
33740 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
33750 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33760 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
33770 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
33780 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
33790 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
337a0 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65  tate ){.      re
337b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
337c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
337d0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
337e0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b  RSOR_SKIPNEXT ){
337f0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
33800 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
33810 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
33820 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
33830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
33840 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
33850 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
33860 61 67 65 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  age;.  idx = ++p
33870 43 75 72 2d 3e 69 78 3b 0a 20 20 69 66 28 20 21  Cur->ix;.  if( !
33880 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
33890 0a 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79  .    /* The only
338a0 20 6b 6e 6f 77 6e 20 77 61 79 20 66 6f 72 20 74   known way for t
338b0 68 69 73 20 74 6f 20 68 61 70 70 65 6e 20 69 73  his to happen is
338c0 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
338d0 20 61 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73   a.    ** recurs
338e0 69 76 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ive SQL function
338f0 20 74 68 61 74 20 64 6f 65 73 20 61 20 44 45 4c   that does a DEL
33900 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 61 73  ETE operation as
33910 20 70 61 72 74 20 6f 66 20 61 0a 20 20 20 20 2a   part of a.    *
33920 2a 20 53 45 4c 45 43 54 20 77 68 69 63 68 20 64  * SELECT which d
33930 65 6c 65 74 65 73 20 63 6f 6e 74 65 6e 74 20 6f  eletes content o
33940 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 61 6e  ut from under an
33950 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 0a 20   active cursor. 
33960 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75     ** in a corru
33970 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
33980 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65   where the table
33990 20 62 65 69 6e 67 20 44 45 4c 45 54 45 2d 65 64   being DELETE-ed
339a0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 68 61 73   from.    ** has
339b0 20 70 61 67 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e   pages in common
339c0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
339d0 62 65 69 6e 67 20 71 75 65 72 69 65 64 2e 20 20  being queried.  
339e0 53 65 65 20 54 48 33 0a 20 20 20 20 2a 2a 20 6d  See TH3.    ** m
339f0 6f 64 75 6c 65 20 63 6f 76 31 2f 62 74 72 65 65  odule cov1/btree
33a00 37 38 2e 74 65 73 74 20 74 65 73 74 63 61 73 65  78.test testcase
33a10 20 32 32 30 20 28 32 30 31 38 2d 30 36 2d 30 38   220 (2018-06-08
33a20 29 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ) for an.    ** 
33a30 65 78 61 6d 70 6c 65 2e 20 2a 2f 0a 20 20 20 20  example. */.    
33a40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
33a50 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
33a60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
33a70 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f  abase file is co
33a80 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73  rrupt, it is pos
33a90 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61  sible for the va
33aa0 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a  lue of idx .  **
33ab0 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68   to be invalid h
33ac0 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  ere. This can on
33ad0 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65  ly occur if a se
33ae0 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69  cond cursor modi
33af0 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61  fies.  ** the pa
33b00 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20  ge while cursor 
33b10 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20  pCur is holding 
33b20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
33b30 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a  t. Which can.  *
33b40 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  * only happen if
33b50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
33b60 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68   corrupt in such
33b70 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e   a way as to lin
33b80 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  k the.  ** page 
33b90 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  into more than o
33ba0 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ne b-tree struct
33bb0 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61  ure. */.  testca
33bc0 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e  se( idx>pPage->n
33bd0 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69  Cell );..  if( i
33be0 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
33bf0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
33c00 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
33c10 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
33c20 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
33c30 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
33c40 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
33c50 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
33c60 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
33c70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  .      return mo
33c80 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
33c90 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  r);.    }.    do
33ca0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
33cb0 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
33cc0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
33cd0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
33ce0 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
33cf0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
33d00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
33d10 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
33d20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
33d30 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
33d40 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
33d50 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ix>=pPage->nCell
33d60 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
33d70 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
33d80 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
33d90 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
33da0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
33db0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
33dc0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
33dd0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
33de0 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
33df0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
33e00 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
33e10 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
33e20 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74  pCur);.  }.}.int
33e30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
33e40 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
33e50 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
33e60 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
33e70 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
33e80 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a  ER( flags );  /*
33e90 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32 20   Used in COMDB2 
33ea0 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20 53  but not native S
33eb0 51 4c 69 74 65 20 2a 2f 0a 20 20 61 73 73 65 72  QLite */.  asser
33ec0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
33ed0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
33ee0 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
33ef0 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b  0 || flags==1 );
33f00 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
33f10 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
33f20 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
33f30 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
33f40 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
33f50 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
33f60 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
33f70 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65  ) return btreeNe
33f80 78 74 28 70 43 75 72 29 3b 0a 20 20 70 50 61 67  xt(pCur);.  pPag
33f90 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
33fa0 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e  .  if( (++pCur->
33fb0 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ix)>=pPage->nCel
33fc0 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69  l ){.    pCur->i
33fd0 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  x--;.    return 
33fe0 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 29 3b  btreeNext(pCur);
33ff0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
34000 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
34010 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
34030 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
34040 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
34050 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
34060 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
34070 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
34080 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
34090 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 52 65 74  database..** Ret
340a0 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  urn values:.**.*
340b0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20  *     SQLITE_OK 
340c0 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20      success.**  
340d0 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20     SQLITE_DONE  
340e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
340f0 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20 66 69  lready on the fi
34100 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  rst element of t
34110 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  he table.**     
34120 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 73 6f  otherwise     so
34130 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  me kind of error
34140 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20   occurred.**.** 
34150 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
34160 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
34170 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20  treePrevious(). 
34180 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
34190 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
341a0 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
341b0 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72  e of merely decr
341c0 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
341d0 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
341e0 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
341f0 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c  he previous cell
34200 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
34210 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
34220 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f 75  er) btreePreviou
34230 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f  s().** helper ro
34240 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
34250 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
34260 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
34270 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
34280 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72  .** or to restor
34290 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
342a0 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30 31 20  .** If bit 0x01 
342b0 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d 65 6e  of the F argumen
342c0 74 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  t to sqlite3Btre
342d0 65 50 72 65 76 69 6f 75 73 28 43 2c 46 29 20 69  ePrevious(C,F) i
342e0 73 20 31 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  s 1, then.** the
342f0 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f   cursor correspo
34300 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e  nds to an SQL in
34310 64 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75  dex and this rou
34320 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20  tine could have 
34330 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20  been.** skipped 
34340 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78  if the SQL index
34350 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71   had been a uniq
34360 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46  ue index.  The F
34370 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a   argument is a.*
34380 2a 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d  * hint to the im
34390 70 6c 65 6d 65 6e 74 2e 20 20 54 68 65 20 6e 61  plement.  The na
343a0 74 69 76 65 20 53 51 4c 69 74 65 20 62 74 72 65  tive SQLite btre
343b0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
343c0 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 75 73 65   does not.** use
343d0 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20   this hint, but 
343e0 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a  COMDB2 does..*/.
343f0 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
34400 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65  INLINE int btree
34410 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
34420 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
34430 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
34440 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
34450 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
34460 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
34470 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
34480 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41  rFlags & (BTCF_A
34490 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
344a0 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Ovfl|BTCF_ValidN
344b0 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  Key))==0 );.  as
344c0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
344d0 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69  .nSize==0 );.  i
344e0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
344f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
34500 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
34510 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
34520 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
34530 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34540 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
34550 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
34560 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
34570 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
34580 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
34590 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
345a0 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 53 4b     if( CURSOR_SK
345b0 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
345c0 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 70 43  tate ){.      pC
345d0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
345e0 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
345f0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
34600 65 78 74 3c 30 20 29 20 72 65 74 75 72 6e 20 53  ext<0 ) return S
34610 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
34620 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
34630 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
34640 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
34650 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50  nit );.  if( !pP
34660 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
34670 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
34680 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  >ix;.    rc = mo
34690 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
346a0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
346b0 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b  l(pPage, idx)));
346c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
346d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
346e0 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
346f0 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
34700 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
34710 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20  r->ix==0 ){.    
34720 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
34730 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
34740 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
34750 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
34760 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
34770 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
34780 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
34790 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
347a0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
347b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
347c0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
347d0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
347e0 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4f  s & (BTCF_ValidO
347f0 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20  vfl))==0 );..   
34800 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20   pCur->ix--;.   
34810 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
34820 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 50  Page;.    if( pP
34830 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
34840 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
34850 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34860 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
34870 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Cur, 0);.    }el
34880 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
34890 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
348a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
348b0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
348c0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
348d0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
348e0 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
348f0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
34900 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
34910 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
34920 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a   || flags==1 );.
34930 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
34940 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a  ER( flags );  /*
34950 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32 20   Used in COMDB2 
34960 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20 53  but not native S
34970 51 4c 69 74 65 20 2a 2f 0a 20 20 70 43 75 72 2d  QLite */.  pCur-
34980 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
34990 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
349a0 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56  ValidOvfl|BTCF_V
349b0 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75  alidNKey);.  pCu
349c0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
349d0 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  0;.  if( pCur->e
349e0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
349f0 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e  LID.   || pCur->
34a00 69 78 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72  ix==0.   || pCur
34a10 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ->pPage->leaf==0
34a20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
34a30 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70   btreePrevious(p
34a40 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Cur);.  }.  pCur
34a50 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75 72 6e  ->ix--;.  return
34a60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
34a70 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
34a80 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
34a90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
34aa0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
34ab0 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
34ac0 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
34ad0 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
34ae0 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
34af0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
34b00 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
34b10 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
34b20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
34b30 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
34b40 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
34b50 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
34b60 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
34b70 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
34b80 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
34b90 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
34ba0 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
34bb0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
34bc0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
34bd0 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
34be0 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
34bf0 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
34c00 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
34c10 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  is set to NULL i
34c20 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
34c30 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  n error..**.** I
34c40 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
34c50 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
34c60 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72  0, then an effor
34c70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
34c80 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
34c90 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
34ca0 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
34cb0 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
34cc0 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
34cd0 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
34ce0 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
34cf0 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
34d00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
34d10 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
34d20 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
34d30 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
34d40 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
34d50 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65  the eMode parame
34d60 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45  ter is BTALLOC_E
34d70 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61  XACT and the nea
34d80 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a  rby page exists.
34d90 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
34da0 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
34db0 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
34dc0 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
34dd0 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65  ed.  If.** eMode
34de0 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74   is BTALLOC_LT t
34df0 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74  hen the page ret
34e00 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65  urned will be le
34e10 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
34e20 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66  .** to nearby if
34e30 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65   any such page e
34e40 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65  xists.  If eMode
34e50 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   is BTALLOC_ANY 
34e60 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72  then there.** ar
34e70 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  e no restriction
34e80 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20  s on which page 
34e90 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
34ea0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
34eb0 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
34ec0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
34ed0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
34ee0 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
34ef0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
34f00 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72  /* Store pointer
34f10 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
34f20 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  d page here */. 
34f30 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20   Pgno *pPgno,   
34f40 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
34f50 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
34f60 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
34f70 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20  nearby,         
34f80 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
34f90 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73  a page near this
34fa0 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f   one */.  u8 eMo
34fb0 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  de              
34fc0 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   /* BTALLOC_EXAC
34fd0 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f  T, BTALLOC_LT, o
34fe0 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f  r BTALLOC_ANY */
34ff0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
35000 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
35010 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
35020 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
35030 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
35040 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
35050 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
35060 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
35070 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
35080 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
35090 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
350a0 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
350b0 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
350c0 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
350d0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
350e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
350f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
35100 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
35110 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
35120 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54  ssert( eMode==BT
35130 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65  ALLOC_ANY || (ne
35140 61 72 62 79 3e 30 20 26 26 20 52 45 51 55 49 52  arby>0 && REQUIR
35150 45 5f 50 54 52 4d 41 50 20 29 20 29 3b 0a 20 20  E_PTRMAP ) );.  
35160 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
35170 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d  age1;.  mxPage =
35180 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
35190 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  pBt);.  /* EVIDE
351a0 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d  NCE-OF: R-05119-
351b0 30 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65  02637 The 4-byte
351c0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
351d0 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36  ger at offset 36
351e0 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f  .  ** stores sto
351f0 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  res the total nu
35200 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
35210 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a   the freelist. *
35220 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  /.  n = get4byte
35230 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
35240 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  36]);.  testcase
35250 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b  ( n==mxPage-1 );
35260 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65  .  if( n>=mxPage
35270 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
35280 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
35290 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e  PT;.  }..  /* En
352a0 73 75 72 65 20 70 61 67 65 20 31 20 69 73 20 77  sure page 1 is w
352b0 72 69 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  ritable. This fu
352c0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 65 69 74 68  nction will eith
352d0 65 72 20 63 68 61 6e 67 65 20 74 68 65 20 6e 75  er change the nu
352e0 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 70 61 67  mber.  ** of pag
352f0 65 73 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  es in the free-l
35300 69 73 74 20 6f 72 20 74 68 65 20 73 69 7a 65 20  ist or the size 
35310 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
35320 66 69 6c 65 2e 20 53 69 6e 63 65 20 62 6f 74 68  file. Since both
35330 0a 20 20 2a 2a 20 6f 66 20 74 68 65 73 65 20 6f  .  ** of these o
35340 70 65 72 61 74 69 6f 6e 73 20 69 6e 76 6f 6c 76  perations involv
35350 65 20 6d 6f 64 69 66 79 69 6e 67 20 70 61 67 65  e modifying page
35360 20 31 20 68 65 61 64 65 72 20 66 69 65 6c 64 73   1 header fields
35370 2c 20 70 61 67 65 20 31 0a 20 20 2a 2a 20 77 69  , page 1.  ** wi
35380 6c 6c 20 64 65 66 69 6e 69 74 65 6c 79 20 62 65  ll definitely be
35390 20 77 72 69 74 74 65 6e 20 62 79 20 74 68 69 73   written by this
353a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
353b0 20 74 68 69 73 20 69 73 20 61 6e 20 43 4f 4e 43   this is an CONC
353c0 55 52 52 45 4e 54 0a 20 20 2a 2a 20 74 72 61 6e  URRENT.  ** tran
353d0 73 61 63 74 69 6f 6e 2c 20 65 6e 73 75 72 65 20  saction, ensure 
353e0 74 68 65 20 42 74 72 65 65 50 74 72 6d 61 70 20  the BtreePtrmap 
353f0 73 74 72 75 63 74 75 72 65 20 68 61 73 20 62 65  structure has be
35400 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a  en allocated.  *
35410 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
35420 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
35430 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
35440 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
35450 63 3b 0a 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b  c;..  if( n>0 ){
35460 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
35470 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
35480 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
35490 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
354a0 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
354b0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
354c0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
354d0 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
354e0 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
354f0 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
35500 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61   */.    u32 nSea
35510 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  rch = 0;   /* Co
35520 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
35530 72 20 6f 66 20 73 65 61 72 63 68 20 61 74 74 65  r of search atte
35540 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20  mpts */.    .   
35550 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54   /* If eMode==BT
35560 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
35570 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
35580 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
35590 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
355a0 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
355b0 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
355c0 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
355d0 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
355e0 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
355f0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
35600 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
35610 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d  .    if( eMode==
35620 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b  BTALLOC_EXACT ){
35630 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49  .      assert( I
35640 53 41 55 54 4f 56 41 43 55 55 4d 21 3d 49 53 43  SAUTOVACUUM!=ISC
35650 4f 4e 43 55 52 52 45 4e 54 20 29 3b 0a 20 20 20  ONCURRENT );.   
35660 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
35670 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  UUM ){.        i
35680 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67  f( nearby<=mxPag
35690 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  e ){.          u
356a0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20  8 eType;.       
356b0 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62     assert( nearb
356c0 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  y>0 );.         
356d0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
356e0 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
356f0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
35700 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
35710 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
35720 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
35730 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
35740 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
35750 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
35760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35770 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
35780 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35790 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
357a0 65 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  e{.        searc
357b0 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
357c0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
357d0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
357e0 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72  LE ){.      sear
357f0 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
35800 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
35810 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
35820 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
35830 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
35840 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
35850 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
35860 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
35870 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
35880 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
35890 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
358a0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
358b0 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
358c0 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
358d0 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
358e0 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
358f0 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
35900 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
35910 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
35920 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
35930 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
35940 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
35950 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
35960 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
35970 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
35980 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
35990 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a  LOC_EXACT).    *
359a0 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67  * or until a pag
359b0 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61  e less than 'nea
359c0 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
359d0 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
359e0 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LT).    */.    d
359f0 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
35a00 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
35a10 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
35a20 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
35a30 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
35a40 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65  -01506-11053 The
35a50 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f   first integer o
35a60 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
35a70 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  nk page.        
35a80 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  ** is the page n
35a90 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
35aa0 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  t freelist trunk
35ab0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
35ac0 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  t or.        ** 
35ad0 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20  zero if this is 
35ae0 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73  the last freelis
35af0 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f  t trunk page. */
35b00 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
35b10 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
35b20 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
35b30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
35b40 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
35b50 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d  NCE-OF: R-59841-
35b60 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65  13798 The 4-byte
35b70 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
35b80 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32  ger at offset 32
35b90 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
35ba0 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  es the page numb
35bb0 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
35bc0 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65  page of the free
35bd0 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  list, or zero if
35be0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
35bf0 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
35c00 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54  y. */.        iT
35c10 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
35c20 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
35c30 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
35c40 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72     testcase( iTr
35c50 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
35c60 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e       if( iTrunk>
35c70 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63  mxPage || nSearc
35c80 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20  h++ > n ){.     
35c90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
35ca0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 72 65  ORRUPT_PGNO(pPre
35cb0 76 54 72 75 6e 6b 20 3f 20 70 50 72 65 76 54 72  vTrunk ? pPrevTr
35cc0 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a  unk->pgno : 1);.
35cd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
35ce0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
35cf0 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
35d00 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
35d10 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  k, 0);.      }. 
35d20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
35d30 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
35d40 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
35d50 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
35d60 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
35d70 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21   assert( pTrunk!
35d80 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
35d90 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  rt( pTrunk->aDat
35da0 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a  a!=0 );.      /*
35db0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
35dc0 31 33 35 32 33 2d 30 34 33 39 34 20 54 68 65 20  13523-04394 The 
35dd0 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f  second integer o
35de0 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
35df0 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  nk page.      **
35e00 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
35e10 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e  f leaf page poin
35e20 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20  ters to follow. 
35e30 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  */.      k = get
35e40 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
35e50 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20  Data[4]);.      
35e60 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61  if( k==0 && !sea
35e70 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  rchList ){.     
35e80 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
35e90 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e  has no leaves an
35ea0 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f  d the list is no
35eb0 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  t being searched
35ec0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  . .        ** So
35ed0 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75   extract the tru
35ee0 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61  nk page itself a
35ef0 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65  nd use it as the
35f00 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20   newly .        
35f10 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ** allocated pag
35f20 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
35f30 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d  ert( pPrevTrunk=
35f40 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
35f50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
35f60 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
35f70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
35f80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
35f90 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
35fa0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
35fb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50     }.        *pP
35fc0 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
35fd0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
35fe0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
35ff0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
36000 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
36010 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
36020 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  ;.        pTrunk
36030 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
36040 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
36050 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
36060 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
36070 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
36080 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
36090 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73   k>(u32)(pBt->us
360a0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20  ableSize/4 - 2) 
360b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
360c0 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20  lue of k is out 
360d0 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62  of range.  Datab
360e0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  ase corruption *
360f0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
36100 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
36110 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  NO(iTrunk);.    
36120 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
36130 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
36140 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36150 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
36160 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
36170 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
36180 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69     && (nearby==i
36190 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b  Trunk || (iTrunk
361a0 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65  <nearby && eMode
361b0 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a  ==BTALLOC_LE)) .
361c0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
361d0 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
361e0 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
361f0 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
36200 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
36210 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
36220 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
36230 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
36240 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
36250 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a      */.        *
36260 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
36270 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
36280 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
36290 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
362a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
362b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
362c0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
362d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
362e0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
362f0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
36300 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
36310 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
36320 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
36330 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
36340 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
36350 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
36360 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
36370 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
36380 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
36390 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
363a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
363b0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
363c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
363d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
363e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
363f0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
36400 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
36410 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
36420 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
36430 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
36440 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
36450 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
36460 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
36470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36480 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
36490 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
364a0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
364b0 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
364c0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
364d0 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
364e0 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
364f0 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
36500 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
36510 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
36520 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
36530 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
36540 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
36550 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
36560 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
36570 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
36580 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
36590 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
365a0 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  wTrunk>mxPage ){
365b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
365c0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
365d0 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a  T_PGNO(iTrunk);.
365e0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
365f0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
36600 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
36610 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
36620 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d  se( iNewTrunk==m
36630 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
36640 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
36650 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
36660 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
36670 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
36680 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
36690 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
366a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
366b0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
366c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
366d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
366e0 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54  PagerWrite(pNewT
366f0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
36700 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
36710 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36720 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
36730 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
36740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
36750 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
36760 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
36770 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
36780 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
36790 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
367a0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
367b0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
367c0 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
367d0 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
367e0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
367f0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
36800 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
36810 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
36820 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  *4);.          r
36830 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
36840 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
36850 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
36860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
36870 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
36880 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
36890 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
368a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
368b0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
368c0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
368d0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
368e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
368f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36900 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
36910 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
36920 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
36930 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
36940 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
36950 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
36960 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
36970 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
36980 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
36990 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75  Data[0], iNewTru
369a0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
369b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
369c0 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
369d0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
369e0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
369f0 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
36a00 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
36a10 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66  o, n-1));.#endif
36a20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
36a30 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   k>0 ){.        
36a40 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
36a50 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
36a60 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
36a70 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
36a80 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
36a90 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
36aa0 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
36ab0 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
36ac0 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
36ad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
36ae0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c   i;.          cl
36af0 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
36b00 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d       if( eMode==
36b10 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
36b20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
36b30 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
36b40 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67              iPag
36b50 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
36b60 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20  ata[8+i*4]);.   
36b70 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
36b80 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a  Page<=nearby ){.
36b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ba0 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
36bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
36bc0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
36bd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
36be0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
36bf0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
36c00 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
36c10 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69       dist = sqli
36c20 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
36c30 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
36c40 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
36c50 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
36c60 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
36c70 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
36c80 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
36c90 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
36ca0 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
36cb0 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
36cc0 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
36cd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
36ce0 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
36cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
36d00 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
36d10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36d30 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
36d40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
36d50 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
36d60 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
36d70 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
36d80 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
36d90 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
36da0 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
36db0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
36dc0 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20  f( iPage>mxPage 
36dd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
36de0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
36df0 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20  _PGNO(iTrunk);. 
36e00 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
36e10 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
36e20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36e30 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
36e40 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
36e50 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
36e60 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
36e70 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62  || (iPage==nearb
36e80 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72  y || (iPage<near
36e90 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41  by && eMode==BTA
36ea0 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20  LLOC_LE)) .     
36eb0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
36ec0 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20  int noContent;. 
36ed0 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20           *pPgno 
36ee0 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  = iPage;.       
36ef0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
36f00 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
36f10 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
36f20 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
36f30 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
36f40 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
36f50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
36f60 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
36f70 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
36f80 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
36f90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
36fa0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
36fb0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
36fc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
36fd0 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c  c ) goto end_all
36fe0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
36ff0 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
37000 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
37010 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
37020 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
37030 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
37040 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
37050 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
37060 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
37070 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f  1);.          no
37080 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65  Content = !btree
37090 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  GetHasContent(pB
370a0 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45  t, *pPgno)? PAGE
370b0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
370c0 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  : 0;.          r
370d0 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
370e0 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  edPage(pBt, *pPg
370f0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
37100 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ntent);.        
37110 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37120 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
37130 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
37140 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
37150 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
37160 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
37170 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
37180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
37190 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
371a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
371b0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
371c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
371d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
371e0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
371f0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
37200 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
37210 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
37220 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54  k);.      pPrevT
37230 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77  runk = 0;.    }w
37240 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74  hile( searchList
37250 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
37260 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
37270 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
37280 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e  eelist, so appen
37290 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  d a new page to 
372a0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
372b0 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
372c0 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c  *.    ** Normall
372d0 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c  y, new pages all
372e0 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62  ocated by this b
372f0 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75  lock can be requ
37300 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20  ested from the. 
37310 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65     ** pager laye
37320 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63  r with the 'no-c
37330 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74  ontent' flag set
37340 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20  . This prevents 
37350 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
37360 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
37370 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63  read the pages c
37380 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
37390 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
373a0 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
373b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
373c0 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65   already run one
373d0 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65   or more increme
373e0 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20  ntal-vacuum.    
373f0 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74  ** steps, then t
37400 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61  he page we are a
37410 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  bout to allocate
37420 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e   may contain con
37430 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74  tent.    ** that
37440 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
37450 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
37460 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ollback. In this
37470 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a   case, do.    **
37480 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d   not set the no-
37490 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68  content flag. Th
374a0 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61  is causes the pa
374b0 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20  ger to load and 
374c0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74  journal.    ** t
374d0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
374e0 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f  content before o
374f0 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  verwriting it.. 
37500 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
37510 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
37520 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c   will not actual
37530 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ly attempt to lo
37540 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20  ad or journal . 
37550 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f     ** content fo
37560 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  r any page that 
37570 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20  really does lie 
37580 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
37590 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
375a0 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b   ** file on disk
375b0 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73  . So the effects
375c0 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68   of disabling th
375d0 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74  e no-content opt
375e0 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  imization.    **
375f0 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e   here are confin
37600 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65  ed to those page
37610 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65  s that lie betwe
37620 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  en the end of th
37630 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
37640 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20  e image and the 
37650 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
37660 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
37670 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74  .    int bNoCont
37680 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f  ent = (0==IfNotO
37690 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
376a0 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f  uncate))? PAGER_
376b0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b  GET_NOCONTENT:0;
376c0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
376d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
376e0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
376f0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
37700 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
37710 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
37720 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
37730 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
37740 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e  AGE(pBt) ) pBt->
37750 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65  nPage++;..#ifnde
37760 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
37770 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
37780 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
37790 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
377a0 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  E(pBt, pBt->nPag
377b0 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
377c0 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
377d0 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
377e0 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
377f0 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
37800 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
37810 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
37820 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
37830 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
37840 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
37850 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
37860 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
37870 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
37880 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
37890 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
378a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20   MemPage *pPg = 
378b0 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  0;.      TRACE((
378c0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
378d0 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
378e0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
378f0 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65  )\n", pBt->nPage
37900 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
37910 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45  ( pBt->nPage!=PE
37920 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
37930 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
37940 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
37950 64 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e  dPage(pBt, pBt->
37960 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f  nPage, &pPg, bNo
37970 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
37980 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37990 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
379a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
379b0 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
379c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
379d0 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
379e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
379f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
37a00 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
37a10 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
37a20 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
37a30 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
37a40 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
37a50 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
37a60 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
37a70 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
37a80 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
37a90 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
37aa0 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
37ab0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
37ac0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
37ad0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
37ae0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
37af0 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
37b00 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
37b10 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
37b20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
37b30 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
37b40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
37b50 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
37b60 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
37b70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
37b80 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
37b90 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
37ba0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
37bb0 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
37bc0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
37bd0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
37be0 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
37bf0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
37c00 50 54 5f 44 42 20 7c 7c 20 2a 70 50 67 6e 6f 21  PT_DB || *pPgno!
37c10 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
37c20 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f  GE(pBt) );..end_
37c30 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20  allocate_page:. 
37c40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
37c50 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  unk);.  releaseP
37c60 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
37c70 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
37c80 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
37c90 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
37ca0 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
37cb0 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20  pDbPage)<=1 );. 
37cc0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
37cd0 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61  ITE_OK || (*ppPa
37ce0 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
37cf0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
37d00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
37d10 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
37d20 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20   add page iPage 
37d30 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
37d40 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20  file free-list. 
37d50 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
37d60 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  d that the page 
37d70 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
37d80 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65   part of the fre
37d90 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  e-list..**.** Th
37da0 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
37db0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
37dc0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
37dd0 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e  nction is option
37de0 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61  al..** If the ca
37df0 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20  ller happens to 
37e00 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74  have a pointer t
37e10 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
37e20 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70  ject .** corresp
37e30 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69  onding to page i
37e40 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d  Page handy, it m
37e50 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68  ay pass it as th
37e60 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20  e second value. 
37e70 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
37e80 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e  t may pass NULL.
37e90 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e  .**.** If a poin
37ea0 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65  ter to a MemPage
37eb0 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65   object is passe
37ec0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
37ed0 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73  argument,.** its
37ee0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
37ef0 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20   is not altered 
37f00 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
37f10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
37f20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72  freePage2(BtShar
37f30 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65  ed *pBt, MemPage
37f40 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f   *pMemPage, Pgno
37f50 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61   iPage){.  MemPa
37f60 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20  ge *pTrunk = 0; 
37f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37f80 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  * Free-list trun
37f90 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  k page */.  Pgno
37fa0 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20   iTrunk = 0;    
37fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37fc0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
37fd0 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  f free-list trun
37fe0 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d  k page */ .  Mem
37ff0 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
38000 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20  Bt->pPage1;     
38010 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65   /* Local refere
38020 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
38030 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
38040 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
38050 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62         /* Page b
38060 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20  eing freed. May 
38070 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e  be NULL. */.  in
38080 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
38090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
380a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
380b0 20 2a 2f 0a 20 20 75 33 32 20 6e 46 72 65 65 3b   */.  u32 nFree;
380c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
380d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
380e0 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  tial number of p
380f0 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73  ages on free-lis
38100 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
38110 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
38120 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
38130 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
38140 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e  UPT_DB || iPage>
38150 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
38160 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d  pMemPage || pMem
38170 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67  Page->pgno==iPag
38180 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67  e );..  if( iPag
38190 65 3c 32 20 7c 7c 20 69 50 61 67 65 3e 70 42 74  e<2 || iPage>pBt
381a0 2d 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 72  ->nPage ){.    r
381b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
381c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
381d0 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b   if( pMemPage ){
381e0 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65  .    pPage = pMe
381f0 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74  mPage;.    sqlit
38200 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65  e3PagerRef(pPage
38210 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65  ->pDbPage);.  }e
38220 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  lse{.    pPage =
38230 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
38240 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
38250 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
38260 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
38270 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
38280 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
38290 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
382a0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
382b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
382c0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46  eepage_out;.  nF
382d0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
382e0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
382f0 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ]);.  put4byte(&
38300 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
38310 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20  ], nFree+1);..  
38320 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
38330 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
38340 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  ELETE ){.    /* 
38350 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  If the secure_de
38360 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  lete option is e
38370 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  nabled, then.   
38380 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
38390 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
383a0 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
383b0 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a  ith zeros..    *
383c0 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67  /.    if( (!pPag
383d0 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65  e && ((rc = btre
383e0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
383f0 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
38400 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20  !=0) ).     ||  
38410 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d            ((rc =
38420 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
38430 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
38440 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20  e))!=0).    ){. 
38450 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
38460 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
38470 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
38480 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
38490 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize)