/ Hex Artifact Content
Login

Artifact 021c960a9eac0630ef9b34e5277c47218d07e25141f1da43e33472be2e63ec28:


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: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
8bd0: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
8be0: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
8bf0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
8c00: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
8c10: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
8c20: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
8c30: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
8c40: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
8c50: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
8c60: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
8c70: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
8c80: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
8c90: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
8ca0: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73  Cur->nKey, 0, &s
8cb0: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
8cc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
8ce0: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
8cf0: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
8d00: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
8d10: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
8d20: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
8d30: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
8d40: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
8d50: 20 69 66 28 20 73 6b 69 70 4e 65 78 74 20 29 20   if( skipNext ) 
8d60: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
8d70: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69   skipNext;.    i
8d80: 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
8d90: 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  t && pCur->eStat
8da0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
8db0: 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
8dc0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53  State = CURSOR_S
8dd0: 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20  KIPNEXT;.    }. 
8de0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8df0: 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f  }..#define resto
8e00: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
8e10: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
8e20: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
8e30: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
8e40: 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65      btreeRestore
8e50: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
8e60: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
8e70: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
8e80: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
8e90: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
8ea0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
8eb0: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77  m the position w
8ec0: 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c  here.** it was l
8ed0: 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68  ast placed, or h
8ee0: 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61  as been invalida
8ef0: 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  ted for any othe
8f00: 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72  r reason..** Cur
8f10: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
8f20: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
8f30: 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  are pointing at 
8f40: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a  is deleted out.*
8f50: 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  * from under the
8f60: 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  m, for example. 
8f70: 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c   Cursor might al
8f80: 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72  so move if a btr
8f90: 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e  ee.** is rebalan
8fa0: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ced..**.** Calli
8fb0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
8fc0: 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73  with a NULL curs
8fd0: 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  or pointer retur
8fe0: 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  ns false..**.** 
8ff0: 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65  Use the separate
9000: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
9010: 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75  sorRestore() rou
9020: 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20  tine to restore 
9030: 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b  a cursor.** back
9040: 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67   to where it oug
9050: 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73  ht to be if this
9060: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
9070: 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
9080: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
9090: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
90a0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
90b0: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
90c0: 4c 49 47 4e 4d 45 4e 54 28 70 43 75 72 29 0a 20  LIGNMENT(pCur). 
90d0: 20 20 20 20 20 20 7c 7c 20 70 43 75 72 3d 3d 73        || pCur==s
90e0: 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65 56  qlite3BtreeFakeV
90f0: 61 6c 69 64 43 75 72 73 6f 72 28 29 20 29 3b 0a  alidCursor() );.
9100: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
9110: 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53 74  of(BtCursor, eSt
9120: 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ate)==0 );.  ass
9130: 65 72 74 28 20 73 69 7a 65 6f 66 28 70 43 75 72  ert( sizeof(pCur
9140: 2d 3e 65 53 74 61 74 65 29 3d 3d 31 20 29 3b 0a  ->eState)==1 );.
9150: 20 20 72 65 74 75 72 6e 20 43 55 52 53 4f 52 5f    return CURSOR_
9160: 56 41 4c 49 44 20 21 3d 20 2a 28 75 38 2a 29 70  VALID != *(u8*)p
9170: 43 75 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Cur;.}../*.** Re
9180: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
9190: 6f 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f  o a fake BtCurso
91a0: 72 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69  r object that wi
91b0: 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72  ll always answer
91c0: 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65  .** false to the
91d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
91e0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f  sorHasMoved() ro
91f0: 75 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68  utine above.  Th
9200: 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72  e fake.** cursor
9210: 20 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e   returned must n
9220: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
9230: 61 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20  any other Btree 
9240: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74  interface..*/.Bt
9250: 43 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42  Cursor *sqlite3B
9260: 74 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72  treeFakeValidCur
9270: 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  sor(void){.  sta
9280: 74 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f  tic u8 fakeCurso
9290: 72 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  r = CURSOR_VALID
92a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
92b0: 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65  etof(BtCursor, e
92c0: 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72  State)==0 );.  r
92d0: 65 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a  eturn (BtCursor*
92e0: 29 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a  )&fakeCursor;.}.
92f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
9300: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
9310: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
9320: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
9330: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
9340: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
9350: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
9360: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
9370: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
9380: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
9390: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
93a0: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
93b0: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
93c0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
93d0: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
93e0: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
93f0: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
9400: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
9410: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
9420: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
9430: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
9440: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
9450: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
9460: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
9470: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
9480: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
9490: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
94a0: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
94b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
94c0: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
94d0: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
94e0: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
94f0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
9500: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
9510: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
9520: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
9530: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
9540: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
9550: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
9560: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
9570: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
9580: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
9590: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
95a0: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
95b0: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
95c0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
95d0: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
95e0: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
95f0: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
9600: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
9610: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
9620: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
9630: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
9640: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
9650: 65 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  e{.    *pDiffere
9660: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
9670: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9680: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
9690: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
96a0: 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72  R_HINTS./*.** Pr
96b0: 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74  ovide hints to t
96c0: 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
96d0: 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20  particular hint 
96e0: 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74  given (and the t
96f0: 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65  ype.** and numbe
9700: 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73  r of the varargs
9710: 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20   parameters) is 
9720: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
9730: 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70  e eHintType.** p
9740: 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74  arameter.  See t
9750: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  he definitions o
9760: 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54  f the BTREE_HINT
9770: 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65  _* macros for de
9780: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
9790: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
97a0: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
97b0: 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54  pCur, int eHintT
97c0: 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20  ype, ...){.  /* 
97d0: 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73  Used only by sys
97e0: 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74  tem that substit
97f0: 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74  ute their own st
9800: 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  orage engine */.
9810: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
9820: 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e  Provide flag hin
9830: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
9840: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9850: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
9860: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
9870: 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78  pCur, unsigned x
9880: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d  ){.  assert( x==
9890: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c  BTREE_SEEK_EQ ||
98a0: 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f   x==BTREE_BULKLO
98b0: 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20  AD || x==0 );.  
98c0: 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b  pCur->hints = x;
98d0: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
98e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
98f0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
9900: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
9910: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
9920: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
9930: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
9940: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
9950: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
9960: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
9970: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
9980: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
9990: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
99a0: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
99b0: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
99c0: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
99d0: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
99e0: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
99f0: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
9a00: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
9a10: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
9a20: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
9a30: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
9a40: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
9a50: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
9a60: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
9a70: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
9a80: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
9a90: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
9aa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9ab0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
9ac0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
9ad0: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
9ae0: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
9af0: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
9b00: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
9b10: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
9b20: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
9b30: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
9b40: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
9b50: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
9b60: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
9b70: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
9b80: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
9b90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
9ba0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
9bb0: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
9bc0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
9bd0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9be0: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
9bf0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
9c00: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
9c10: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
9c20: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
9c30: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
9c40: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
9c50: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
9c60: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
9c70: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
9c80: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
9c90: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
9ca0: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
9cb0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
9cc0: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
9cd0: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
9ce0: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
9cf0: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
9d00: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
9d10: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
9d20: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
9d30: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
9d40: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
9d50: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
9d60: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
9d70: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
9d80: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
9d90: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
9da0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
9db0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
9dc0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
9dd0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
9de0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
9df0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
9e00: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
9e10: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
9e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
9e30: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
9e40: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
9e50: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
9e60: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
9e70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9e80: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
9e90: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
9ea0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
9eb0: 62 65 72 20 69 73 20 6e 65 76 65 72 20 61 64 64  ber is never add
9ec0: 65 64 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  ed to a pointer-
9ed0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
9ee0: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
9ef0: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
9f00: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
9f10: 74 29 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  t)) );..#ifndef 
9f20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
9f30: 55 52 52 45 4e 54 0a 20 20 69 66 28 20 70 42 74  URRENT.  if( pBt
9f40: 2d 3e 70 4d 61 70 20 29 7b 0a 20 20 20 20 2a 70  ->pMap ){.    *p
9f50: 52 43 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70  RC = btreePtrmap
9f60: 53 74 6f 72 65 28 70 42 74 2c 20 6b 65 79 2c 20  Store(pBt, key, 
9f70: 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 3b 0a  eType, parent);.
9f80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9f90: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
9fa0: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
9fb0: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
9fc0: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
9fd0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9fe0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
9ff0: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
a000: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
a010: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
a020: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
a030: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
a040: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
a050: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
a060: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a070: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
a080: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
a090: 20 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33   ((char*)sqlite3
a0a0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
a0b0: 62 50 61 67 65 29 29 5b 30 5d 21 3d 30 20 29 7b  bPage))[0]!=0 ){
a0c0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
a0d0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 65 78  t byte of the ex
a0e0: 74 72 61 20 64 61 74 61 20 69 73 20 74 68 65 20  tra data is the 
a0f0: 4d 65 6d 50 61 67 65 2e 69 73 49 6e 69 74 20 62  MemPage.isInit b
a100: 79 74 65 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  yte..    ** If t
a110: 68 61 74 20 62 79 74 65 20 69 73 20 73 65 74 2c  hat byte is set,
a120: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 70   it means this p
a130: 61 67 65 20 69 73 20 61 6c 73 6f 20 62 65 69 6e  age is also bein
a140: 67 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 61 73  g used.    ** as
a150: 20 61 20 62 74 72 65 65 20 70 61 67 65 2e 20 2a   a btree page. *
a160: 2f 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  /.    *pRC = SQL
a170: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a180: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61  ;.    goto ptrma
a190: 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 6f 66  p_exit;.  }.  of
a1a0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
a1b0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
a1c0: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
a1d0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
a1e0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
a1f0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
a200: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
a210: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
a220: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
a230: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
a240: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
a250: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
a260: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
a270: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
a280: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
a290: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
a2a0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
a2b0: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
a2c0: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
a2d0: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
a2e0: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
a2f0: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a   parent));.    *
a300: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
a310: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
a320: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
a330: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a340: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
a350: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
a360: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
a370: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
a380: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
a390: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
a3a0: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
a3b0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
a3c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
a3d0: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
a3e0: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
a3f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a400: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
a410: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
a420: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
a430: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
a440: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
a450: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
a460: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
a470: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
a480: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
a490: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
a4a0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
a4b0: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
a4c0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
a4d0: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
a4e0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
a4f0: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
a500: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
a510: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
a520: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
a530: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
a540: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
a550: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
a560: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
a570: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
a580: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
a590: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
a5a0: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
a5b0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
a5c0: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
a5d0: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
a5e0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
a5f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
a600: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
a610: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
a620: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
a630: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
a640: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
a650: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
a660: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
a670: 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
a680: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  rc!=0 ){.    ret
a690: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
a6a0: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
a6b0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
a6c0: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f  a(pDbPage);..  o
a6d0: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
a6e0: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
a6f0: 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66  , key);.  if( of
a700: 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71  fset<0 ){.    sq
a710: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
a720: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65  pDbPage);.    re
a730: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a740: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
a750: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c  assert( offset <
a760: 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  = (int)pBt->usab
a770: 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73  leSize-5 );.  as
a780: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
a790: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
a7a0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
a7b0: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
a7c0: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
a7d0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
a7e0: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
a7f0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
a800: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
a810: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
a820: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
a830: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 50  _CORRUPT_PGNO(iP
a840: 74 72 6d 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  trmap);.  return
a850: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
a860: 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e  else /* if defin
a870: 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed SQLITE_OMIT_A
a880: 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23  UTOVACUUM */.  #
a890: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
a8a0: 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23  (w,x,y,z,rc).  #
a8b0: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74  define ptrmapGet
a8c0: 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45  (w,x,y,z) SQLITE
a8d0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74  _OK.  #define pt
a8e0: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78  rmapPutOvflPtr(x
a8f0: 2c 20 79 2c 20 7a 2c 20 72 63 29 0a 23 65 6e 64  , y, z, rc).#end
a900: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
a910: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
a920: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
a930: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
a940: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
a950: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
a960: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
a970: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
a980: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
a990: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
a9a0: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64  tent..**.** find
a9b0: 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f  CellPastPtr() do
a9c0: 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65  es the same exce
a9d0: 70 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74  pt it skips past
a9e0: 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20   the initial.** 
a9f0: 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
aa00: 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e  nter found on in
aa10: 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66  terior pages, if
aa20: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a   there is one..*
aa30: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
aa40: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
aa50: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
aa60: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
aa70: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
aa80: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
aa90: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
aaa0: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
aab0: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
aac0: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
aad0: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
aae0: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
aaf0: 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20  PastPtr(P,I) \. 
ab00: 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74   ((P)->aDataOfst
ab10: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
ab20: 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67  e & get2byteAlig
ab30: 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49  ned(&(P)->aCellI
ab40: 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f  dx[2*(I)]))).../
ab50: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d  *.** This is com
ab60: 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73  mon tail process
ab70: 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72  ing for btreePar
ab80: 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a  seCellPtr() and.
ab90: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
aba0: 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20  lPtrIndex() for 
abb0: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
abc0: 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  e cell does not 
abd0: 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20  fit entirely.** 
abe0: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72  on a single B-tr
abf0: 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e  ee page.  Make n
ac00: 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d  ecessary adjustm
ac10: 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c  ents to the Cell
ac20: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
ac30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
ac40: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
ac50: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
ac60: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
ac70: 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65  rflow(.  MemPage
ac80: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
ac90: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
aca0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
acb0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
acc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
acd0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
ace0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
acf0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
ad00: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
ad10: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
ad20: 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .){.  /* If the 
ad30: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
ad40: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
ad50: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
ad60: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  e, we have.  ** 
ad70: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
ad80: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
ad90: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
ada0: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
adb0: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
adc0: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
add0: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
ade0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
adf0: 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65  nused.  ** space
ae00: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
ae10: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
ae20: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
ae30: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a  ocal storage.  *
ae40: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
ae50: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
ae60: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61  al..  **.  ** Wa
ae70: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
ae80: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
ae90: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
aea0: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
aeb0: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
aec0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
aed0: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
aee0: 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  mat..  */.  int 
aef0: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
af00: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
af10: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
af20: 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  ally */.  int ma
af30: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
af40: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
af50: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
af60: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70  ly */.  int surp
af70: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
af80: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
af90: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
afa0: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e  torage */..  min
afb0: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
afc0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f  inLocal;.  maxLo
afd0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
afe0: 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73  Local;.  surplus
aff0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70   = minLocal + (p
b000: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d  Info->nPayload -
b010: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
b020: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
b030: 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73  ze-4);.  testcas
b040: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
b050: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
b060: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
b070: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
b080: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
b090: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66  ocal ){.    pInf
b0a0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
b0b0: 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73  )surplus;.  }els
b0c0: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  e{.    pInfo->nL
b0d0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
b0e0: 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  ocal;.  }.  pInf
b0f0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29  o->nSize = (u16)
b100: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
b110: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
b120: 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d   - pCell) + 4;.}
b130: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
b140: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
b150: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  re implementatio
b160: 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ns of the MemPag
b170: 65 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a  e.xParseCell().*
b180: 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20  * method..**.** 
b190: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
b1a0: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
b1b0: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
b1c0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
b1d0: 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  *.** btreeParseC
b1e0: 65 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20 20  ellPtr()        
b1f0: 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65  =>   table btree
b200: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62   leaf nodes.** b
b210: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50  treeParseCellNoP
b220: 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20 74  ayload()  =>   t
b230: 61 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65 72  able btree inter
b240: 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72  nal nodes.** btr
b250: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
b260: 64 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e 64  dex()   =>   ind
b270: 65 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a  ex btree nodes.*
b280: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6c  *.** There is al
b290: 73 6f 20 61 20 77 72 61 70 70 65 72 20 66 75 6e  so a wrapper fun
b2a0: 63 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73 65  ction btreeParse
b2b0: 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b  Cell() that work
b2c0: 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d  s for.** all Mem
b2d0: 50 61 67 65 20 74 79 70 65 73 20 61 6e 64 20 74  Page types and t
b2e0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
b2f0: 68 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65 78  he cell by index
b300: 20 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20   rather than.** 
b310: 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  by pointer..*/.s
b320: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
b330: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
b340: 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67 65  yload(.  MemPage
b350: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
b360: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
b370: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
b380: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
b390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
b3a0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
b3b0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
b3c0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
b3d0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
b3e0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
b3f0: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  .){.  assert( sq
b400: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b410: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b420: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
b430: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
b440: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b450: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
b460: 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==4 );.#ifndef S
b470: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e  QLITE_DEBUG.  UN
b480: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
b490: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Page);.#endif.  
b4a0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
b4b0: 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70 43   + getVarint(&pC
b4c0: 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70  ell[4], (u64*)&p
b4d0: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70  Info->nKey);.  p
b4e0: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
b4f0: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f   0;.  pInfo->nLo
b500: 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f  cal = 0;.  pInfo
b510: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->pPayload = 0;.
b520: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74    return;.}.stat
b530: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
b540: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
b550: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
b560: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
b570: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
b580: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
b590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b5a0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
b5b0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
b5c0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
b5d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
b5e0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
b5f0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
b600: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
b610: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
b620: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
b630: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
b640: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
b650: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
b660: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
b670: 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20 20  */.  u64 iKey;  
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b690: 45 78 74 72 61 63 74 65 64 20 4b 65 79 20 76 61  Extracted Key va
b6a0: 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lue */..  assert
b6b0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b6c0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
b6d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
b6e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
b6f0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
b700: 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  af==1 );.  asser
b710: 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
b720: 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74  Leaf );.  assert
b730: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
b740: 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49  rSize==0 );.  pI
b750: 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20  ter = pCell;..  
b760: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
b770: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
b780: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
b790: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
b7a0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
b7b0: 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  Iter, nPayload);
b7c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
b7d0: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
b7e0: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
b7f0: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
b800: 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65  nPayload = *pIte
b810: 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  r;.  if( nPayloa
b820: 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  d>=0x80 ){.    u
b830: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
b840: 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  [8];.    nPayloa
b850: 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  d &= 0x7f;.    d
b860: 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  o{.      nPayloa
b870: 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37  d = (nPayload<<7
b880: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
b890: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
b8a0: 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38  e( (*pIter)>=0x8
b8b0: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
b8c0: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
b8d0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  ;..  /* The next
b8e0: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69   block of code i
b8f0: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a  s equivalent to:
b900: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70  .  **.  **     p
b910: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
b920: 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26  t(pIter, (u64*)&
b930: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
b940: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65  **.  ** The code
b950: 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61   is inlined to a
b960: 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20  void a function 
b970: 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65  call..  */.  iKe
b980: 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  y = *pIter;.  if
b990: 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a  ( iKey>=0x80 ){.
b9a0: 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26      u8 *pEnd = &
b9b0: 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b  pIter[7];.    iK
b9c0: 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ey &= 0x7f;.    
b9d0: 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20  while(1){.      
b9e0: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29  iKey = (iKey<<7)
b9f0: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
ba00: 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  x7f);.      if( 
ba10: 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20  (*pIter)<0x80 ) 
ba20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
ba30: 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a   pIter>=pEnd ){.
ba40: 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28          iKey = (
ba50: 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49  iKey<<8) | *++pI
ba60: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ter;.        bre
ba70: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
ba80: 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  }.  }.  pIter++;
ba90: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20  ..  pInfo->nKey 
baa0: 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a  = *(i64*)&iKey;.
bab0: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
bac0: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
bad0: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
bae0: 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63  = pIter;.  testc
baf0: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
bb00: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
bb10: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
bb20: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
bb30: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
bb40: 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
bb50: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
bb60: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
bb70: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
bb80: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
bb90: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
bba0: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
bbb0: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
bbc0: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
bbd0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
bbe0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
bbf0: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31  = nPayload + (u1
bc00: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
bc10: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f  );.    if( pInfo
bc20: 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66  ->nSize<4 ) pInf
bc30: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
bc40: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
bc50: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
bc60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74  .  }else{.    bt
bc70: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
bc80: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
bc90: 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  w(pPage, pCell, 
bca0: 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74  pInfo);.  }.}.st
bcb0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
bcc0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
bcd0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
bce0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
bcf0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
bd00: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
bd10: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
bd20: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
bd30: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
bd40: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
bd50: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
bd60: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
bd70: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
bd80: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
bd90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
bda0: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
bdb0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
bdc0: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
bdd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bde0: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
bdf0: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
be00: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
be10: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
be20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
be30: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
be40: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
be50: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
be60: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
be70: 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  KeyLeaf==0 );.  
be80: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
be90: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
bea0: 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
beb0: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
bec0: 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29  nPayload>=0x80 )
bed0: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
bee0: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
bef0: 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66  nPayload &= 0x7f
bf00: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
bf10: 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79  nPayload = (nPay
bf20: 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  load<<7) | (*++p
bf30: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
bf40: 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65    }while( *(pIte
bf50: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
bf60: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
bf70: 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f  pIter++;.  pInfo
bf80: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
bf90: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79  d;.  pInfo->nPay
bfa0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
bfb0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
bfc0: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
bfd0: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
bfe0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
bff0: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
c000: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
c010: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
c020: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
c030: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
c040: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
c050: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
c060: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
c070: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
c080: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
c090: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
c0a0: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
c0b0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
c0c0: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
c0d0: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
c0e0: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
c0f0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
c100: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
c110: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
c120: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
c130: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
c140: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
c150: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
c160: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
c170: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
c180: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
c190: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
c1a0: 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  eeParseCell(.  M
c1b0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
c1c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
c1d0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
c1e0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
c1f0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
c200: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
c210: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
c220: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
c230: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
c240: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
c250: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
c260: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
c270: 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64  Cell(pPage, find
c280: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
c290: 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  l), pInfo);.}../
c2a0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
c2b0: 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
c2c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
c2d0: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78  of the MemPage.x
c2e0: 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68  CellSize.** meth
c2f0: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74  od..**.** Comput
c300: 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  e the total numb
c310: 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  er of bytes that
c320: 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e   a Cell needs in
c330: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
c340: 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74  a area of the bt
c350: 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72  ree-page.  The r
c360: 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63  eturn number inc
c370: 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a  ludes the cell.*
c380: 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e  * data header an
c390: 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c  d the local payl
c3a0: 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  oad, but not any
c3b0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f   overflow page o
c3c0: 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75  r.** the space u
c3d0: 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20  sed by the cell 
c3e0: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63  pointer..**.** c
c3f0: 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
c400: 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61  oad()    =>   ta
c410: 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ble internal nod
c420: 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74  es.** cellSizePt
c430: 72 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  r()             
c440: 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e  =>   all index n
c450: 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61  odes & table lea
c460: 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69  f nodes.*/.stati
c470: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
c480: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
c490: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
c4a0: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
c4b0: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
c4c0: 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20  PtrSize; /* For 
c4d0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
c4e0: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
c4f0: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
c520: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
c530: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a  nt */.  u32 nSiz
c540: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74   /* Size value t
c570: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66  o return */..#if
c580: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
c590: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
c5a0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
c5b0: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
c5c0: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
c5d0: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
c5e0: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
c5f0: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
c600: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
c610: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
c620: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
c630: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
c640: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
c650: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
c660: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
c670: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
c680: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
c690: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
c6a0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
c6b0: 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d  uginfo;.  pPage-
c6c0: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
c6d0: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
c6e0: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
c6f0: 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b   nSize = *pIter;
c700: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78  .  if( nSize>=0x
c710: 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  80 ){.    pEnd =
c720: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
c730: 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20  nSize &= 0x7f;. 
c740: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69     do{.      nSi
c750: 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20  ze = (nSize<<7) 
c760: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
c770: 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  7f);.    }while(
c780: 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20   *(pIter)>=0x80 
c790: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
c7a0: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
c7b0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
c7c0: 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49  Key ){.    /* pI
c7d0: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
c7e0: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
c7f0: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
c800: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
c810: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
c820: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
c830: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
c840: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
c850: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
c860: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
c870: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
c880: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
c890: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
c8a0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
c8b0: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
c8c0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74  <pEnd );.  }.  t
c8d0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
c8e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
c8f0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
c900: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
c910: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
c920: 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d   nSize<=pPage->m
c930: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e  axLocal ){.    n
c940: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
c950: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
c960: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20    if( nSize<4 ) 
c970: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c  nSize = 4;.  }el
c980: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c  se{.    int minL
c990: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
c9a0: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
c9b0: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
c9c0: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
c9d0: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
c9e0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
c9f0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
ca00: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
ca10: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
ca20: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
ca30: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
ca40: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
ca50: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
ca60: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
ca70: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
ca80: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
ca90: 34 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  4 + (u16)(pIter 
caa0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20  - pCell);.  }.  
cab0: 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64  assert( nSize==d
cac0: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c  ebuginfo.nSize |
cad0: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
cae0: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53    return (u16)nS
caf0: 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31  ize;.}.static u1
cb00: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  6 cellSizePtrNoP
cb10: 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a  ayload(MemPage *
cb20: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
cb30: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
cb40: 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46   pCell + 4; /* F
cb50: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
cb60: 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a  bytes of pCell *
cb70: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20  /.  u8 *pEnd;   
cb80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
cb90: 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72  d mark for a var
cba0: 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  int */..#ifdef S
cbb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
cbc0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
cbd0: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
cbe0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
cbf0: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
cc00: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
cc10: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
cc20: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
cc30: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
cc40: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
cc50: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
cc60: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
cc70: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
cc80: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
cc90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
cca0: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
ccb0: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
ccc0: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
ccd0: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
cce0: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
ccf0: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
cd00: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
cd10: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
cd20: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
cd30: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
cd40: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
cd50: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20  dPtrSize==4 );. 
cd60: 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20   pEnd = pIter + 
cd70: 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49  9;.  while( (*pI
cd80: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
cd90: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61  Iter<pEnd );.  a
cda0: 73 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f  ssert( debuginfo
cdb0: 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49  .nSize==(u16)(pI
cdc0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20  ter - pCell) || 
cdd0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
cde0: 72 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74  return (u16)(pIt
cdf0: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a  er - pCell);.}..
ce00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
ce10: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
ce20: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
ce30: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
ce40: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
ce50: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
ce60: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
ce70: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
ce80: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
ce90: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
cea0: 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  rn pPage->xCellS
ceb0: 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ize(pPage, findC
cec0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
ced0: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ));.}.#endif..#i
cee0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cef0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
cf00: 2a 2a 20 54 68 65 20 63 65 6c 6c 20 70 43 65 6c  ** The cell pCel
cf10: 6c 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  l is currently p
cf20: 61 72 74 20 6f 66 20 70 61 67 65 20 70 53 72 63  art of page pSrc
cf30: 20 62 75 74 20 77 69 6c 6c 20 75 6c 74 69 6d 61   but will ultima
cf40: 74 65 6c 79 20 62 65 20 70 61 72 74 0a 2a 2a 20  tely be part.** 
cf50: 6f 66 20 70 50 61 67 65 2e 20 20 28 70 53 72 63  of pPage.  (pSrc
cf60: 20 61 6e 64 20 70 50 61 67 65 72 20 61 72 65 20   and pPager are 
cf70: 6f 66 74 65 6e 20 74 68 65 20 73 61 6d 65 2e 29  often the same.)
cf80: 20 20 49 66 20 70 43 65 6c 6c 20 63 6f 6e 74 61    If pCell conta
cf90: 69 6e 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72  ins a.** pointer
cfa0: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
cfb0: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
cfc0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
cfd0: 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 0a 2a  ointer-map for.*
cfe0: 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  * the overflow p
cff0: 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  age that will be
d000: 20 76 61 6c 69 64 20 61 66 74 65 72 20 70 43 65   valid after pCe
d010: 6c 6c 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65  ll has been move
d020: 64 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2f 0a 73  d to pPage..*/.s
d030: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
d040: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
d050: 61 67 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50  age *pPage, MemP
d060: 61 67 65 20 2a 70 53 72 63 2c 20 75 38 20 2a 70  age *pSrc, u8 *p
d070: 43 65 6c 6c 2c 69 6e 74 20 2a 70 52 43 29 7b 0a  Cell,int *pRC){.
d080: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
d090: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
d0a0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
d0b0: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50  pCell!=0 );.  pP
d0c0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
d0d0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
d0e0: 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  nfo);.  if( info
d0f0: 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61  .nLocal<info.nPa
d100: 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50 67 6e  yload ){.    Pgn
d110: 6f 20 6f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20  o ovfl;.    if( 
d120: 53 51 4c 49 54 45 5f 57 49 54 48 49 4e 28 70 53  SQLITE_WITHIN(pS
d130: 72 63 2d 3e 61 44 61 74 61 45 6e 64 2c 20 70 43  rc->aDataEnd, pC
d140: 65 6c 6c 2c 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e  ell, pCell+info.
d150: 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 20  nLocal) ){.     
d160: 20 74 65 73 74 63 61 73 65 28 20 70 53 72 63 21   testcase( pSrc!
d170: 3d 70 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  =pPage );.      
d180: 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
d190: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d1a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
d1b0: 20 20 20 20 6f 76 66 6c 20 3d 20 67 65 74 34 62      ovfl = get4b
d1c0: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
d1d0: 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70  nSize-4]);.    p
d1e0: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
d1f0: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
d200: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
d210: 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a  ge->pgno, pRC);.
d220: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
d230: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
d240: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
d250: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6f  This routine reo
d260: 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20 77  rganizes cells w
d270: 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ithin the.** pag
d280: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
d290: 61 72 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f 63  are no free-bloc
d2a0: 6b 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 62  ks on the free-b
d2b0: 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  lock list..**.**
d2c0: 20 50 61 72 61 6d 65 74 65 72 20 6e 4d 61 78 46   Parameter nMaxF
d2d0: 72 61 67 20 69 73 20 74 68 65 20 6d 61 78 69 6d  rag is the maxim
d2e0: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 61  um amount of fra
d2f0: 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20 74 68  gmented space th
d300: 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72 65  at may be.** pre
d310: 73 65 6e 74 20 69 6e 20 74 68 65 20 70 61 67 65  sent in the page
d320: 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   after this rout
d330: 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  ine returns..**.
d340: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
d350: 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51  R-44582-60138 SQ
d360: 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69  Lite may from ti
d370: 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67  me to time reorg
d380: 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65  anize a.** b-tre
d390: 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74  e page so that t
d3a0: 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65  here are no free
d3b0: 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65  blocks or fragme
d3c0: 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a  nt bytes, all.**
d3d0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72   unused bytes ar
d3e0: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
d3f0: 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73  he unallocated s
d400: 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64  pace region, and
d410: 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72   all.** cells ar
d420: 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79  e packed tightly
d430: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
d440: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
d450: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
d460: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
d470: 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46 72  Page, int nMaxFr
d480: 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ag){.  int i;   
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
d4b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
d4e0: 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  the i-th cell */
d4f0: 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d510: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70   Offset to the p
d520: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
d530: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
d540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
d550: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
d560: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
d570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
d580: 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  Number of usable
d590: 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65   bytes on a page
d5a0: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
d5b0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
d5c0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
d5d0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
d5e0: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62  rray */.  int cb
d5f0: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
d600: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
d610: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
d620: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
d630: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
d640: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d650: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
d660: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  e page */.  unsi
d670: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
d680: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
d690: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73  ge data */.  uns
d6a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
d6b0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  ;       /* Temp 
d6c0: 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f  area for cell co
d6d0: 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ntent */.  unsig
d6e0: 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20  ned char *src;  
d6f0: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
d700: 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  of content */.  
d710: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
d720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
d730: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
d740: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
d750: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
d760: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
d770: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
d780: 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ndex */..  asser
d790: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
d7a0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
d7b0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
d7c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
d7d0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
d7e0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t( pPage->pBt->u
d7f0: 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c  sableSize <= SQL
d800: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
d810: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
d820: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
d830: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d840: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d850: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d860: 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20  utex) );.  temp 
d870: 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74  = 0;.  src = dat
d880: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
d890: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
d8a0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
d8b0: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
d8c0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
d8d0: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
d8e0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
d8f0: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
d900: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 7c 7c  &data[hdr+3]) ||
d910: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
d920: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
d930: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
d940: 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65  ll;.  usableSize
d950: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
d960: 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a  sableSize;..  /*
d970: 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64   This block hand
d980: 6c 65 73 20 70 61 67 65 73 20 77 69 74 68 20 74  les pages with t
d990: 77 6f 20 6f 72 20 66 65 77 65 72 20 66 72 65 65  wo or fewer free
d9a0: 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78   blocks and nMax
d9b0: 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77  Frag.  ** or few
d9c0: 65 72 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  er fragmented by
d9d0: 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tes. In this cas
d9e0: 65 20 69 74 20 69 73 20 66 61 73 74 65 72 20 74  e it is faster t
d9f0: 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20  o move the.  ** 
da00: 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f  two (or one) blo
da10: 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20 75 73 69  cks of cells usi
da20: 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64  ng memmove() and
da30: 20 61 64 64 20 74 68 65 20 72 65 71 75 69 72 65   add the require
da40: 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74 73 20 74  d.  ** offsets t
da50: 6f 20 65 61 63 68 20 70 6f 69 6e 74 65 72 20 69  o each pointer i
da60: 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  n the cell-point
da70: 65 72 20 61 72 72 61 79 20 74 68 61 6e 20 69 74  er array than it
da80: 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63   is to .  ** rec
da90: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 65 6e 74  onstruct the ent
daa0: 69 72 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ire page.  */.  
dab0: 69 66 28 20 28 69 6e 74 29 64 61 74 61 5b 68 64  if( (int)data[hd
dac0: 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29  r+7]<=nMaxFrag )
dad0: 7b 0a 20 20 20 20 69 6e 74 20 69 46 72 65 65 20  {.    int iFree 
dae0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
daf0: 5b 68 64 72 2b 31 5d 29 3b 0a 0a 20 20 20 20 2f  [hdr+1]);..    /
db00: 2a 20 49 66 20 74 68 65 20 69 6e 69 74 69 61 6c  * If the initial
db10: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
db20: 74 20 77 65 72 65 20 6f 75 74 20 6f 66 20 62 6f  t were out of bo
db30: 75 6e 64 73 2c 20 74 68 61 74 20 77 6f 75 6c 64  unds, that would
db40: 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 62 65 65   have.    ** bee
db50: 6e 20 64 65 74 65 63 74 65 64 20 62 79 20 62 74  n detected by bt
db60: 72 65 65 43 6f 6d 70 75 74 65 46 72 65 65 53 70  reeComputeFreeSp
db70: 61 63 65 28 29 20 77 68 65 6e 20 69 74 20 77 61  ace() when it wa
db80: 73 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 0a  s computing the.
db90: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
dba0: 20 66 72 65 65 20 62 79 74 65 73 20 6f 6e 20 74   free bytes on t
dbb0: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
dbc0: 61 73 73 65 72 74 28 20 69 46 72 65 65 3c 3d 75  assert( iFree<=u
dbd0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
dbe0: 20 20 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a     if( iFree ){.
dbf0: 20 20 20 20 20 20 69 6e 74 20 69 46 72 65 65 32        int iFree2
dc00: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
dc10: 61 5b 69 46 72 65 65 5d 29 3b 0a 20 20 20 20 20  a[iFree]);.     
dc20: 20 69 66 28 20 69 46 72 65 65 32 3e 75 73 61 62   if( iFree2>usab
dc30: 6c 65 53 69 7a 65 2d 34 20 29 20 72 65 74 75 72  leSize-4 ) retur
dc40: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
dc50: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
dc60: 20 20 20 20 69 66 28 20 30 3d 3d 69 46 72 65 65      if( 0==iFree
dc70: 32 20 7c 7c 20 28 64 61 74 61 5b 69 46 72 65 65  2 || (data[iFree
dc80: 32 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 46  2]==0 && data[iF
dc90: 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20  ree2+1]==0) ){. 
dca0: 20 20 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20         u8 *pEnd 
dcb0: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
dcc0: 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  et + nCell*2];. 
dcd0: 20 20 20 20 20 20 20 75 38 20 2a 70 41 64 64 72         u8 *pAddr
dce0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  ;.        int sz
dcf0: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  2 = 0;.        i
dd00: 6e 74 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65  nt sz = get2byte
dd10: 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29  (&data[iFree+2])
dd20: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f  ;.        int to
dd30: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
dd40: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
dd50: 20 20 20 20 69 66 28 20 74 6f 70 3e 3d 69 46 72      if( top>=iFr
dd60: 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ee ){.          
dd70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
dd80: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
dd90: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
dda0: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 32 20       if( iFree2 
ddb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
ddc0: 20 69 46 72 65 65 2b 73 7a 3e 69 46 72 65 65 32   iFree+sz>iFree2
ddd0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
dde0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
ddf0: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
de00: 73 7a 32 20 3d 20 67 65 74 32 62 79 74 65 28 26  sz2 = get2byte(&
de10: 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b  data[iFree2+2]);
de20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
de30: 46 72 65 65 32 2b 73 7a 32 20 3e 20 75 73 61 62  Free2+sz2 > usab
de40: 6c 65 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20  leSize ) return 
de50: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
de60: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
de70: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64        memmove(&d
de80: 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a 32  ata[iFree+sz+sz2
de90: 5d 2c 20 26 64 61 74 61 5b 69 46 72 65 65 2b 73  ], &data[iFree+s
dea0: 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69 46 72 65  z], iFree2-(iFre
deb0: 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20 20 20 20  e+sz));.        
dec0: 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20 20    sz += sz2;.   
ded0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
dee0: 62 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20  brk = top+sz;.  
def0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 62        assert( cb
df00: 72 6b 2b 28 69 46 72 65 65 2d 74 6f 70 29 20 3c  rk+(iFree-top) <
df10: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
df20: 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28          memmove(
df30: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61  &data[cbrk], &da
df40: 74 61 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74  ta[top], iFree-t
df50: 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  op);.        for
df60: 28 70 41 64 64 72 3d 26 64 61 74 61 5b 63 65 6c  (pAddr=&data[cel
df70: 6c 4f 66 66 73 65 74 5d 3b 20 70 41 64 64 72 3c  lOffset]; pAddr<
df80: 70 45 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b  pEnd; pAddr+=2){
df90: 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20  .          pc = 
dfa0: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
dfb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
dfc0: 63 3c 69 46 72 65 65 20 29 7b 20 70 75 74 32 62  c<iFree ){ put2b
dfd0: 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a  yte(pAddr, pc+sz
dfe0: 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65  ); }.          e
dff0: 6c 73 65 20 69 66 28 20 70 63 3c 69 46 72 65 65  lse if( pc<iFree
e000: 32 20 29 7b 20 70 75 74 32 62 79 74 65 28 70 41  2 ){ put2byte(pA
e010: 64 64 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a  ddr, pc+sz2); }.
e020: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e030: 20 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e    goto defragmen
e040: 74 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  t_out;.      }. 
e050: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b     }.  }..  cbrk
e060: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
e070: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
e080: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66  bleSize - 4;.  f
e090: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
e0a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
e0b0: 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65  Addr;     /* The
e0c0: 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74   i-th cell point
e0d0: 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20  er */.    pAddr 
e0e0: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
e0f0: 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70  et + i*2];.    p
e100: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
e110: 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  dr);.    testcas
e120: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
e130: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
e140: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
e150: 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65   );.    /* These
e160: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65   conditions have
e170: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65   already been ve
e180: 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49  rified in btreeI
e190: 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a  nitPage().    **
e1a0: 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f   if PRAGMA cell_
e1b0: 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20  size_check=ON.. 
e1c0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63     */.    if( pc
e1d0: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
e1e0: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
e1f0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e200: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
e210: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
e220: 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43    assert( pc>=iC
e230: 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d  ellFirst && pc<=
e240: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
e250: 20 73 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78   size = pPage->x
e260: 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
e270: 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63  &src[pc]);.    c
e280: 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20  brk -= size;.   
e290: 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46   if( cbrk<iCellF
e2a0: 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e  irst || pc+size>
e2b0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
e2c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e2d0: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
e2e0: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
e2f0: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69   assert( cbrk+si
e300: 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26  ze<=usableSize &
e310: 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  & cbrk>=iCellFir
e320: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
e330: 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75  se( cbrk+size==u
e340: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
e350: 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 69   testcase( pc+si
e360: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
e370: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
e380: 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20  Addr, cbrk);.   
e390: 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a   if( temp==0 ){.
e3a0: 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20        int x;.   
e3b0: 20 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20     if( cbrk==pc 
e3c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
e3d0: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
e3e0: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
e3f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
e400: 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65  r);.      x = ge
e410: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
e420: 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  +5]);.      memc
e430: 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61  py(&temp[x], &da
e440: 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a  ta[x], (cbrk+siz
e450: 65 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73  e) - x);.      s
e460: 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d  rc = temp;.    }
e470: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
e480: 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63  a[cbrk], &src[pc
e490: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ], size);.  }.  
e4a0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
e4b0: 0a 0a 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75  .. defragment_ou
e4c0: 74 3a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  t:.  assert( pPa
e4d0: 67 65 2d 3e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a  ge->nFree>=0 );.
e4e0: 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37    if( data[hdr+7
e4f0: 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  ]+cbrk-iCellFirs
e500: 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  t!=pPage->nFree 
e510: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
e520: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
e530: 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
e540: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43  assert( cbrk>=iC
e550: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75  ellFirst );.  pu
e560: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
e570: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
e580: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
e590: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
e5a0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
e5b0: 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c  [iCellFirst], 0,
e5c0: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
e5d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
e5e0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
e5f0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
e600: 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  age) );.  return
e610: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
e620: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
e630: 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67  free-list on pag
e640: 65 20 70 50 67 20 66 6f 72 20 73 70 61 63 65 20  e pPg for space 
e650: 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20  to store a cell 
e660: 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a  nByte bytes in.*
e670: 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63  * size. If one c
e680: 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  an be found, ret
e690: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
e6a0: 20 74 68 65 20 73 70 61 63 65 20 61 6e 64 20 72   the space and r
e6b0: 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d  emove it.** from
e6c0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
e6d0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74  **.** If no suit
e6e0: 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62  able space can b
e6f0: 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66  e found on the f
e700: 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e  ree-list, return
e710: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   NULL..**.** Thi
e720: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64  s function may d
e730: 65 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e  etect corruption
e740: 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66   within pPg.  If
e750: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a   corruption is.*
e760: 2a 20 64 65 74 65 63 74 65 64 20 74 68 65 6e 20  * detected then 
e770: 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 53  *pRc is set to S
e780: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e  QLITE_CORRUPT an
e790: 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  d NULL is return
e7a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20  ed..**.** Slots 
e7b0: 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  on the free list
e7c0: 20 74 68 61 74 20 61 72 65 20 62 65 74 77 65 65   that are betwee
e7d0: 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65 73 20  n 1 and 3 bytes 
e7e0: 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79 74  larger than nByt
e7f0: 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e  e.** will be ign
e800: 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67 20 74  ored if adding t
e810: 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20 74  he extra space t
e820: 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74  o the fragmentat
e830: 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75  ion count.** cau
e840: 73 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e 74  ses the fragment
e850: 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65  ation count to e
e860: 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61  xceed 60..*/.sta
e870: 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64  tic u8 *pageFind
e880: 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50  Slot(MemPage *pP
e890: 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  g, int nByte, in
e8a0: 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74  t *pRc){.  const
e8b0: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e   int hdr = pPg->
e8c0: 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20  hdrOffset;      
e8d0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
e8e0: 74 6f 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  to page header *
e8f0: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61  /.  u8 * const a
e900: 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74  Data = pPg->aDat
e910: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;             /
e920: 2a 20 50 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  * Page data */. 
e930: 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72   int iAddr = hdr
e940: 20 2b 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   + 1;           
e950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
e960: 64 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f  ddress of ptr to
e970: 20 70 63 20 2a 2f 0a 20 20 69 6e 74 20 70 63 20   pc */.  int pc 
e980: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
e990: 61 5b 69 41 64 64 72 5d 29 3b 20 20 20 20 20 20  a[iAddr]);      
e9a0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
e9b0: 66 20 61 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f  f a free slot */
e9c0: 0a 20 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20  .  int 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 20 20 20 20 20 20 2f 2a                /*
e9f0: 20 45 78 63 65 73 73 20 73 69 7a 65 20 6f 66 20   Excess size of 
ea00: 74 68 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e  the slot */.  in
ea10: 74 20 6d 61 78 50 43 20 3d 20 70 50 67 2d 3e 70  t maxPC = pPg->p
ea20: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
ea30: 20 6e 42 79 74 65 3b 20 20 2f 2a 20 4d 61 78 20   nByte;  /* Max 
ea40: 61 64 64 72 65 73 73 20 66 6f 72 20 61 20 75 73  address for a us
ea50: 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69  able slot */.  i
ea60: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
ea90: 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c  e of the free sl
eaa0: 6f 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ot */..  assert(
eab0: 20 70 63 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65   pc>0 );.  while
eac0: 28 20 70 63 3c 3d 6d 61 78 50 43 20 29 7b 0a 20  ( pc<=maxPC ){. 
ead0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
eae0: 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38  F: R-22710-53328
eaf0: 20 54 68 65 20 74 68 69 72 64 20 61 6e 64 20 66   The third and f
eb00: 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66 20 65  ourth bytes of e
eb10: 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62  ach.    ** freeb
eb20: 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d  lock form a big-
eb30: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
eb40: 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a 65  hich is the size
eb50: 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63   of the freebloc
eb60: 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65  k.    ** in byte
eb70: 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  s, including the
eb80: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20   4-byte header. 
eb90: 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65  */.    size = ge
eba0: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
ebb0: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78  +2]);.    if( (x
ebc0: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29   = size - nByte)
ebd0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  >=0 ){.      tes
ebe0: 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20  tcase( x==4 );. 
ebf0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
ec00: 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==3 );.      if(
ec10: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
ec20: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
ec30: 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e  R-11498-58022 In
ec40: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62   a well-formed b
ec50: 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 20  -tree page, the 
ec60: 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  total.        **
ec70: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
ec80: 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61   in fragments ma
ec90: 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e  y not exceed 60.
eca0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
ecb0: 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20  aData[hdr+7]>57 
ecc0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20  ) return 0;..   
ecd0: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
ece0: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
ecf0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
ed00: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
ed10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67  .        ** frag
ed20: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74  mented bytes wit
ed30: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f  hin the page. */
ed40: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
ed50: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26  &aData[iAddr], &
ed60: 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  aData[pc], 2);. 
ed70: 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64 72         aData[hdr
ed80: 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20  +7] += (u8)x;.  
ed90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 2b      }else if( x+
eda0: 70 63 20 3e 20 6d 61 78 50 43 20 29 7b 0a 20 20  pc > maxPC ){.  
edb0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 6c        /* This sl
edc0: 6f 74 20 65 78 74 65 6e 64 73 20 6f 66 66 20 74  ot extends off t
edd0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 75 73  he end of the us
ede0: 61 62 6c 65 20 70 61 72 74 20 6f 66 20 74 68 65  able part of the
edf0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
ee00: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43   *pRc = SQLITE_C
ee10: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 67 29  ORRUPT_PAGE(pPg)
ee20: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
ee30: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
ee40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
ee50: 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20  slot remains on 
ee60: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52  the free-list. R
ee70: 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74  educe its size t
ee80: 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20  o account.      
ee90: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72    ** for the por
eea0: 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65  tion used by the
eeb0: 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   new allocation.
eec0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32   */.        put2
eed0: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
eee0: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ], x);.      }. 
eef0: 20 20 20 20 20 72 65 74 75 72 6e 20 26 61 44 61       return &aDa
ef00: 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20  ta[pc + x];.    
ef10: 7d 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70 63  }.    iAddr = pc
ef20: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
ef30: 79 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b  yte(&aData[pc]);
ef40: 0a 20 20 20 20 69 66 28 20 70 63 3c 69 41 64 64  .    if( pc<iAdd
ef50: 72 2b 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  r+size ){.      
ef60: 69 66 28 20 70 63 20 29 7b 0a 20 20 20 20 20 20  if( pc ){.      
ef70: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 73 6c    /* The next sl
ef80: 6f 74 20 69 6e 20 74 68 65 20 63 68 61 69 6e 20  ot in the chain 
ef90: 69 73 20 6e 6f 74 20 70 61 73 74 20 74 68 65 20  is not past the 
efa0: 65 6e 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  end of the curre
efb0: 6e 74 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20  nt slot */.     
efc0: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
efd0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
efe0: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
eff0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
f000: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 63 3e 6d  }.  }.  if( pc>m
f010: 61 78 50 43 2b 6e 42 79 74 65 2d 34 20 29 7b 0a  axPC+nByte-4 ){.
f020: 20 20 20 20 2f 2a 20 54 68 65 20 66 72 65 65 20      /* The free 
f030: 73 6c 6f 74 20 63 68 61 69 6e 20 65 78 74 65 6e  slot chain exten
f040: 64 73 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  ds off the end o
f050: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
f060: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
f070: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 67  CORRUPT_PAGE(pPg
f080: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
f090: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  0;.}../*.** Allo
f0a0: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
f0b0: 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77   of space from w
f0c0: 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65  ithin the B-Tree
f0d0: 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20   page passed.** 
f0e0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
f0f0: 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74  ument. Write int
f100: 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65  o *pIdx the inde
f110: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
f120: 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20  ata[].** of the 
f130: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c  first byte of al
f140: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52  located space. R
f150: 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c  eturn either SQL
f160: 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20  ITE_OK or.** an 
f170: 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61  error code (usua
f180: 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  lly SQLITE_CORRU
f190: 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  PT)..**.** The c
f1a0: 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73  aller guarantees
f1b0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
f1c0: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
f1d0: 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61  to make the.** a
f1e0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73  llocation.  This
f1f0: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e   routine might n
f200: 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e  eed to defragmen
f210: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72  t in order to br
f220: 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73  ing.** all the s
f230: 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68  pace together, h
f240: 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f  owever.  This ro
f250: 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64  utine will avoid
f260: 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69   using.** the fi
f270: 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61  rst two bytes pa
f280: 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  st the cell poin
f290: 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70  ter area since p
f2a0: 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a  resumably this.*
f2b0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  * allocation is 
f2c0: 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72  being made in or
f2d0: 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20  der to insert a 
f2e0: 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20  new cell, so we 
f2f0: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64  will.** also end
f300: 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65   up needing a ne
f310: 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  w cell pointer..
f320: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
f330: 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50  locateSpace(MemP
f340: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
f350: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78  nByte, int *pIdx
f360: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
f370: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
f380: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  ffset;    /* Loc
f390: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
f3a0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a  e->hdrOffset */.
f3b0: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74    u8 * const dat
f3c0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
f3d0: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
f3e0: 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e  cache of pPage->
f3f0: 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74  aData */.  int t
f400: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
f410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f420: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
f430: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
f440: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ea */.  int rc =
f450: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f470: 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63  Integer return c
f480: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70  ode */.  int gap
f490: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
f4a0: 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65  t byte of gap be
f4b0: 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74  tween cell point
f4c0: 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e  ers and cell con
f4d0: 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73  tent */.  .  ass
f4e0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
f4f0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
f500: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
f510: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
f520: 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
f530: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
f540: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
f550: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
f560: 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b  ert( nByte>=0 );
f570: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
f580: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
f590: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
f5a0: 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a  nFree>=nByte );.
f5b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
f5c0: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
f5d0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
f5e0: 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e   < (int)(pPage->
f5f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
f600: 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  8) );..  assert(
f610: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
f620: 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d  et == hdr + 12 -
f630: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29   4*pPage->leaf )
f640: 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d  ;.  gap = pPage-
f650: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
f660: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
f670: 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35  assert( gap<=655
f680: 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  36 );.  /* EVIDE
f690: 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d  NCE-OF: R-29356-
f6a0: 30 32 33 39 31 20 49 66 20 74 68 65 20 64 61 74  02391 If the dat
f6b0: 61 62 61 73 65 20 75 73 65 73 20 61 20 36 35 35  abase uses a 655
f6c0: 33 36 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a  36-byte page siz
f6d0: 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72  e.  ** and the r
f6e0: 65 73 65 72 76 65 64 20 73 70 61 63 65 20 69 73  eserved space is
f6f0: 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c   zero (the usual
f700: 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72   value for reser
f710: 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20  ved space).  ** 
f720: 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f  then the cell co
f730: 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20  ntent offset of 
f740: 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 61  an empty page wa
f750: 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e  nts to be 65536.
f760: 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74  .  ** However, t
f770: 68 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 74  hat integer is t
f780: 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73  oo large to be s
f790: 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74  tored in a 2-byt
f7a0: 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20  e unsigned.  ** 
f7b0: 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61  integer, so a va
f7c0: 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73 65 64  lue of 0 is used
f7d0: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a   in its place. *
f7e0: 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  /.  top = get2by
f7f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
f800: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c  ;.  assert( top<
f810: 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74  =(int)pPage->pBt
f820: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20  ->usableSize ); 
f830: 2f 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67 65  /* Prevent by ge
f840: 74 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a  tAndInitPage() *
f850: 2f 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20  /.  if( gap>top 
f860: 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d  ){.    if( top==
f870: 30 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d  0 && pPage->pBt-
f880: 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35  >usableSize==655
f890: 33 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20  36 ){.      top 
f8a0: 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c  = 65536;.    }el
f8b0: 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
f8c0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f8d0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
f8e0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
f8f0: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
f900: 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 67 61  space between ga
f910: 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e  p and top for on
f920: 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e  e more cell poin
f930: 74 65 72 2c 0a 20 20 2a 2a 20 61 6e 64 20 69 66  ter,.  ** and if
f940: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
f950: 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e   not empty, then
f960: 20 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a   search the.  **
f970: 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e   freelist lookin
f980: 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67  g for a slot big
f990: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
f9a0: 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  fy the request..
f9b0: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
f9c0: 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20   gap+2==top );. 
f9d0: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31   testcase( gap+1
f9e0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
f9f0: 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b  ase( gap==top );
fa00: 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72  .  if( (data[hdr
fa10: 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b  +2] || data[hdr+
fa20: 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f  1]) && gap+2<=to
fa30: 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70  p ){.    u8 *pSp
fa40: 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c  ace = pageFindSl
fa50: 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c  ot(pPage, nByte,
fa60: 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70   &rc);.    if( p
fa70: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61  Space ){.      a
fa80: 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64  ssert( pSpace>=d
fa90: 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d  ata && (pSpace -
faa0: 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a   data)<65536 );.
fab0: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69        *pIdx = (i
fac0: 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74  nt)(pSpace - dat
fad0: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
fae0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
faf0: 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a  }else if( rc ){.
fb00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
fb10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
fb20: 20 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75   The request cou
fb30: 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c  ld not be fulfil
fb40: 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65  led using a free
fb50: 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63  list slot.  Chec
fb60: 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  k.  ** to see if
fb70: 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e   defragmentation
fb80: 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
fb90: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
fba0: 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70  gap+2+nByte==top
fbb0: 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b   );.  if( gap+2+
fbc0: 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20  nByte>top ){.   
fbd0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
fbe0: 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55  nCell>0 || CORRU
fbf0: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73  PT_DB );.    ass
fc00: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
fc10: 65 3e 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  e>=0 );.    rc =
fc20: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
fc30: 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c 20 70 50  pPage, MIN(4, pP
fc40: 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 32 2b  age->nFree - (2+
fc50: 6e 42 79 74 65 29 29 29 3b 0a 20 20 20 20 69 66  nByte)));.    if
fc60: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
fc70: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
fc80: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
fc90: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61  a[hdr+5]);.    a
fca0: 73 73 65 72 74 28 20 67 61 70 2b 32 2b 6e 42 79  ssert( gap+2+nBy
fcb0: 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a  te<=top );.  }..
fcc0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
fcd0: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
fce0: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
fcf0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
fd00: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
fd10: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
fd20: 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 43  rea.  The btreeC
fd30: 6f 6d 70 75 74 65 46 72 65 65 53 70 61 63 65 28  omputeFreeSpace(
fd40: 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61  ) call has alrea
fd50: 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65  dy.  ** validate
fd60: 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  d the freelist. 
fd70: 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20   Given that the 
fd80: 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69  freelist is vali
fd90: 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  d, there.  ** is
fda0: 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65   no way that the
fdb0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20   allocation can 
fdc0: 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65  extend off the e
fdd0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
fde0: 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28    ** The assert(
fdf0: 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  ) below verifies
fe00: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
fe10: 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74  ntence..  */.  t
fe20: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70  op -= nByte;.  p
fe30: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
fe40: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73  r+5], top);.  as
fe50: 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20  sert( top+nByte 
fe60: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
fe70: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
fe80: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b  ;.  *pIdx = top;
fe90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
fea0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
feb0: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
fec0: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
fed0: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
fee0: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
fef0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
ff00: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
ff10: 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61  Page->aData[iSta
ff20: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
ff30: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
ff40: 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e   is iSize bytes.
ff50: 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20  .**.** Adjacent 
ff60: 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63  freeblocks are c
ff70: 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  oalesced..**.** 
ff80: 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20  Even though the 
ff90: 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77  freeblock list w
ffa0: 61 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74  as checked by bt
ffb0: 72 65 65 43 6f 6d 70 75 74 65 46 72 65 65 53 70  reeComputeFreeSp
ffc0: 61 63 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72  ace(),.** that r
ffd0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20  outine will not 
ffe0: 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62  detect overlap b
fff0: 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20  etween cells or 
10000 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72  freeblocks.  Nor
10010 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65  .** does it dete
10020 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65  ct cells or free
10030 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72  blocks that encr
10040 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65  ouch into the re
10050 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20  served bytes.** 
10060 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
10070 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61  e page.  So do a
10080 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70  dditional corrup
10090 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69  tion checks insi
100a0 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  de this.** routi
100b0 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ne and return SQ
100c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
100d0 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65  any problems are
100e0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
100f0 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28  c int freeSpace(
10100 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
10110 75 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20  u16 iStart, u16 
10120 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50  iSize){.  u16 iP
10130 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tr;             
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10150 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74  /* Address of pt
10160 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c  r to next freebl
10170 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72  ock */.  u16 iFr
10180 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20  eeBlk;          
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
101a0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
101b0 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20   next freeblock 
101c0 2a 2f 0a 20 20 75 38 20 68 64 72 3b 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 20 20 20 20 20 2f 2a 20 50 61             /* Pa
101f0 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20  ge header size. 
10200 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75   0 or 100 */.  u
10210 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20  8 nFrag = 0;    
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10230 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f       /* Reductio
10240 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69  n in fragmentati
10250 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69  on */.  u16 iOri
10260 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20  gSize = iSize;  
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10280 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
10290 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 31  of iSize */.  u1
102a0 36 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  6 x;            
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
102d0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
102e0 65 61 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64  ea */.  u32 iEnd
102f0 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69 7a   = iStart + iSiz
10300 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
10310 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
10320 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66 66   the iStart buff
10330 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
10340 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
10350 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a  age->aData;   /*
10360 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f   Page content */
10370 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10380 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
10390 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
103a0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
103b0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
103c0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
103d0 55 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72 74  UPT_DB || iStart
103e0 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  >=pPage->hdrOffs
103f0 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c  et+6+pPage->chil
10400 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73  dPtrSize );.  as
10410 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
10420 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61 67   || iEnd <= pPag
10430 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
10440 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
10450 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10460 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
10470 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
10480 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20  t( iSize>=4 );  
10490 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
104a0 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
104b0 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d  assert( iStart<=
104c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
104d0 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 0a 20 20 2f  leSize-4 );..  /
104e0 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72  * The list of fr
104f0 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  eeblocks must be
10500 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
10510 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a  der.  Find the .
10520 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65    ** spot on the
10530 20 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61   list where iSta
10540 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  rt should be ins
10550 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64  erted..  */.  hd
10560 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
10570 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68  fset;.  iPtr = h
10580 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61  dr + 1;.  if( da
10590 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26  ta[iPtr+1]==0 &&
105a0 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29   data[iPtr]==0 )
105b0 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d  {.    iFreeBlk =
105c0 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74   0;  /* Shortcut
105d0 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
105e0 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  en the freelist 
105f0 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65  is empty */.  }e
10600 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
10610 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32  (iFreeBlk = get2
10620 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d  byte(&data[iPtr]
10630 29 29 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20  ))<iStart ){.   
10640 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c     if( iFreeBlk<
10650 69 50 74 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  iPtr+4 ){.      
10660 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d    if( iFreeBlk==
10670 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
10680 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10690 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
106a0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
106b0 20 20 20 20 69 50 74 72 20 3d 20 69 46 72 65 65      iPtr = iFree
106c0 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Blk;.    }.    i
106d0 66 28 20 69 46 72 65 65 42 6c 6b 3e 70 50 61 67  f( iFreeBlk>pPag
106e0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
106f0 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 72 65  ze-4 ){.      re
10700 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10710 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
10720 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
10730 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72  t( iFreeBlk>iPtr
10740 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20   || iFreeBlk==0 
10750 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20  );.  .    /* At 
10760 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20  this point:.    
10770 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20  **    iFreeBlk: 
10780 20 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63    First freebloc
10790 6b 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20  k after iStart, 
107a0 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a  or zero if none.
107b0 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20      **    iPtr: 
107c0 20 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73        The addres
107d0 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74  s of a pointer t
107e0 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a  o iFreeBlk.    *
107f0 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  *.    ** Check t
10800 6f 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c  o see if iFreeBl
10810 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c  k should be coal
10820 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
10830 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20  nd of iStart..  
10840 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72    */.    if( iFr
10850 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e  eeBlk && iEnd+3>
10860 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20  =iFreeBlk ){.   
10870 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65     nFrag = iFree
10880 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20  Blk - iEnd;.    
10890 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65    if( iEnd>iFree
108a0 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c  Blk ) return SQL
108b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
108c0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  (pPage);.      i
108d0 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b  End = iFreeBlk +
108e0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
108f0 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20  iFreeBlk+2]);.  
10900 20 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70      if( iEnd > p
10910 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
10920 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
10930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10940 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10950 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
10960 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d    iSize = iEnd -
10970 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69   iStart;.      i
10980 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79  FreeBlk = get2by
10990 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c  te(&data[iFreeBl
109a0 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  k]);.    }.  .  
109b0 20 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20    /* If iPtr is 
109c0 61 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63  another freebloc
109d0 6b 20 28 74 68 61 74 20 69 73 2c 20 69 66 20 69  k (that is, if i
109e0 50 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66  Ptr is not the f
109f0 72 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70  reelist.    ** p
10a00 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61  ointer in the pa
10a10 67 65 20 68 65 61 64 65 72 29 20 74 68 65 6e 20  ge header) then 
10a20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
10a30 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
10a40 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65  .    ** coalesce
10a50 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
10a60 66 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20  f iPtr..    */. 
10a70 20 20 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b     if( iPtr>hdr+
10a80 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  1 ){.      int i
10a90 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20  PtrEnd = iPtr + 
10aa0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
10ab0 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  Ptr+2]);.      i
10ac0 66 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53  f( iPtrEnd+3>=iS
10ad0 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tart ){.        
10ae0 69 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61  if( iPtrEnd>iSta
10af0 72 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  rt ) return SQLI
10b00 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
10b10 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
10b20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20  nFrag += iStart 
10b30 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20  - iPtrEnd;.     
10b40 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20     iSize = iEnd 
10b50 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20  - iPtr;.        
10b60 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20  iStart = iPtr;. 
10b70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10b80 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b   if( nFrag>data[
10b90 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20  hdr+7] ) return 
10ba0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10bb0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
10bc0 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e  data[hdr+7] -= n
10bd0 46 72 61 67 3b 0a 20 20 7d 0a 20 20 78 20 3d 20  Frag;.  }.  x = 
10be0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
10bf0 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 69 53  dr+5]);.  if( iS
10c00 74 61 72 74 3c 3d 78 20 29 7b 0a 20 20 20 20 2f  tart<=x ){.    /
10c10 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c  * The new freebl
10c20 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65  ock is at the be
10c30 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
10c40 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
10c50 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74  ,.    ** so just
10c60 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c   extend the cell
10c70 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61   content area ra
10c80 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65  ther than create
10c90 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
10ca0 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a  freelist entry *
10cb0 2f 0a 20 20 20 20 69 66 28 20 69 53 74 61 72 74  /.    if( iStart
10cc0 3c 78 20 7c 7c 20 69 50 74 72 21 3d 68 64 72 2b  <x || iPtr!=hdr+
10cd0 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
10ce0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10cf0 50 61 67 65 29 3b 0a 20 20 20 20 70 75 74 32 62  Page);.    put2b
10d00 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
10d10 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20  , iFreeBlk);.   
10d20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
10d30 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20  hdr+5], iEnd);. 
10d40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
10d50 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72  nsert the new fr
10d60 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65  eeblock into the
10d70 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20   freelist */.   
10d80 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
10d90 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a  iPtr], iStart);.
10da0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
10db0 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
10dc0 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45   BTS_FAST_SECURE
10dd0 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77   ){.    /* Overw
10de0 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
10df0 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
10e00 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
10e10 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a  ure_delete.    *
10e20 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  * option is enab
10e30 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
10e40 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  t(&data[iStart],
10e50 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a   0, iSize);.  }.
10e60 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
10e70 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42  [iStart], iFreeB
10e80 6c 6b 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  lk);.  put2byte(
10e90 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c  &data[iStart+2],
10ea0 20 69 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65   iSize);.  pPage
10eb0 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67  ->nFree += iOrig
10ec0 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Size;.  return S
10ed0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10ee0 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
10ef0 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
10f00 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
10f10 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
10f20 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
10f30 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
10f40 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
10f50 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
10f60 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
10f70 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
10f80 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70  nations are supp
10f90 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67  orted.  Anything
10fa0 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e   different.** in
10fb0 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70  dicates a corrup
10fc0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
10fd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
10fe0 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20  PTF_ZERODATA.** 
10ff0 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
11000 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a  DATA | PTF_LEAF.
11010 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
11020 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
11030 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20  TKEY.**         
11040 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
11050 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f  TF_INTKEY | PTF_
11060 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAF.*/.static i
11070 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  nt decodeFlags(M
11080 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
11090 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
110a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
110b0 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
110c0 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
110d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
110e0 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
110f0 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
11100 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
11110 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11120 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
11130 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
11140 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29  age->leaf = (u8)
11150 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20  (flagByte>>3);  
11160 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
11170 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
11180 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
11190 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
111a0 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
111b0 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
111c0 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
111d0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a   = cellSizePtr;.
111e0 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
111f0 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
11200 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54  te==(PTF_LEAFDAT
11210 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20  A | PTF_INTKEY) 
11220 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
11230 43 45 2d 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33  CE-OF: R-07291-3
11240 35 33 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20  5328 A value of 
11250 35 20 28 30 78 30 35 29 20 6d 65 61 6e 73 20 74  5 (0x05) means t
11260 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20  he page is an.  
11270 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 74 61    ** interior ta
11280 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ble b-tree page.
11290 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
112a0 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  (PTF_LEAFDATA|PT
112b0 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a  F_INTKEY)==5 );.
112c0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
112d0 4f 46 3a 20 52 2d 32 36 39 30 30 2d 30 39 31 37  OF: R-26900-0917
112e0 36 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20  6 A value of 13 
112f0 28 30 78 30 64 29 20 6d 65 61 6e 73 20 74 68 65  (0x0d) means the
11300 20 70 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a   page is a.    *
11310 2a 20 6c 65 61 66 20 74 61 62 6c 65 20 62 2d 74  * leaf table b-t
11320 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
11330 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45   assert( (PTF_LE
11340 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45  AFDATA|PTF_INTKE
11350 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20  Y|PTF_LEAF)==13 
11360 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
11370 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66  tKey = 1;.    if
11380 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
11390 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  .      pPage->in
113a0 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20  tKeyLeaf = 1;.  
113b0 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
113c0 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72  eCell = btreePar
113d0 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d  seCellPtr;.    }
113e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
113f0 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
11400 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  0;.      pPage->
11410 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c  xCellSize = cell
11420 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64  SizePtrNoPayload
11430 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
11440 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65  ParseCell = btre
11450 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50  eParseCellPtrNoP
11460 61 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20  ayload;.    }.  
11470 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
11480 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
11490 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
114a0 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
114b0 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
114c0 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
114d0 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
114e0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
114f0 52 2d 34 33 33 31 36 2d 33 37 33 30 38 20 41 20  R-43316-37308 A 
11500 76 61 6c 75 65 20 6f 66 20 32 20 28 30 78 30 32  value of 2 (0x02
11510 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  ) means the page
11520 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e   is an.    ** in
11530 74 65 72 69 6f 72 20 69 6e 64 65 78 20 62 2d 74  terior index b-t
11540 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
11550 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45   assert( (PTF_ZE
11560 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20  RODATA)==2 );.  
11570 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
11580 3a 20 52 2d 35 39 36 31 35 2d 34 32 38 32 38 20  : R-59615-42828 
11590 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20 28 30  A value of 10 (0
115a0 78 30 61 29 20 6d 65 61 6e 73 20 74 68 65 20 70  x0a) means the p
115b0 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20  age is a.    ** 
115c0 6c 65 61 66 20 69 6e 64 65 78 20 62 2d 74 72 65  leaf index b-tre
115d0 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
115e0 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f  ssert( (PTF_ZERO
115f0 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d  DATA|PTF_LEAF)==
11600 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  10 );.    pPage-
11610 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20  >intKey = 0;.   
11620 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
11630 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  af = 0;.    pPag
11640 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20  e->xParseCell = 
11650 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
11660 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61 67  rIndex;.    pPag
11670 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
11680 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  t->maxLocal;.   
11690 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
116a0 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c   = pBt->minLocal
116b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
116c0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
116d0 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e 79  -47608-56469 Any
116e0 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f 72   other value for
116f0 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
11700 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a 20   type is.    ** 
11710 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20  an error. */.   
11720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
11730 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
11740 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  e);.  }.  pPage-
11750 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
11760 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65   = pBt->max1byte
11770 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72  Payload;.  retur
11780 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11790 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
117a0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65  e amount of free
117b0 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
117c0 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  e.  In other wor
117d0 64 73 2c 20 66 69 6c 6c 0a 2a 2a 20 69 6e 20 74  ds, fill.** in t
117e0 68 65 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  he pPage->nFree 
117f0 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  field..*/.static
11800 20 69 6e 74 20 62 74 72 65 65 43 6f 6d 70 75 74   int btreeComput
11810 65 46 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61  eFreeSpace(MemPa
11820 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
11830 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
11840 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
11850 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
11860 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
11870 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20   */.  u8 hdr;   
11880 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
11890 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
118a0 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
118b0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
118c0 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
118d0 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
118e0 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
118f0 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
11900 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
11910 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
11920 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
11930 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11940 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73   of unused bytes
11950 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
11960 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
11970 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
11980 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  te of the cell c
11990 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
119a0 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
119b0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
119c0 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  owable cell or f
119d0 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
119e0 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  */.  int iCellLa
119f0 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
11a00 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
11a10 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
11a20 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
11a30 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
11a40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11a50 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a  ->pBt->db!=0 );.
11a60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11a70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
11a80 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
11a90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
11aa0 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
11ab0 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
11ac0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
11ad0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
11ae0 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
11af0 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
11b00 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
11b10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
11b20 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
11b30 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
11b40 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
11b50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
11b60 3e 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20  >isInit==1 );.  
11b70 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
11b80 46 72 65 65 3c 30 20 29 3b 0a 0a 20 20 75 73 61  Free<0 );..  usa
11b90 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
11ba0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
11bb0 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
11bc0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61  >hdrOffset;.  da
11bd0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
11be0 61 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  a;.  /* EVIDENCE
11bf0 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31  -OF: R-58015-481
11c00 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  75 The two-byte 
11c10 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
11c20 74 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20  t 5 designates. 
11c30 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66   ** the start of
11c40 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
11c50 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76  t area. A zero v
11c60 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e  alue for this in
11c70 74 65 67 65 72 20 69 73 0a 20 20 2a 2a 20 69 6e  teger is.  ** in
11c80 74 65 72 70 72 65 74 65 64 20 61 73 20 36 35 35  terpreted as 655
11c90 33 36 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67  36. */.  top = g
11ca0 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
11cb0 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
11cc0 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 68 64 72  iCellFirst = hdr
11cd0 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68   + 8 + pPage->ch
11ce0 69 6c 64 50 74 72 53 69 7a 65 20 2b 20 32 2a 70  ildPtrSize + 2*p
11cf0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69  Page->nCell;.  i
11d00 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
11d10 65 53 69 7a 65 20 2d 20 34 3b 0a 0a 20 20 2f 2a  eSize - 4;..  /*
11d20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
11d30 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
11d40 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 45   the page.  ** E
11d50 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33  VIDENCE-OF: R-23
11d60 35 38 38 2d 33 34 34 35 30 20 54 68 65 20 74 77  588-34450 The tw
11d70 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
11d80 74 20 6f 66 66 73 65 74 20 31 20 67 69 76 65 73  t offset 1 gives
11d90 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20   the.  ** start 
11da0 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 72 65  of the first fre
11db0 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  eblock on the pa
11dc0 67 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69  ge, or is zero i
11dd0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20  f there are no. 
11de0 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   ** freeblocks. 
11df0 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  */.  pc = get2by
11e00 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
11e10 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61  ;.  nFree = data
11e20 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20  [hdr+7] + top;  
11e30 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f  /* Init nFree to
11e40 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66   non-freeblock f
11e50 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 69  ree space */.  i
11e60 66 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 75  f( pc>0 ){.    u
11e70 33 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  32 next, size;. 
11e80 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
11e90 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  irst ){.      /*
11ea0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11eb0 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20 61  55530-52930 In a
11ec0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74   well-formed b-t
11ed0 72 65 65 20 70 61 67 65 2c 20 74 68 65 72 65 20  ree page, there 
11ee0 77 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6c  will.      ** al
11ef0 77 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74  ways be at least
11f00 20 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65   one cell before
11f10 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62   the first freeb
11f20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lock..      */. 
11f30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11f40 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
11f50 70 50 61 67 65 29 3b 20 0a 20 20 20 20 7d 0a 20  pPage); .    }. 
11f60 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
11f70 20 20 20 20 20 69 66 28 20 70 63 3e 69 43 65 6c       if( pc>iCel
11f80 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
11f90 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66   /* Freeblock of
11fa0 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
11fb0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
11fc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
11fd0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
11fe0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
11ff0 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
12000 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
12010 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
12020 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
12030 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  ;.      nFree = 
12040 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20  nFree + size;.  
12050 20 20 20 20 69 66 28 20 6e 65 78 74 3c 3d 70 63      if( next<=pc
12060 2b 73 69 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b  +size+3 ) break;
12070 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74  .      pc = next
12080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12090 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  next>0 ){.      
120a0 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e 6f 74  /* Freeblock not
120b0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
120c0 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  der */.      ret
120d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
120e0 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
120f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 63      }.    if( pc
12100 2b 73 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64 20  +size>(unsigned 
12110 69 6e 74 29 75 73 61 62 6c 65 53 69 7a 65 20 29  int)usableSize )
12120 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  {.      /* Last 
12130 66 72 65 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64  freeblock extend
12140 73 20 70 61 73 74 20 70 61 67 65 20 65 6e 64 20  s past page end 
12150 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
12160 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
12170 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
12180 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  }.  }..  /* At t
12190 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65  his point, nFree
121a0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75   contains the su
121b0 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20  m of the offset 
121c0 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  to the start.  *
121d0 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  * of the cell-co
121e0 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20  ntent area plus 
121f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
12200 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a  ee bytes within.
12210 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f    ** the cell-co
12220 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74  ntent area. If t
12230 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74  his is greater t
12240 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73  han the usable-s
12250 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ize.  ** of the 
12260 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70  page, then the p
12270 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
12280 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63  upted. This chec
12290 6b 20 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72 76  k also.  ** serv
122a0 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  es to verify tha
122b0 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  t the offset to 
122c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
122d0 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20   cell-content.  
122e0 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
122f0 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
12300 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
12310 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  in the page..  *
12320 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73  /.  if( nFree>us
12330 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
12340 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
12350 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
12360 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
12370 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46  nFree = (u16)(nF
12380 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74  ree - iCellFirst
12390 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
123a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
123b0 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  Do additional sa
123c0 6e 69 74 79 20 63 68 65 63 6b 20 61 66 74 65 72  nity check after
123d0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
123e0 20 69 66 0a 2a 2a 20 50 52 41 47 4d 41 20 63 65   if.** PRAGMA ce
123f0 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e  ll_size_check=ON
12400 20 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49   .*/.static SQLI
12410 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
12420 62 74 72 65 65 43 65 6c 6c 53 69 7a 65 43 68 65  btreeCellSizeChe
12430 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ck(MemPage *pPag
12440 65 29 7b 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46  e){.  int iCellF
12450 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73  irst;    /* Firs
12460 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
12470 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
12480 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  fset */.  int iC
12490 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20  ellLast;     /* 
124a0 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
124b0 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
124c0 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  offset */.  int 
124d0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  i;             /
124e0 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  * Index into the
124f0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
12500 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 3b  ray */.  int sz;
12510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
12520 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
12530 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
12540 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
12550 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
12560 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
12570 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
12580 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
12590 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
125a0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
125b0 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
125c0 2a 20 4d 61 78 69 6d 75 6d 20 75 73 61 62 6c 65  * Maximum usable
125d0 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
125e0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
125f0 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 53 74  Offset;    /* St
12600 61 72 74 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  art of cell cont
12610 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 69  ent area */..  i
12620 43 65 6c 6c 46 69 72 73 74 20 3d 20 70 50 61 67  CellFirst = pPag
12630 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
12640 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
12650 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
12660 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
12670 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c 61  eSize;.  iCellLa
12680 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
12690 2d 20 34 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  - 4;.  data = pP
126a0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 63 65  age->aData;.  ce
126b0 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
126c0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
126d0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
126e0 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
126f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
12700 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
12710 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
12720 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b  teAligned(&data[
12730 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
12740 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
12750 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  pc==iCellFirst )
12760 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
12770 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
12780 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c  .    if( pc<iCel
12790 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
127a0 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
127b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
127c0 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
127d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 20  );.    }.    sz 
127e0 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
127f0 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  ze(pPage, &data[
12800 70 63 5d 29 3b 0a 20 20 20 20 74 65 73 74 63 61  pc]);.    testca
12810 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c  se( pc+sz==usabl
12820 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  eSize );.    if(
12830 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
12840 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
12850 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
12860 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
12870 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
12890 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
128a0 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
128b0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
128c0 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
128d0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
128e0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
128f0 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
12900 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
12910 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
12920 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
12930 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
12940 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
12950 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
12960 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
12970 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
12980 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
12990 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
129a0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
129b0 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
129c0 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
129d0 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
129e0 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
129f0 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74  ic int btreeInit
12a00 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
12a10 61 67 65 29 7b 0a 20 20 75 38 20 2a 64 61 74 61  age){.  u8 *data
12a20 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71  ;          /* Eq
12a30 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44  ual to pPage->aD
12a40 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ata */.  BtShare
12a50 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  d *pBt;        /
12a60 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
12a70 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 0a 20   structure */.. 
12a80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
12a90 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
12aa0 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
12ab0 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
12ac0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12ad0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12ae0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
12af0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
12b00 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
12b10 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
12b20 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
12b30 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20  ssert( pPage == 
12b40 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
12b50 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
12b60 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
12b70 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d  ( pPage->aData =
12b80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
12b90 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
12ba0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
12bb0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
12bc0 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20  ==0 );..  pBt = 
12bd0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 64 61  pPage->pBt;.  da
12be0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
12bf0 61 20 2b 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  a + pPage->hdrOf
12c00 66 73 65 74 3b 0a 20 20 2f 2a 20 45 56 49 44 45  fset;.  /* EVIDE
12c10 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d  NCE-OF: R-28594-
12c20 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79  02890 The one-by
12c30 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65  te flag at offse
12c40 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20  t 0 indicating. 
12c50 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
12c60 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 69  age type. */.  i
12c70 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  f( decodeFlags(p
12c80 50 61 67 65 2c 20 64 61 74 61 5b 30 5d 29 20 29  Page, data[0]) )
12c90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12ca0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
12cb0 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61  (pPage);.  }.  a
12cc0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
12cd0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
12ce0 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
12cf0 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  6 );.  pPage->ma
12d00 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
12d10 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
12d20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  );.  pPage->nOve
12d30 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61  rflow = 0;.  pPa
12d40 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
12d50 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
12d60 74 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63  t + 8 + pPage->c
12d70 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 70  hildPtrSize;.  p
12d80 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
12d90 20 64 61 74 61 20 2b 20 70 50 61 67 65 2d 3e 63   data + pPage->c
12da0 68 69 6c 64 50 74 72 53 69 7a 65 20 2b 20 38 3b  hildPtrSize + 8;
12db0 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
12dc0 6e 64 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  nd = pPage->aDat
12dd0 61 20 2b 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  a + pBt->usableS
12de0 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  ize;.  pPage->aD
12df0 61 74 61 4f 66 73 74 20 3d 20 70 50 61 67 65 2d  ataOfst = pPage-
12e00 3e 61 44 61 74 61 20 2b 20 70 50 61 67 65 2d 3e  >aData + pPage->
12e10 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
12e20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
12e30 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68  R-37002-32774 Th
12e40 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
12e50 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67  er at offset 3 g
12e60 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75  ives the.  ** nu
12e70 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
12e80 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
12e90 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67  pPage->nCell = g
12ea0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 33 5d  et2byte(&data[3]
12eb0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
12ec0 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
12ed0 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20  t) ){.    /* To 
12ee0 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
12ef0 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
12f00 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
12f10 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72  corrupt */.    r
12f20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
12f30 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
12f40 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  ;.  }.  testcase
12f50 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
12f60 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a  MX_CELL(pBt) );.
12f70 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
12f80 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20  : R-24089-57979 
12f90 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69  If a page contai
12fa0 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69  ns no cells (whi
12fb0 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20  ch is only.  ** 
12fc0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72  possible for a r
12fd0 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74 61  oot page of a ta
12fe0 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ble that contain
12ff0 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20  s no rows) then 
13000 74 68 65 0a 20 20 2a 2a 20 6f 66 66 73 65 74 20  the.  ** offset 
13010 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
13020 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71  ent area will eq
13030 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a  ual the page siz
13040 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 2a 2a  e minus the.  **
13050 20 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76   bytes of reserv
13060 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 61  ed space. */.  a
13070 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
13080 65 6c 6c 3e 30 0a 20 20 20 20 20 20 20 7c 7c 20  ell>0.       || 
13090 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
130a0 26 64 61 74 61 5b 35 5d 29 3d 3d 70 42 74 2d 3e  &data[5])==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 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
30290 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
302a0 69 66 20 63 75 72 73 6f 72 20 70 43 75 72 20 64  if cursor pCur d
302b0 6f 65 73 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  oes not point to
302c0 20 61 20 76 61 6c 69 64 20 72 6f 77 2e 0a 2a 2a   a valid row..**
302d0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
302e0 43 75 72 20 69 73 20 76 61 6c 69 64 2c 20 63 6f  Cur is valid, co
302f0 6e 66 69 67 75 72 65 20 69 74 20 73 6f 20 74 68  nfigure it so th
30300 61 74 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  at the next call
30310 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   to.** sqlite3Bt
30320 72 65 65 4e 65 78 74 28 29 20 69 73 20 61 20 6e  reeNext() is a n
30330 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  o-op..*/.#ifndef
30340 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
30350 44 4f 57 46 55 4e 43 0a 76 6f 69 64 20 73 71 6c  DOWFUNC.void sql
30360 69 74 65 33 42 74 72 65 65 53 6b 69 70 4e 65 78  ite3BtreeSkipNex
30370 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
30380 29 7b 0a 20 20 2f 2a 20 57 65 20 62 65 6c 69 65  ){.  /* We belie
30390 76 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ve that the curs
303a0 6f 72 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  or must always b
303b0 65 20 69 6e 20 74 68 65 20 76 61 6c 69 64 20 73  e in the valid s
303c0 74 61 74 65 20 77 68 65 6e 0a 20 20 2a 2a 20 74  tate when.  ** t
303d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
303e0 61 6c 6c 65 64 2c 20 62 75 74 20 74 68 65 20 70  alled, but the p
303f0 72 6f 6f 66 20 69 73 20 64 69 66 66 69 63 75 6c  roof is difficul
30400 74 2c 20 73 6f 20 77 65 20 61 64 64 20 61 6e 0a  t, so we add an.
30410 20 20 2a 2a 20 41 4c 57 61 59 53 28 29 20 74 65    ** ALWaYS() te
30420 73 74 20 6a 75 73 74 20 69 6e 20 63 61 73 65 20  st just in case 
30430 77 65 20 61 72 65 20 77 72 6f 6e 67 2e 20 2a 2f  we are wrong. */
30440 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43  .  if( ALWAYS(pC
30450 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
30460 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20  OR_VALID) ){.   
30470 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
30480 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b  CURSOR_SKIPNEXT;
30490 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e  .    pCur->skipN
304a0 65 78 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23  ext = 1;.  }.}.#
304b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
304c0 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20  OMIT_WINDOWFUNC 
304d0 2a 2f 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  */../* Move the 
304e0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
304f0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
30500 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
30510 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
30520 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
30530 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
30540 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
30550 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
30560 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
30570 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
30580 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
30590 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
305a0 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
305b0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
305c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
305d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
305e0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
305f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
30600 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
30610 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
30620 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
30630 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
30640 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
30650 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
30660 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
30670 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
30680 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
30690 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75  ->eState && (pCu
306a0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
306b0 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
306c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
306d0 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
306e0 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
306f0 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
30700 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
30710 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
30720 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
30730 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
30740 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
30750 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
30760 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
30770 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
30780 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
30790 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
307a0 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
307b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
307c0 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70  ert( pCur->ix==p
307d0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
307e0 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l-1 );.    asser
307f0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
30800 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  leaf );.#endif. 
30810 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30820 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
30830 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
30840 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
30850 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
30860 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
30870 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
30880 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
30890 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  0;.    rc = move
308a0 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
308b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
308c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
308d0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
308e0 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b   |= BTCF_AtLast;
308f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30900 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
30910 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74   &= ~BTCF_AtLast
30920 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
30930 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  if( rc==SQLITE_E
30940 4d 50 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65  MPTY ){.    asse
30950 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
30960 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70  ot==0 || pCur->p
30970 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
30980 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  ;.    *pRes = 1;
30990 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
309a0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
309b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
309c0 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
309d0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
309e0 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74   an entry near t
309f0 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69  he key .** speci
30a00 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20  fied by pIdxKey 
30a10 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74  or intKey.   Ret
30a20 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
30a30 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
30a40 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65  TKEY tables, the
30a50 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65   intKey paramete
30a60 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78  r is used.  pIdx
30a70 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Key .** must be 
30a80 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78  NULL.  For index
30a90 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79   tables, pIdxKey
30aa0 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74   is used and int
30ab0 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  Key.** is ignore
30ac0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
30ad0 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
30ae0 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
30af0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
30b00 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
30b10 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
30b20 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
30b30 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
30b40 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
30b50 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
30b60 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
30b70 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
30b80 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
30b90 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
30ba0 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72  **.** An integer
30bb0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
30bc0 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20   *pRes which is 
30bd0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
30be0 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
30bf0 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
30c00 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  y to which the c
30c10 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69  ursor is .** poi
30c20 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e  nting.  The mean
30c30 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ing of the integ
30c40 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  er written into.
30c50 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66  ** *pRes is as f
30c60 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
30c70 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
30c80 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
30c90 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
30ca0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
30cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30cc0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
30cd0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f  intKey/pIdxKey o
30ce0 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  r if the table i
30cf0 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20  s empty.**      
30d00 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
30d10 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68  the cursor is th
30d20 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69  erefore left poi
30d30 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  nt to nothing..*
30d40 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d  *.**     *pRes==
30d50 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72  0     The cursor
30d60 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
30d70 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
30d80 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
30d90 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d         exactly m
30da0 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49  atches intKey/pI
30db0 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  dxKey..**.**    
30dc0 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
30dd0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
30de0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
30df0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
30e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
30e10 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e  s larger than in
30e20 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
30e30 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61  .** For index ta
30e40 62 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65  bles, the pIdxKe
30e50 79 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20  y->eqSeen field 
30e60 69 73 20 73 65 74 20 74 6f 20 31 20 69 66 20 74  is set to 1 if t
30e70 68 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61  here.** exists a
30e80 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  n entry in the t
30e90 61 62 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c  able that exactl
30ea0 79 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65  y matches pIdxKe
30eb0 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  y.  .*/.int sqli
30ec0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
30ed0 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
30ee0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
30ef0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
30f00 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
30f10 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
30f20 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e   *pIdxKey, /* Un
30f30 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
30f40 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79   */.  i64 intKey
30f50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
30f60 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20  * The table key 
30f70 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
30f80 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
30f90 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
30fa0 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
30fb0 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
30fc0 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
30fd0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
30fe0 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
30ff0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
31000 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d   rc;.  RecordCom
31010 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70  pare xRecordComp
31020 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  are;..  assert( 
31030 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
31040 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
31050 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
31060 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
31070 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
31080 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
31090 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Res );.  assert(
310a0 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
310b0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
310c0 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
310d0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
310e0 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70  RSOR_VALID || (p
310f0 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
31100 72 2d 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29  r->curIntKey!=0)
31110 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
31120 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
31130 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
31140 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
31150 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
31160 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
31170 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
31180 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
31190 6b 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b  k */.  if( pIdxK
311a0 65 79 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72  ey==0.   && pCur
311b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
311c0 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d  _VALID && (pCur-
311d0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
311e0 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20  _ValidNKey)!=0. 
311f0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
31200 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
31210 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
31220 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
31230 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31240 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
31250 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e  ur->info.nKey<in
31260 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66  tKey ){.      if
31270 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
31280 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29  s & BTCF_AtLast)
31290 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  !=0 ){.        *
312a0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
312b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
312c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
312d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71     /* If the req
312e0 75 65 73 74 65 64 20 6b 65 79 20 69 73 20 6f 6e  uested key is on
312f0 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  e more than the 
31300 70 72 65 76 69 6f 75 73 20 6b 65 79 2c 20 74 68  previous key, th
31310 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 79 20  en.      ** try 
31320 74 6f 20 67 65 74 20 74 68 65 72 65 20 75 73 69  to get there usi
31330 6e 67 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  ng sqlite3BtreeN
31340 65 78 74 28 29 20 72 61 74 68 65 72 20 74 68 61  ext() rather tha
31350 6e 20 61 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a  n a full.      *
31360 2a 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e  * binary search.
31370 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74    This is an opt
31380 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20  imization only. 
31390 20 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   The correct ans
313a0 77 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  wer.      ** is 
313b0 73 74 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77  still obtained w
313c0 69 74 68 6f 75 74 20 74 68 69 73 20 63 61 73 65  ithout this case
313d0 2c 20 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20  , only a little 
313e0 6d 6f 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a  more slowely */.
313f0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
31400 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74  info.nKey+1==int
31410 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Key ){.        *
31420 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
31430 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
31440 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29  reeNext(pCur, 0)
31450 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
31460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31470 20 20 20 20 20 20 20 20 20 67 65 74 43 65 6c 6c           getCell
31480 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
31490 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
314a0 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
314b0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
314c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
314d0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
314e0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
314f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
31500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
31510 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
31520 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31530 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
31540 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31550 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
31560 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a   if( pIdxKey ){.
31570 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
31580 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  re = sqlite3Vdbe
31590 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78  FindCompare(pIdx
315a0 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65  Key);.    pIdxKe
315b0 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a  y->errCode = 0;.
315c0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
315d0 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
315e0 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =1 .         || 
315f0 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
31600 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  _rc==0 .        
31610 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
31620 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20  ault_rc==-1.    
31630 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
31640 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
31650 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20   0; /* All keys 
31660 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a  are integers */.
31670 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
31680 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
31690 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
316a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50  ( rc==SQLITE_EMP
316b0 54 59 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  TY ){.      asse
316c0 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
316d0 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70  ot==0 || pCur->p
316e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
316f0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
31700 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
31710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
31720 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
31730 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
31740 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
31750 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
31760 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
31770 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
31780 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
31790 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
317a0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
317b0 65 6c 6c 20 3e 20 30 20 29 3b 0a 20 20 61 73 73  ell > 0 );.  ass
317c0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
317d0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
317e0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d  age[0]->intKey==
317f0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
31800 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
31810 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20  r->curIntKey || 
31820 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72  pIdxKey );.  for
31830 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77  (;;){.    int lw
31840 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a  r, upr, idx, c;.
31850 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
31860 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
31870 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
31880 65 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  e;.    u8 *pCell
31890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
318a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
318b0 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
318c0 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
318d0 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d  /..    /* pPage-
318e0 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67  >nCell must be g
318f0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
31900 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
31910 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
31920 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75  * the cursor wou
31930 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56  ld have been INV
31940 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74  ALID above and t
31950 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70  his for(;;) loop
31960 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e  .    ** not run.
31970 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
31980 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74  the root-page, t
31990 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68  hen the moveToCh
319a0 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  ild() routine.  
319b0 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20    ** would have 
319c0 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64  already detected
319d0 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20   db corruption. 
319e0 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65  Similarly, pPage
319f0 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
31a00 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28  the right kind (
31a10 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20  index or table) 
31a20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  of b-tree page. 
31a30 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
31a40 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
31a50 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29   or moveToRoot()
31a60 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65   call would have
31a70 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
31a80 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73  tion.  */.    as
31a90 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
31aa0 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ll>0 );.    asse
31ab0 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
31ac0 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20  y==(pIdxKey==0) 
31ad0 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  );.    lwr = 0;.
31ae0 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
31af0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73  >nCell-1;.    as
31b00 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d  sert( biasRight=
31b10 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d  =0 || biasRight=
31b20 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20  =1 );.    idx = 
31b30 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68  upr>>(1-biasRigh
31b40 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61  t); /* idx = bia
31b50 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28  sRight ? upr : (
31b60 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
31b70 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
31b80 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20  16)idx;.    if( 
31b90 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d  xRecordCompare==
31ba0 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  0 ){.      for(;
31bb0 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  ;){.        i64 
31bc0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
31bd0 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
31be0 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c  llPastPtr(pPage,
31bf0 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69   idx);.        i
31c00 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
31c10 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
31c20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d    while( 0x80 <=
31c30 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20   *(pCell++) ){. 
31c40 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
31c50 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61  Cell>=pPage->aDa
31c60 74 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  taEnd ){.       
31c70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
31c80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
31c90 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
31ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31cb0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
31cc0 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
31cd0 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43  pCell, (u64*)&nC
31ce0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
31cf0 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e   if( nCellKey<in
31d00 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
31d10 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
31d20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72           if( lwr
31d30 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20  >upr ){ c = -1; 
31d40 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20  break; }.       
31d50 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
31d60 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key>intKey ){.  
31d70 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
31d80 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  x-1;.          i
31d90 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20  f( lwr>upr ){ c 
31da0 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20  = +1; break; }. 
31db0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
31dc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31dd0 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79  nCellKey==intKey
31de0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43   );.          pC
31df0 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
31e00 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
31e10 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
31e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77 72  .            lwr
31e30 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20   = idx;.        
31e40 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
31e50 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20  next_layer;.    
31e60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31e70 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63           pCur->c
31e80 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
31e90 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20  ValidNKey;.     
31ea0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
31eb0 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
31ec0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  y;.            p
31ed0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
31ee0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
31ef0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
31f00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
31f10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
31f20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
31f30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31f40 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
31f50 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
31f60 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
31f70 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  x = (lwr+upr)/2;
31f80 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
31f90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72  }else{.      for
31fa0 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  (;;){.        in
31fb0 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a  t nCell;  /* Siz
31fc0 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20 63  e of the pCell c
31fd0 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ell in bytes */.
31fe0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
31ff0 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
32000 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20  pPage, idx);..  
32010 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78        /* The max
32020 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
32030 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33  age-size is 6553
32040 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65  6 bytes. This me
32050 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  ans that.       
32060 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   ** the maximum 
32070 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  number of record
32080 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e   bytes stored on
32090 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65   an index B-Tree
320a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
320b0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36   is less than 16
320c0 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61  384 bytes and ma
320d0 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
320e0 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20   2-byte.        
320f0 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20  ** varint. This 
32100 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
32110 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74  sed to attempt t
32120 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20  o avoid parsing 
32130 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
32140 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63  entire cell by c
32150 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20  hecking for the 
32160 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
32170 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20  record is .     
32180 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74     ** stored ent
32190 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65  irely within the
321a0 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20   b-tree page by 
321b0 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66  inspecting the f
321c0 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  irst .        **
321d0 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   2 bytes of the 
321e0 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cell..        */
321f0 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d  .        nCell =
32200 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20   pCell[0];.     
32210 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50     if( nCell<=pP
32220 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
32230 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  load ){.        
32240 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
32250 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63   runs if the rec
32260 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  ord-size field o
32270 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a  f the cell is a.
32280 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
32290 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20  gle byte varint 
322a0 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66  and the record f
322b0 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
322c0 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20  the main.       
322d0 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67     ** b-tree pag
322e0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
322f0 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
32300 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d  +nCell+1==pPage-
32310 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
32320 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
32330 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
32340 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31   (void*)&pCell[1
32350 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
32360 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
32370 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30  (pCell[1] & 0x80
32380 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ) .          && 
32390 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c  (nCell = ((nCell
323a0 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65  &0x7f)<<7) + pCe
323b0 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d  ll[1])<=pPage->m
323c0 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20  axLocal.        
323d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
323e0 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  The record-size 
323f0 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74  field is a 2 byt
32400 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
32410 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20   record .       
32420 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72     ** fits entir
32430 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ely on the main 
32440 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
32450 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
32460 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
32470 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +2==pPage->aData
32480 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
32490 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
324a0 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
324b0 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64  *)&pCell[2], pId
324c0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
324d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
324e0 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c  /* The record fl
324f0 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e  ows over onto on
32500 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
32510 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20  ow pages. In.   
32520 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
32530 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65  ase the whole ce
32540 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ll needs to be p
32550 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20  arsed, a buffer 
32560 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
32570 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73      ** and acces
32580 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20  sPayload() used 
32590 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
325a0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a  record into the.
325b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
325c0 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52  fer before VdbeR
325d0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
325e0 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20  an be called. . 
325f0 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
32600 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
32610 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70  record is corrup
32620 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43 6f  t, the xRecordCo
32630 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d 61  mpare routine ma
32640 79 20 72 65 61 64 0a 20 20 20 20 20 20 20 20 20  y read.         
32650 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76 61   ** up to two va
32660 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 20 65  rints past the e
32670 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  nd of the buffer
32680 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a 20  . An extra 18 . 
32690 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65           ** byte
326a0 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20  s of padding is 
326b0 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65  allocated at the
326c0 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66   end of the buff
326d0 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  er in.          
326e0 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68 61 70  ** case this hap
326f0 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  pens.  */.      
32700 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
32710 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  ey;.          u8
32720 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f   * const pCellBo
32730 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61  dy = pCell - pPa
32740 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
32750 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
32760 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
32770 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20  age, pCellBody, 
32780 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
32790 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
327a0 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
327b0 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
327c0 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c  testcase( nCell<
327d0 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  0 );   /* True i
327e0 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e  f key size is 2^
327f0 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20  32 or more */.  
32800 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
32810 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f  ( nCell==0 );  /
32820 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69  * Invalid key si
32830 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30  ze:  0x80 0x80 0
32840 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x00 */.         
32850 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
32860 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c  ==1 );  /* Inval
32870 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78  id key size:  0x
32880 38 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a  80 0x80 0x01 */.
32890 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
328a0 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20  se( nCell==2 ); 
328b0 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61   /* Minimum lega
328c0 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65  l index key size
328d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
328e0 28 20 6e 43 65 6c 6c 3c 32 20 7c 7c 20 6e 43 65  ( nCell<2 || nCe
328f0 6c 6c 2f 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73  ll/pCur->pBt->us
32900 61 62 6c 65 53 69 7a 65 3e 70 43 75 72 2d 3e 70  ableSize>pCur->p
32910 42 74 2d 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20  Bt->nPage ){.   
32920 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
32930 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
32940 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
32950 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
32960 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
32970 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32980 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
32990 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b  e3Malloc( nCell+
329a0 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  18 );.          
329b0 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
329c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
329d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
329e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
329f0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
32a00 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
32a10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75   }.          pCu
32a20 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
32a30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
32a40 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
32a50 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28  Cur, 0, nCell, (
32a60 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
32a70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20  CellKey, 0);.   
32a80 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
32a90 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56  Flags &= ~BTCF_V
32aa0 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20  alidOvfl;.      
32ab0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
32ac0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32ad0 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
32ae0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
32af0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
32b00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32b10 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
32b20 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
32b30 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c  pare(nCell, pCel
32b40 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
32b50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32b60 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
32b70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32b80 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20      assert( .   
32b90 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65           (pIdxKe
32ba0 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
32bb0 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d  TE_CORRUPT || c=
32bc0 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0).         && 
32bd0 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
32be0 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  e!=SQLITE_NOMEM 
32bf0 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  || pCur->pBtree-
32c00 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
32c10 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  d).        );.  
32c20 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
32c30 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
32c40 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
32c50 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b  }else if( c>0 ){
32c60 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
32c70 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
32c80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
32c90 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b   assert( c==0 );
32ca0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
32cb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
32cc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
32cd0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
32ce0 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
32cf0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
32d00 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20  xKey->errCode ) 
32d10 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
32d20 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
32d30 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
32d40 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
32d50 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77  }.        if( lw
32d60 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20  r>upr ) break;. 
32d70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
32d80 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
32d90 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
32da0 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
32db0 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a   = (lwr+upr)/2 *
32dc0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
32dd0 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
32de0 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65  =upr+1 || (pPage
32df0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
32e00 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20  ge->leaf) );.   
32e10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
32e20 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
32e30 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
32e40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
32e50 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50  Cur->ix<pCur->pP
32e60 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
32e70 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
32e80 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a  u16)idx;.      *
32e90 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
32ea0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
32eb0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
32ec0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
32ed0 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
32ee0 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d  r:.    if( lwr>=
32ef0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
32f00 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
32f10 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
32f20 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
32f30 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
32f40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
32f50 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
32f60 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
32f70 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
32f80 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
32f90 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  lwr;.    rc = mo
32fa0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
32fb0 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
32fc0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d   rc ) break;.  }
32fd0 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
32fe0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
32ff0 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ze = 0;.  assert
33000 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
33010 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
33020 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  fl)==0 );.  retu
33030 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
33040 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
33050 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
33060 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
33070 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
33080 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
33090 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
330a0 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
330b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
330c0 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
330d0 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
330e0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
330f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
33100 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
33110 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
33120 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
33130 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
33140 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
33150 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
33160 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
33170 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
33180 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
33190 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
331a0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
331b0 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
331c0 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
331d0 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
331e0 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
331f0 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
33200 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
33210 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
33220 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
33230 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
33240 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
33250 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
33260 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
33270 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 73 74 69  * Return an esti
33280 6d 61 74 65 20 66 6f 72 20 74 68 65 20 6e 75 6d  mate for the num
33290 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
332a0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 70 43  he table that pC
332b0 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e  ur is.** pointin
332c0 67 20 74 6f 2e 20 20 52 65 74 75 72 6e 20 61 20  g to.  Return a 
332d0 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
332e0 69 66 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 69  if no estimate i
332f0 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20  s currently .** 
33300 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36  available..*/.i6
33310 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  4 sqlite3BtreeRo
33320 77 43 6f 75 6e 74 45 73 74 28 42 74 43 75 72 73  wCountEst(BtCurs
33330 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 36 34  or *pCur){.  i64
33340 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61   n;.  u8 i;..  a
33350 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
33360 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
33370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
33380 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
33390 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
333a0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
333b0 2a 20 43 75 72 72 65 6e 74 6c 79 20 74 68 69 73  * Currently this
333c0 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 6f 6e   interface is on
333d0 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  ly called by the
333e0 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20   OP_IfSmaller.  
333f0 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69  ** opcode, and i
33400 74 20 74 68 61 74 20 63 61 73 65 20 74 68 65 20  t that case the 
33410 63 75 72 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61  cursor will alwa
33420 79 73 20 62 65 20 76 61 6c 69 64 20 61 6e 64 0a  ys be valid and.
33430 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73    ** will always
33440 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c 65 61 66   point to a leaf
33450 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20   node. */.  if( 
33460 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61  NEVER(pCur->eSta
33470 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
33480 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  ) ) return -1;. 
33490 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
334a0 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29  >pPage->leaf==0)
334b0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20   ) return -1;.. 
334c0 20 6e 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65   n = pCur->pPage
334d0 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 66 6f 72 28 69  ->nCell;.  for(i
334e0 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
334f0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a  e; i++){.    n *
33500 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  = pCur->apPage[i
33510 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20  ]->nCell;.  }.  
33520 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
33530 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
33540 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
33550 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
33560 61 74 61 62 61 73 65 2e 20 0a 2a 2a 20 52 65 74  atabase. .** Ret
33570 75 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a  urn value:.**.**
33580 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20      SQLITE_OK   
33590 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a 20       success.** 
335a0 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20     SQLITE_DONE  
335b0 20 20 20 20 63 75 72 73 6f 72 20 69 73 20 61 6c      cursor is al
335c0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 61  ready pointing a
335d0 74 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65  t the last eleme
335e0 6e 74 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77 69  nt.**    otherwi
335f0 73 65 20 20 20 20 20 20 20 20 73 6f 6d 65 20 6b  se        some k
33600 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f 63 63  ind of error occ
33610 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20  urred.**.** The 
33620 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74  main entry point
33630 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65   is sqlite3Btree
33640 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f  Next().  That ro
33650 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
33660 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
33670 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
33680 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ely incrementing
33690 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
336a0 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
336b0 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20  .** to the next 
336c0 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72  cell on the curr
336d0 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28  ent page.  The (
336e0 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78  slower) btreeNex
336f0 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f  t() helper.** ro
33700 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
33710 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
33720 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
33730 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
33740 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72   or.** to restor
33750 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
33760 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30 31 20  .** If bit 0x01 
33770 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d 65 6e  of the F argumen
33780 74 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65  t in sqlite3Btre
33790 65 4e 65 78 74 28 43 2c 46 29 20 69 73 20 31 2c  eNext(C,F) is 1,
337a0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63 75 72   then the.** cur
337b0 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  sor corresponds 
337c0 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
337d0 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
337e0 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
337f0 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66 20 74  .** skipped if t
33800 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  he SQL index had
33810 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20 69   been a unique i
33820 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61 72 67  ndex.  The F arg
33830 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20 68 69  ument.** is a hi
33840 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d  nt to the implem
33850 65 6e 74 2e 20 20 53 51 4c 69 74 65 20 62 74 72  ent.  SQLite btr
33860 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
33870 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  n does not use.*
33880 2a 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75 74  * this hint, but
33890 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f   COMDB2 does..*/
338a0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
338b0 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
338c0 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
338d0 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
338e0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
338f0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
33900 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
33910 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
33920 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
33930 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
33940 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
33950 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
33960 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
33970 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  dOvfl)==0 );.   
33980 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
33990 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
339a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
339b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
339c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
339d0 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
339e0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
339f0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
33a00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
33a10 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ONE;.    }.    i
33a20 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
33a30 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
33a40 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
33a50 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
33a60 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28  VALID;.      if(
33a70 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e   pCur->skipNext>
33a80 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
33a90 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
33aa0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
33ab0 3e 70 50 61 67 65 3b 0a 20 20 69 64 78 20 3d 20  >pPage;.  idx = 
33ac0 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20 69 66  ++pCur->ix;.  if
33ad0 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  ( !pPage->isInit
33ae0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6f   ){.    /* The o
33af0 6e 6c 79 20 6b 6e 6f 77 6e 20 77 61 79 20 66 6f  nly known way fo
33b00 72 20 74 68 69 73 20 74 6f 20 68 61 70 70 65 6e  r this to happen
33b10 20 69 73 20 66 6f 72 20 74 68 65 72 65 20 74 6f   is for there to
33b20 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 72 65 63   be a.    ** rec
33b30 75 72 73 69 76 65 20 53 51 4c 20 66 75 6e 63 74  ursive SQL funct
33b40 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 61 20  ion that does a 
33b50 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
33b60 20 61 73 20 70 61 72 74 20 6f 66 20 61 0a 20 20   as part of a.  
33b70 20 20 2a 2a 20 53 45 4c 45 43 54 20 77 68 69 63    ** SELECT whic
33b80 68 20 64 65 6c 65 74 65 73 20 63 6f 6e 74 65 6e  h deletes conten
33b90 74 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  t out from under
33ba0 20 61 6e 20 61 63 74 69 76 65 20 63 75 72 73 6f   an active curso
33bb0 72 0a 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f  r.    ** in a co
33bc0 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
33bd0 69 6c 65 20 77 68 65 72 65 20 74 68 65 20 74 61  ile where the ta
33be0 62 6c 65 20 62 65 69 6e 67 20 44 45 4c 45 54 45  ble being DELETE
33bf0 2d 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  -ed from.    ** 
33c00 68 61 73 20 70 61 67 65 73 20 69 6e 20 63 6f 6d  has pages in com
33c10 6d 6f 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  mon with the tab
33c20 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
33c30 2e 20 20 53 65 65 20 54 48 33 0a 20 20 20 20 2a  .  See TH3.    *
33c40 2a 20 6d 6f 64 75 6c 65 20 63 6f 76 31 2f 62 74  * module cov1/bt
33c50 72 65 65 37 38 2e 74 65 73 74 20 74 65 73 74 63  ree78.test testc
33c60 61 73 65 20 32 32 30 20 28 32 30 31 38 2d 30 36  ase 220 (2018-06
33c70 2d 30 38 29 20 66 6f 72 20 61 6e 0a 20 20 20 20  -08) for an.    
33c80 2a 2a 20 65 78 61 6d 70 6c 65 2e 20 2a 2f 0a 20  ** example. */. 
33c90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33ca0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
33cb0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
33cc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
33cd0 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20   corrupt, it is 
33ce0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
33cf0 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20   value of idx . 
33d00 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69   ** to be invali
33d10 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e  d here. This can
33d20 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61   only occur if a
33d30 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d   second cursor m
33d40 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65  odifies.  ** the
33d50 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73   page while curs
33d60 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69  or pCur is holdi
33d70 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ng a reference t
33d80 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a  o it. Which can.
33d90 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e    ** only happen
33da0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
33db0 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73   is corrupt in s
33dc0 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f 20  uch a way as to 
33dd0 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61  link the.  ** pa
33de0 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61  ge into more tha
33df0 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72  n one b-tree str
33e00 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73  ucture. */.  tes
33e10 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65  tcase( idx>pPage
33e20 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66  ->nCell );..  if
33e30 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( idx>=pPage->nC
33e40 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ell ){.    if( !
33e50 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
33e60 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
33e70 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
33e80 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
33e90 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
33ea0 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
33eb0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
33ec0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
33ed0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
33ee0 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
33ef0 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70   do{.      if( p
33f00 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
33f10 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
33f20 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
33f30 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
33f40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
33f50 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
33f60 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
33f70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
33f80 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
33f90 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
33fa0 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  r->ix>=pPage->nC
33fb0 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ell );.    if( p
33fc0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
33fd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
33fe0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
33ff0 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  ur, 0);.    }els
34000 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
34010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
34020 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
34030 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
34040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
34060 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
34070 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
34080 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
34090 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
340a0 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  Cur, int flags){
340b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
340c0 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  e;.  UNUSED_PARA
340d0 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20  METER( flags ); 
340e0 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44   /* Used in COMD
340f0 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76  B2 but not nativ
34100 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 61 73  e SQLite */.  as
34110 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
34120 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
34130 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
34140 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31  s==0 || flags==1
34150 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
34160 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
34170 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
34180 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
34190 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
341a0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
341b0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
341c0 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65  ID ) return btre
341d0 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20 70  eNext(pCur);.  p
341e0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
341f0 67 65 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75  ge;.  if( (++pCu
34200 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e  r->ix)>=pPage->n
34210 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72  Cell ){.    pCur
34220 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75  ->ix--;.    retu
34230 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
34240 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  r);.  }.  if( pP
34250 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
34260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34270 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
34280 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
34290 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
342a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  .}../*.** Step t
342b0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
342c0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
342d0 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
342e0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
342f0 52 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a  Return values:.*
34300 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
34310 4f 4b 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a  OK     success.*
34320 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e  *     SQLITE_DON
34330 45 20 20 20 74 68 65 20 63 75 72 73 6f 72 20 69  E   the cursor i
34340 73 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65  s already on the
34350 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f   first element o
34360 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20  f the table.**  
34370 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20     otherwise    
34380 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72   some kind of er
34390 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a  ror occurred.**.
343a0 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
343b0 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
343c0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
343d0 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65  ).  That routine
343e0 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a   is optimized.**
343f0 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
34400 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64  case of merely d
34410 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ecrementing the 
34420 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43  cell counter BtC
34430 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74  ursor.aiIdx.** t
34440 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  o the previous c
34450 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65  ell on the curre
34460 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73  nt page.  The (s
34470 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76  lower) btreePrev
34480 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72  ious().** helper
34490 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
344a0 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65  ed when it is ne
344b0 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20  cessary to move 
344c0 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
344d0 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73  age.** or to res
344e0 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e  tore the cursor.
344f0 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78  .**.** If bit 0x
34500 30 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75  01 of the F argu
34510 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42  ment to sqlite3B
34520 74 72 65 65 50 72 65 76 69 6f 75 73 28 43 2c 46  treePrevious(C,F
34530 29 20 69 73 20 31 2c 20 74 68 65 6e 0a 2a 2a 20  ) is 1, then.** 
34540 74 68 65 20 63 75 72 73 6f 72 20 63 6f 72 72 65  the cursor corre
34550 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
34560 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20   index and this 
34570 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
34580 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70  ve been.** skipp
34590 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e  ed if the SQL in
345a0 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75  dex had been a u
345b0 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68  nique index.  Th
345c0 65 20 46 20 61 72 67 75 6d 65 6e 74 20 69 73 20  e F argument is 
345d0 61 0a 2a 2a 20 68 69 6e 74 20 74 6f 20 74 68 65  a.** hint to the
345e0 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 54 68 65   implement.  The
345f0 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 62   native SQLite b
34600 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
34610 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ion does not.** 
34620 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 62  use this hint, b
34630 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a  ut COMDB2 does..
34640 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
34650 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
34660 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
34670 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
34680 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
34690 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
346a0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
346b0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
346c0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
346d0 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
346e0 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
346f0 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
34700 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20  idNKey))==0 );. 
34710 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
34720 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
34730 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
34740 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
34750 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   ){.    rc = res
34760 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
34770 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
34780 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34790 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
347a0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
347b0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
347c0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
347d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
347e0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
347f0 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
34800 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d  _SKIPNEXT==pCur-
34810 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
34820 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
34830 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
34840 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
34850 69 70 4e 65 78 74 3c 30 20 29 20 72 65 74 75 72  ipNext<0 ) retur
34860 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
34870 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
34880 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
34890 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
348a0 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
348b0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
348c0 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
348d0 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d  ur->ix;.    rc =
348e0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
348f0 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
34900 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
34910 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
34920 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34930 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
34940 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  most(pCur);.  }e
34950 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
34960 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20  pCur->ix==0 ){. 
34970 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
34980 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
34990 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
349a0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
349b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
349c0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
349d0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
349e0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
349f0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
34a00 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
34a10 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ze==0 );.    ass
34a20 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
34a30 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c  lags & (BTCF_Val
34a40 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a  idOvfl))==0 );..
34a50 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a      pCur->ix--;.
34a60 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
34a70 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 66 28  ->pPage;.    if(
34a80 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
34a90 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
34aa0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
34ab0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
34ac0 73 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  s(pCur, 0);.    
34ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
34ae0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
34af0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
34b00 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
34b10 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
34b20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
34b30 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
34b40 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
34b50 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
34b60 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
34b70 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20  ==0 || flags==1 
34b80 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
34b90 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20  METER( flags ); 
34ba0 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44   /* Used in COMD
34bb0 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76  B2 but not nativ
34bc0 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 70 43  e SQLite */.  pC
34bd0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
34be0 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
34bf0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
34c00 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20  F_ValidNKey);.  
34c10 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
34c20 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72   = 0;.  if( pCur
34c30 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
34c40 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75  _VALID.   || pCu
34c50 72 2d 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20 70  r->ix==0.   || p
34c60 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66  Cur->pPage->leaf
34c70 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ==0.  ){.    ret
34c80 75 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75  urn btreePreviou
34c90 73 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70  s(pCur);.  }.  p
34ca0 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65 74  Cur->ix--;.  ret
34cb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
34cc0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
34cd0 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
34ce0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34cf0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
34d00 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
34d10 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
34d20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
34d30 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
34d40 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
34d50 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
34d60 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
34d70 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
34d80 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
34d90 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
34da0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
34db0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
34dc0 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
34dd0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
34de0 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
34df0 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
34e00 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
34e10 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
34e20 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
34e30 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
34e40 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
34e50 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
34e60 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
34e70 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  L in the event o
34e80 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  f an error..**.*
34e90 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
34ea0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
34eb0 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66  ot 0, then an ef
34ec0 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
34ed0 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
34ee0 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
34ef0 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
34f00 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
34f10 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
34f20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
34f30 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
34f40 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
34f50 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
34f60 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
34f70 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
34f80 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
34f90 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
34fa0 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72  If the eMode par
34fb0 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f  ameter is BTALLO
34fc0 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20  C_EXACT and the 
34fd0 6e 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73  nearby page exis
34fe0 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  ts.** anywhere o
34ff0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
35000 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
35010 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  anteed to be ret
35020 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d  urned.  If.** eM
35030 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c  ode is BTALLOC_L
35040 54 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  T then the page 
35050 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
35060 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
35070 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79  ual.** to nearby
35080 20 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67   if any such pag
35090 65 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d  e exists.  If eM
350a0 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41  ode is BTALLOC_A
350b0 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a  NY then there.**
350c0 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74   are no restrict
350d0 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61  ions on which pa
350e0 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ge is returned..
350f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
35100 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
35110 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
35120 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
35130 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   btree */.  MemP
35140 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
35150 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e     /* Store poin
35160 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ter to the alloc
35170 61 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a  ated page here *
35180 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c  /.  Pgno *pPgno,
35190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
351a0 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ore the page num
351b0 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  ber here */.  Pg
351c0 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20  no nearby,      
351d0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
351e0 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74  or a page near t
351f0 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20  his one */.  u8 
35200 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  eMode           
35210 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45      /* BTALLOC_E
35220 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54  XACT, BTALLOC_LT
35230 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  , or BTALLOC_ANY
35240 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
35250 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
35260 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
35270 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
35280 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
35290 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20  ist */.  u32 k; 
352a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
352b0 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
352c0 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
352d0 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
352e0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
352f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
35300 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
35310 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
35320 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
35330 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
35340 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
35350 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
35360 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
35370 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
35380 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20  =BTALLOC_ANY || 
35390 28 6e 65 61 72 62 79 3e 30 20 26 26 20 52 45 51  (nearby>0 && REQ
353a0 55 49 52 45 5f 50 54 52 4d 41 50 20 29 20 29 3b  UIRE_PTRMAP ) );
353b0 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d  .  pPage1 = pBt-
353c0 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67  >pPage1;.  mxPag
353d0 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  e = btreePagecou
353e0 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56  nt(pBt);.  /* EV
353f0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31  IDENCE-OF: R-051
35400 31 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62  19-02637 The 4-b
35410 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
35420 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
35430 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20   36.  ** stores 
35440 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c  stores the total
35450 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
35460 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
35470 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62  . */.  n = get4b
35480 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
35490 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63  ta[36]);.  testc
354a0 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31  ase( n==mxPage-1
354b0 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50   );.  if( n>=mxP
354c0 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
354d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
354e0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
354f0 20 45 6e 73 75 72 65 20 70 61 67 65 20 31 20 69   Ensure page 1 i
35500 73 20 77 72 69 74 61 62 6c 65 2e 20 54 68 69 73  s writable. This
35510 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 65   function will e
35520 69 74 68 65 72 20 63 68 61 6e 67 65 20 74 68 65  ither change the
35530 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20   number.  ** of 
35540 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 72 65  pages in the fre
35550 65 2d 6c 69 73 74 20 6f 72 20 74 68 65 20 73 69  e-list or the si
35560 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
35570 73 65 20 66 69 6c 65 2e 20 53 69 6e 63 65 20 62  se file. Since b
35580 6f 74 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 73  oth.  ** of thes
35590 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 69 6e 76  e operations inv
355a0 6f 6c 76 65 20 6d 6f 64 69 66 79 69 6e 67 20 70  olve modifying p
355b0 61 67 65 20 31 20 68 65 61 64 65 72 20 66 69 65  age 1 header fie
355c0 6c 64 73 2c 20 70 61 67 65 20 31 0a 20 20 2a 2a  lds, page 1.  **
355d0 20 77 69 6c 6c 20 64 65 66 69 6e 69 74 65 6c 79   will definitely
355e0 20 62 65 20 77 72 69 74 74 65 6e 20 62 79 20 74   be written by t
355f0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
35600 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 43   If this is an C
35610 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2a 2a 20 74  ONCURRENT.  ** t
35620 72 61 6e 73 61 63 74 69 6f 6e 2c 20 65 6e 73 75  ransaction, ensu
35630 72 65 20 74 68 65 20 42 74 72 65 65 50 74 72 6d  re the BtreePtrm
35640 61 70 20 73 74 72 75 63 74 75 72 65 20 68 61 73  ap structure has
35650 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e   been allocated.
35660 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
35670 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
35680 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
35690 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
356a0 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6e 3e 30  n rc;..  if( n>0
356b0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
356c0 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
356d0 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
356e0 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
356f0 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
35700 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
35710 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
35720 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
35730 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
35740 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
35750 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  by' */.    u32 n
35760 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a  Search = 0;   /*
35770 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   Count of the nu
35780 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20 61  mber of search a
35790 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a  ttempts */.    .
357a0 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d      /* If eMode=
357b0 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61  =BTALLOC_EXACT a
357c0 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
357d0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
357e0 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
357f0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
35800 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
35810 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
35820 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
35830 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
35840 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
35850 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
35860 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4d 6f 64   */.    if( eMod
35870 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
35880 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
35890 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 21 3d  ( ISAUTOVACUUM!=
358a0 49 53 43 4f 4e 43 55 52 52 45 4e 54 20 29 3b 0a  ISCONCURRENT );.
358b0 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f        if( ISAUTO
358c0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
358d0 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78    if( nearby<=mx
358e0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
358f0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
35900 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
35910 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
35920 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
35930 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
35940 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74           rc = pt
35950 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61  rmapGet(pBt, nea
35960 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b  rby, &eType, 0);
35970 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
35980 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
35990 20 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79           if( eTy
359a0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
359b0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AGE ){.         
359c0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
359d0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
359e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
359f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65  else{.        se
35a00 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
35a10 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
35a20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
35a30 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73  OC_LE ){.      s
35a40 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
35a50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
35a60 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
35a70 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
35a80 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
35a90 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
35aa0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
35ab0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
35ac0 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
35ad0 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
35ae0 20 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74    */.    put4byt
35af0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
35b00 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20  [36], n-1);..   
35b10 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74   /* The code wit
35b20 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  hin this loop is
35b30 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69   run only once i
35b40 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73  f the 'searchLis
35b50 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  t' variable.    
35b60 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20  ** is not true. 
35b70 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75  Otherwise, it ru
35b80 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
35b90 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74   trunk-page on t
35ba0 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c  he.    ** free-l
35bb0 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61  ist until the pa
35bc0 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  ge 'nearby' is l
35bd0 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
35be0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20  TALLOC_EXACT).  
35bf0 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20    ** or until a 
35c00 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27  page less than '
35c10 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
35c20 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
35c30 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20  OC_LT).    */.  
35c40 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72    do {.      pPr
35c50 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b  evTrunk = pTrunk
35c60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
35c70 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
35c80 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
35c90 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20  : R-01506-11053 
35ca0 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65  The first intege
35cb0 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20  r on a freelist 
35cc0 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20  trunk page.     
35cd0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67     ** is the pag
35ce0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
35cf0 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74 72  next freelist tr
35d00 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
35d10 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20  list or.        
35d20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20  ** zero if this 
35d30 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65 65  is the last free
35d40 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
35d50 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75   */.        iTru
35d60 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
35d70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
35d80 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
35d90 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  e{.        /* EV
35da0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38  IDENCE-OF: R-598
35db0 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62  41-13798 The 4-b
35dc0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
35dd0 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
35de0 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   32.        ** s
35df0 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20 6e  tores the page n
35e00 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
35e10 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
35e20 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f  reelist, or zero
35e30 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   if.        ** t
35e40 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
35e50 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  mpty. */.       
35e60 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
35e70 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
35e80 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  a[32]);.      }.
35e90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
35ea0 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29  iTrunk==mxPage )
35eb0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75  ;.      if( iTru
35ec0 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65  nk>mxPage || nSe
35ed0 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20  arch++ > n ){.  
35ee0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
35ef0 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
35f00 50 72 65 76 54 72 75 6e 6b 20 3f 20 70 50 72 65  PrevTrunk ? pPre
35f10 76 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31  vTrunk->pgno : 1
35f20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
35f30 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
35f40 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
35f50 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
35f60 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
35f70 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
35f80 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  {.        pTrunk
35f90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
35fa0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
35fb0 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  page;.      }.  
35fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75      assert( pTru
35fd0 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  nk!=0 );.      a
35fe0 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61  ssert( pTrunk->a
35ff0 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20  Data!=0 );.     
36000 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
36010 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54   R-13523-04394 T
36020 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65  he second intege
36030 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20  r on a freelist 
36040 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20  trunk page.     
36050 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65   ** is the numbe
36060 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70  r of leaf page p
36070 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f  ointers to follo
36080 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20  w. */.      k = 
36090 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
360a0 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
360b0 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21     if( k==0 && !
360c0 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20  searchList ){.  
360d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
360e0 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73  nk has no leaves
360f0 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73   and the list is
36100 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63   not being searc
36110 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  hed. .        **
36120 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   So extract the 
36130 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c  trunk page itsel
36140 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20  f and use it as 
36150 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20  the newly .     
36160 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
36170 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
36180 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75  assert( pPrevTru
36190 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nk==0 );.       
361a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
361b0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
361c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
361d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
361e0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
361f0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
36200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36210 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
36220 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
36230 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
36240 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
36250 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
36260 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
36270 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72  unk;.        pTr
36280 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
36290 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
362a0 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
362b0 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
362c0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
362d0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
362e0 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d  if( k>(u32)(pBt-
362f0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
36300 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  2) ){.        /*
36310 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f   Value of k is o
36320 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61  ut of range.  Da
36330 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
36340 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  n */.        rc 
36350 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
36360 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20  _PGNO(iTrunk);. 
36370 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
36380 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
36390 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
363a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
363b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
363c0 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
363d0 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79        && (nearby
363e0 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72  ==iTrunk || (iTr
363f0 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  unk<nearby && eM
36400 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
36410 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
36420 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
36430 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
36440 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
36450 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
36460 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
36470 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
36480 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
36490 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
364a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
364b0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
364c0 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  k;.        *ppPa
364d0 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
364e0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
364f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
36500 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
36510 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
36520 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
36530 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
36540 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
36550 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
36560 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
36570 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
36580 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
36590 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
365a0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
365b0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
365c0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
365d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
365e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
365f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
36600 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
36610 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
36620 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
36630 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36640 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
36650 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
36660 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
36670 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
36680 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
36690 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
366a0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
366b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
366c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
366d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
366e0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
366f0 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
36700 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
36710 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
36720 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
36730 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
36740 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
36750 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
36760 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
36770 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
36780 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
36790 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
367a0 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
367b0 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
367c0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
367d0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
367e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
367f0 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
36800 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
36810 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
36820 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b  RUPT_PGNO(iTrunk
36830 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
36840 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
36850 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
36860 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73   }.          tes
36870 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b  tcase( iNewTrunk
36880 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
36890 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
368a0 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
368b0 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
368c0 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
368d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
368e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
368f0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
36900 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
36910 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
36920 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
36930 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
36940 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
36950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
36960 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36970 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
36980 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
36990 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
369a0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
369b0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
369c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
369d0 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
369e0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
369f0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
36a00 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
36a10 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
36a20 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
36a30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
36a40 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
36a50 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
36a60 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
36a70 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
36a80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
36a90 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
36aa0 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
36ab0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
36ac0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
36ad0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
36ae0 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
36af0 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
36b00 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
36b10 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
36b20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
36b30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
36b40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
36b50 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
36b60 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
36b70 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
36b80 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
36b90 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
36ba0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
36bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
36bc0 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
36bd0 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
36be0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
36bf0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
36c00 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
36c10 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
36c20 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
36c30 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
36c40 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
36c50 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
36c60 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
36c70 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  dif.      }else 
36c80 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20  if( k>0 ){.     
36c90 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
36ca0 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
36cb0 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  unk */.        u
36cc0 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  32 closest;.    
36cd0 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
36ce0 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
36cf0 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
36d00 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
36d10 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
36d20 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
36d30 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20  u32 i;.         
36d40 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
36d50 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64          if( eMod
36d60 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
36d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
36d80 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
36d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
36da0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
36db0 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a  &aData[8+i*4]);.
36dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
36dd0 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20  ( iPage<=nearby 
36de0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
36df0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
36e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
36e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
36e30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
36e40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
36e50 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20    int dist;.    
36e60 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73          dist = s
36e70 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
36e80 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
36e90 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
36ea0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
36eb0 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
36ec0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
36ed0 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  d2 = sqlite3AbsI
36ee0 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
36ef0 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
36f00 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
36f10 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
36f20 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
36f30 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
36f40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
36f50 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
36f60 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
36f70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
36f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
36f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
36fa0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
36fb0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
36fc0 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
36fd0 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
36fe0 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  t*4]);.        t
36ff0 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
37000 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
37010 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61    if( iPage>mxPa
37020 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
37030 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
37040 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29  UPT_PGNO(iTrunk)
37050 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
37060 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
37070 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
37080 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
37090 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
370a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
370b0 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
370c0 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65     || (iPage==ne
370d0 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e  arby || (iPage<n
370e0 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
370f0 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
37100 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
37110 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74     int noContent
37120 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
37130 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
37140 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
37150 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
37160 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
37170 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
37180 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
37190 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
371a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
371b0 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
371c0 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
371d0 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
371e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
371f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
37200 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
37210 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
37220 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
37230 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
37240 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
37250 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
37260 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
37270 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
37280 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
37290 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
372a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
372b0 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
372c0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
372d0 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74   noContent = !bt
372e0 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
372f0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50  (pBt, *pPgno)? P
37300 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
37310 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  NT : 0;.        
37320 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
37330 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a  nusedPage(pBt, *
37340 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
37350 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
37360 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
37370 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37380 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
37390 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
373a0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
373b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
373c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
373d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
373e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
373f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
37400 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
37410 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
37420 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
37430 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
37440 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
37450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
37460 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
37470 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
37480 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
37490 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
374a0 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
374b0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
374c0 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
374d0 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70   freelist, so ap
374e0 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20  pend a new page 
374f0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  to the.    ** da
37500 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20  tabase image..  
37510 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d    **.    ** Norm
37520 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20  ally, new pages 
37530 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
37540 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72  s block can be r
37550 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
37560 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c  e.    ** pager l
37570 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
37580 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
37590 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e  set. This preven
375a0 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ts the pager.   
375b0 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20   ** from trying 
375c0 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
375d0 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  s content from d
375e0 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  isk. However, if
375f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
37600 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
37610 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20  has already run 
37620 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72  one or more incr
37630 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20  emental-vacuum. 
37640 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65     ** steps, the
37650 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  n the page we ar
37660 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63  e about to alloc
37670 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ate may contain 
37680 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74  content.    ** t
37690 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
376a0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
376b0 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74  a rollback. In t
376c0 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20  his case, do.   
376d0 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20   ** not set the 
376e0 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e  no-content flag.
376f0 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65   This causes the
37700 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61   pager to load a
37710 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nd journal.    *
37720 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  * the current pa
37730 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72  ge content befor
37740 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74  e overwriting it
37750 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
37760 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
37770 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74  ger will not act
37780 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f  ually attempt to
37790 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c   load or journal
377a0 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74   .    ** content
377b0 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68   for any page th
377c0 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c  at really does l
377d0 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ie past the end 
377e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
377f0 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64      ** file on d
37800 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65  isk. So the effe
37810 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67  cts of disabling
37820 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
37830 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
37840 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e   ** here are con
37850 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70  fined to those p
37860 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65  ages that lie be
37870 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66  tween the end of
37880 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
37890 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74  base image and t
378a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
378b0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
378c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43   */.    int bNoC
378d0 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e  ontent = (0==IfN
378e0 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44  otOmitAV(pBt->bD
378f0 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47  oTruncate))? PAG
37900 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
37910 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  :0;..    rc = sq
37920 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
37930 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
37940 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
37950 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
37960 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
37970 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  .    if( pBt->nP
37980 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
37990 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42  E_PAGE(pBt) ) pB
379a0 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66  t->nPage++;..#if
379b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
379c0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
379d0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
379e0 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
379f0 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
37a00 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Page) ){.      /
37a10 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
37a20 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
37a30 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
37a40 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
37a50 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
37a60 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
37a70 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
37a80 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
37a90 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
37aa0 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
37ab0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
37ac0 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
37ad0 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
37ae0 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
37af0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
37b00 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
37b10 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
37b20 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
37b30 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
37b40 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50  age)\n", pBt->nP
37b50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73  age));.      ass
37b60 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ert( pBt->nPage!
37b70 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
37b80 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
37b90 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
37ba0 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42  usedPage(pBt, pB
37bb0 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
37bc0 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
37bd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
37be0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
37c00 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
37c10 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
37c20 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
37c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
37c40 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
37c50 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
37c60 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
37c70 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
37c80 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
37c90 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65  t) ){ pBt->nPage
37ca0 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
37cb0 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  if.    put4byte(
37cc0 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70  28 + (u8*)pBt->p
37cd0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42  Page1->aData, pB
37ce0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a  t->nPage);.    *
37cf0 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61  pPgno = pBt->nPa
37d00 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ge;..    assert(
37d10 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
37d20 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
37d30 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
37d40 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
37d50 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
37d60 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  ge, bNoContent);
37d70 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
37d80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
37d90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
37da0 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
37db0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
37dc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37dd0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
37de0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
37df0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
37e00 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
37e10 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
37e20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
37e30 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
37e40 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 43 4f   }..  assert( CO
37e50 52 52 55 50 54 5f 44 42 20 7c 7c 20 2a 70 50 67  RRUPT_DB || *pPg
37e60 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
37e70 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
37e80 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
37e90 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
37ea0 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
37eb0 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
37ec0 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  k);.  assert( rc
37ed0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
37ee0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
37ef0 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
37f00 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29  )->pDbPage)<=1 )
37f10 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
37f20 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70  SQLITE_OK || (*p
37f30 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
37f40 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
37f50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
37f60 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
37f70 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61   to add page iPa
37f80 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
37f90 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73  se file free-lis
37fa0 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  t. .** It is ass
37fb0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61  umed that the pa
37fc0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
37fd0 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20  y a part of the 
37fe0 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
37ff0 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   The value passe
38000 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
38010 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
38020 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74   function is opt
38030 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  ional..** If the
38040 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20   caller happens 
38050 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65  to have a pointe
38060 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  r to the MemPage
38070 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72   object .** corr
38080 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
38090 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69  e iPage handy, i
380a0 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73  t may pass it as
380b0 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75   the second valu
380c0 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  e. .** Otherwise
380d0 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55  , it may pass NU
380e0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70  LL..**.** If a p
380f0 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50  ointer to a MemP
38100 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61  age object is pa
38110 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
38120 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
38130 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
38140 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72  unt is not alter
38150 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
38160 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
38170 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53  nt freePage2(BtS
38180 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50  hared *pBt, MemP
38190 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50  age *pMemPage, P
381a0 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65  gno iPage){.  Me
381b0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
381c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
381d0 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74    /* Free-list t
381e0 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50  runk page */.  P
381f0 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20  gno iTrunk = 0; 
38200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38210 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
38220 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74  r of free-list t
38230 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20  runk page */ .  
38240 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
38250 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20  = pBt->pPage1;  
38260 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66      /* Local ref
38270 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
38280 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
38290 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
382a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
382b0 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d  e being freed. M
382c0 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  ay be NULL. */. 
382d0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
382e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
382f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
38300 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ode */.  int nFr
38310 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
38320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38330 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
38340 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d  f pages on free-
38350 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
38360 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
38370 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
38380 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
38390 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61  ORRUPT_DB || iPa
383a0 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
383b0 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
383c0 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
383d0 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69  Page );..  if( i
383e0 50 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20  Page<2 ) return 
383f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
38400 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50  KPT;.  if( pMemP
38410 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
38420 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
38430 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
38440 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
38450 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
38460 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
38470 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
38480 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  e);.  }..  /* In
38490 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
384a0 20 70 61 67 65 20 6