/ Hex Artifact Content
Login

Artifact 63ae7953340839b84a1462f01414debebf8a178867085189280698f0cf724219:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
3a80: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
3a90: 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  ENT./*.** The fo
3aa0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3ab0: 65 20 2d 20 42 74 72 65 65 50 74 72 6d 61 70 20  e - BtreePtrmap 
3ac0: 2d 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e 2d  - stores the in-
3ad0: 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 20 6d  memory pointer m
3ae0: 61 70 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 6e  ap.** used for n
3af0: 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70  ewly allocated p
3b00: 61 67 65 73 20 69 6e 20 43 4f 4e 43 55 52 52 45  ages in CONCURRE
3b10: 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  NT transactions.
3b20: 20 53 75 63 68 20 70 61 67 65 73 20 61 72 65 0a   Such pages are.
3b30: 2a 2a 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61  ** always alloca
3b40: 74 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75  ted in a contigu
3b50: 6f 75 73 20 62 6c 6f 63 6b 20 28 66 72 6f 6d 20  ous block (from 
3b60: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
3b70: 69 6c 65 29 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ile) starting.**
3b80: 20 77 69 74 68 20 70 61 67 65 20 42 74 72 65 65   with page Btree
3b90: 50 74 72 6d 61 70 2e 69 46 69 72 73 74 2e 0a 2a  Ptrmap.iFirst..*
3ba0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
3bb0: 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 52   RollbackEntry R
3bc0: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 3b 0a 74 79  ollbackEntry;.ty
3bd0: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 74 72  pedef struct Ptr
3be0: 6d 61 70 45 6e 74 72 79 20 50 74 72 6d 61 70 45  mapEntry PtrmapE
3bf0: 6e 74 72 79 3b 0a 73 74 72 75 63 74 20 50 74 72  ntry;.struct Ptr
3c00: 6d 61 70 45 6e 74 72 79 20 7b 0a 20 20 50 67 6e  mapEntry {.  Pgn
3c10: 6f 20 70 61 72 65 6e 74 3b 0a 20 20 75 38 20 65  o parent;.  u8 e
3c20: 54 79 70 65 3b 0a 7d 3b 0a 73 74 72 75 63 74 20  Type;.};.struct 
3c30: 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 7b 0a  RollbackEntry {.
3c40: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 50    Pgno pgno;.  P
3c50: 67 6e 6f 20 70 61 72 65 6e 74 3b 0a 20 20 75 38  gno parent;.  u8
3c60: 20 65 54 79 70 65 3b 0a 7d 3b 0a 73 74 72 75 63   eType;.};.struc
3c70: 74 20 42 74 72 65 65 50 74 72 6d 61 70 20 7b 0a  t BtreePtrmap {.
3c80: 20 20 50 67 6e 6f 20 69 46 69 72 73 74 3b 20 20    Pgno iFirst;  
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 20 20 2f 2a 20 46 69 72 73 74 20 6e 65 77 20 70    /* First new p
3cb0: 61 67 65 20 6e 75 6d 62 65 72 20 61 50 74 72 5b  age number aPtr[
3cc0: 30 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 50 74  0] */..  int nPt
3cd0: 72 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  rAlloc;         
3ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
3cf0: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 50  cated size of aP
3d00: 74 72 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  tr[] array */.  
3d10: 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 61 50 74  PtrmapEntry *aPt
3d20: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
3d30: 2f 2a 20 41 72 72 61 79 20 6f 66 20 70 61 72 65  /* Array of pare
3d40: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  nt page numbers 
3d50: 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 76 70 74 3b  */..  int nSvpt;
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73 69        /* Used si
3d80: 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d 20 61 72  ze of aSvpt[] ar
3d90: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 76  ray */.  int nSv
3da0: 70 74 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  ptAlloc;        
3db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
3dc0: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 53  cated size of aS
3dd0: 76 70 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 2a  vpt[] */.  int *
3de0: 61 53 76 70 74 3b 20 20 20 20 20 20 20 20 20 20  aSvpt;          
3df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
3e00: 72 73 74 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20  rst aRollback[] 
3e10: 65 6e 74 72 79 20 66 6f 72 20 73 61 76 65 70 6f  entry for savepo
3e20: 69 6e 74 20 69 20 2a 2f 0a 0a 20 20 69 6e 74 20  int i */..  int 
3e30: 6e 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  nRollback;      
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
3e50: 73 65 64 20 73 69 7a 65 20 6f 66 20 61 52 6f 6c  sed size of aRol
3e60: 6c 62 61 63 6b 5b 5d 20 61 72 72 61 79 20 2a 2f  lback[] array */
3e70: 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c 62 61 63 6b  .  int nRollback
3e80: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
3e90: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
3ea0: 73 69 7a 65 20 6f 66 20 61 52 6f 6c 6c 62 61 63  size of aRollbac
3eb0: 6b 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 52  k[] array */.  R
3ec0: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 2a 61 52  ollbackEntry *aR
3ed0: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 2f  ollback;       /
3ee0: 2a 20 41 72 72 61 79 20 6f 66 20 72 6f 6c 6c 62  * Array of rollb
3ef0: 61 63 6b 20 65 6e 74 72 69 65 73 20 2a 2f 0a 7d  ack entries */.}
3f00: 3b 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  ;../* !defined(S
3f10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
3f20: 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 49 66 20  RRENT).**.** If 
3f30: 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
3f40: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
3f50: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 42 74 72   or equal to Btr
3f60: 65 65 50 74 72 6d 61 70 2e 69 46 69 72 73 74 2c  eePtrmap.iFirst,
3f70: 20 0a 2a 2a 20 73 74 6f 72 65 20 61 6e 20 65 6e   .** store an en
3f80: 74 72 79 20 66 6f 72 20 69 74 20 69 6e 20 74 68  try for it in th
3f90: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 74  e pointer-map st
3fa0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
3fb0: 69 63 20 69 6e 74 20 62 74 72 65 65 50 74 72 6d  ic int btreePtrm
3fc0: 61 70 53 74 6f 72 65 28 0a 20 20 42 74 53 68 61  apStore(.  BtSha
3fd0: 72 65 64 20 2a 70 42 74 2c 0a 20 20 50 67 6e 6f  red *pBt,.  Pgno
3fe0: 20 70 67 6e 6f 2c 0a 20 20 75 38 20 65 54 79 70   pgno,.  u8 eTyp
3ff0: 65 2c 20 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e  e, .  Pgno paren
4000: 74 0a 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d  t.){.  BtreePtrm
4010: 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e  ap *pMap = pBt->
4020: 70 4d 61 70 3b 0a 20 20 69 66 28 20 70 67 6e 6f  pMap;.  if( pgno
4030: 3e 3d 70 4d 61 70 2d 3e 69 46 69 72 73 74 20 29  >=pMap->iFirst )
4040: 7b 0a 20 20 20 20 69 6e 74 20 69 45 6e 74 72 79  {.    int iEntry
4050: 20 3d 20 70 67 6e 6f 20 2d 20 70 4d 61 70 2d 3e   = pgno - pMap->
4060: 69 46 69 72 73 74 3b 0a 0a 20 20 20 20 2f 2a 20  iFirst;..    /* 
4070: 47 72 6f 77 20 74 68 65 20 61 50 74 72 5b 5d 20  Grow the aPtr[] 
4080: 61 72 72 61 79 20 61 73 20 72 65 71 75 69 72 65  array as require
4090: 64 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20  d */.    while( 
40a0: 69 45 6e 74 72 79 3e 3d 70 4d 61 70 2d 3e 6e 50  iEntry>=pMap->nP
40b0: 74 72 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  trAlloc ){.     
40c0: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70   int nNew = pMap
40d0: 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20 3f 20 70 4d  ->nPtrAlloc ? pM
40e0: 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 2a 32 20  ap->nPtrAlloc*2 
40f0: 3a 20 31 36 3b 0a 20 20 20 20 20 20 50 74 72 6d  : 16;.      Ptrm
4100: 61 70 45 6e 74 72 79 20 2a 61 4e 65 77 20 3d 20  apEntry *aNew = 
4110: 28 50 74 72 6d 61 70 45 6e 74 72 79 2a 29 73 71  (PtrmapEntry*)sq
4120: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
4130: 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61           pMap->a
4140: 50 74 72 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66  Ptr, nNew*sizeof
4150: 28 50 74 72 6d 61 70 45 6e 74 72 79 29 0a 20 20  (PtrmapEntry).  
4160: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
4170: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
4180: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4190: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
41a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
41b0: 74 20 6e 42 79 74 65 20 3d 20 28 6e 4e 65 77 2d  t nByte = (nNew-
41c0: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 29  pMap->nPtrAlloc)
41d0: 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45 6e  *sizeof(PtrmapEn
41e0: 74 72 79 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  try);.        me
41f0: 6d 73 65 74 28 26 61 4e 65 77 5b 70 4d 61 70 2d  mset(&aNew[pMap-
4200: 3e 6e 50 74 72 41 6c 6c 6f 63 5d 2c 20 30 2c 20  >nPtrAlloc], 0, 
4210: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
4220: 70 4d 61 70 2d 3e 61 50 74 72 20 3d 20 61 4e 65  pMap->aPtr = aNe
4230: 77 3b 0a 20 20 20 20 20 20 20 20 70 4d 61 70 2d  w;.        pMap-
4240: 3e 6e 50 74 72 41 6c 6c 6f 63 20 3d 20 6e 4e 65  >nPtrAlloc = nNe
4250: 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  w;.      }.    }
4260: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
4270: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 72 6f 6c  entry to the rol
4280: 6c 62 61 63 6b 20 6c 6f 67 20 69 66 20 72 65 71  lback log if req
4290: 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  uired */.    if(
42a0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 3e 30 20 26   pMap->nSvpt>0 &
42b0: 26 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e  & pMap->aPtr[iEn
42c0: 74 72 79 5d 2e 70 61 72 65 6e 74 20 29 7b 0a 20  try].parent ){. 
42d0: 20 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e       if( pMap->n
42e0: 52 6f 6c 6c 62 61 63 6b 3e 3d 70 4d 61 70 2d 3e  Rollback>=pMap->
42f0: 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 29  nRollbackAlloc )
4300: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4e  {.        int nN
4310: 65 77 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c  ew = pMap->nRoll
4320: 62 61 63 6b 20 3f 20 70 4d 61 70 2d 3e 6e 52 6f  back ? pMap->nRo
4330: 6c 6c 62 61 63 6b 2a 32 20 3a 20 31 36 3b 0a 20  llback*2 : 16;. 
4340: 20 20 20 20 20 20 20 52 6f 6c 6c 62 61 63 6b 45         RollbackE
4350: 6e 74 72 79 20 2a 61 4e 65 77 20 3d 20 28 52 6f  ntry *aNew = (Ro
4360: 6c 6c 62 61 63 6b 45 6e 74 72 79 2a 29 73 71 6c  llbackEntry*)sql
4370: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
4380: 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e            pMap->
4390: 61 52 6f 6c 6c 62 61 63 6b 2c 20 6e 4e 65 77 2a  aRollback, nNew*
43a0: 73 69 7a 65 6f 66 28 52 6f 6c 6c 62 61 63 6b 45  sizeof(RollbackE
43b0: 6e 74 72 79 29 0a 20 20 20 20 20 20 20 20 29 3b  ntry).        );
43c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65  .        if( aNe
43d0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
43e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
43f0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
4400: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
4410: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 20  pMap->aRollback 
4420: 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
4430: 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63    pMap->nRollbac
4440: 6b 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20  kAlloc = nNew;. 
4450: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4460: 0a 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52  ..      pMap->aR
4470: 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52  ollback[pMap->nR
4480: 6f 6c 6c 62 61 63 6b 5d 2e 70 67 6e 6f 20 3d 20  ollback].pgno = 
4490: 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70 4d 61 70  pgno;.      pMap
44a0: 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70  ->aRollback[pMap
44b0: 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e 70 61 72  ->nRollback].par
44c0: 65 6e 74 20 3d 20 70 4d 61 70 2d 3e 61 50 74 72  ent = pMap->aPtr
44d0: 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e 74 3b  [iEntry].parent;
44e0: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f  .      pMap->aRo
44f0: 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f  llback[pMap->nRo
4500: 6c 6c 62 61 63 6b 5d 2e 65 54 79 70 65 20 3d 20  llback].eType = 
4510: 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72  pMap->aPtr[iEntr
4520: 79 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 20 20  y].eType;.      
4530: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2b  pMap->nRollback+
4540: 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  +;.    }..    /*
4550: 20 55 70 64 61 74 65 20 74 68 65 20 61 50 74 72   Update the aPtr
4560: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
4570: 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72  pMap->aPtr[iEntr
4580: 79 5d 2e 70 61 72 65 6e 74 20 3d 20 70 61 72 65  y].parent = pare
4590: 6e 74 3b 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50  nt;.    pMap->aP
45a0: 74 72 5b 69 45 6e 74 72 79 5d 2e 65 54 79 70 65  tr[iEntry].eType
45b0: 20 3d 20 65 54 79 70 65 3b 0a 20 20 7d 0a 0a 20   = eType;.  }.. 
45c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
45d0: 4b 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65  K;.}../* !define
45e0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
45f0: 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20  NCURRENT).**.** 
4600: 4f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  Open savepoint i
4610: 53 61 76 65 70 6f 69 6e 74 2c 20 69 66 20 69 74  Savepoint, if it
4620: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
4630: 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  open..*/.static 
4640: 69 6e 74 20 62 74 72 65 65 50 74 72 6d 61 70 42  int btreePtrmapB
4650: 65 67 69 6e 28 42 74 53 68 61 72 65 64 20 2a 70  egin(BtShared *p
4660: 42 74 2c 20 69 6e 74 20 6e 53 76 70 74 29 7b 0a  Bt, int nSvpt){.
4670: 20 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70    BtreePtrmap *p
4680: 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b  Map = pBt->pMap;
4690: 0a 20 20 69 66 28 20 70 4d 61 70 20 26 26 20 6e  .  if( pMap && n
46a0: 53 76 70 74 3e 70 4d 61 70 2d 3e 6e 53 76 70 74  Svpt>pMap->nSvpt
46b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
46c0: 20 20 20 69 66 28 20 6e 53 76 70 74 3e 3d 70 4d     if( nSvpt>=pM
46d0: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 29  ap->nSvptAlloc )
46e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77  {.      int nNew
46f0: 20 3d 20 70 4d 61 70 2d 3e 6e 53 76 70 74 41 6c   = pMap->nSvptAl
4700: 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e 6e 53 76 70  loc ? pMap->nSvp
4710: 74 41 6c 6c 6f 63 2a 32 20 3a 20 31 36 3b 0a 20  tAlloc*2 : 16;. 
4720: 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d       int *aNew =
4730: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
4740: 28 70 4d 61 70 2d 3e 61 53 76 70 74 2c 20 73 69  (pMap->aSvpt, si
4750: 7a 65 6f 66 28 69 6e 74 29 20 2a 20 6e 4e 65 77  zeof(int) * nNew
4760: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65  );.      if( aNe
4770: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
4780: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
4790: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
47a0: 7b 0a 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e  {.        pMap->
47b0: 61 53 76 70 74 20 3d 20 61 4e 65 77 3b 0a 20 20  aSvpt = aNew;.  
47c0: 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 53 76 70        pMap->nSvp
47d0: 74 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20  tAlloc = nNew;. 
47e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
47f0: 20 20 66 6f 72 28 69 3d 70 4d 61 70 2d 3e 6e 53    for(i=pMap->nS
4800: 76 70 74 3b 20 69 3c 6e 53 76 70 74 3b 20 69 2b  vpt; i<nSvpt; i+
4810: 2b 29 7b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e  +){.      pMap->
4820: 61 53 76 70 74 5b 69 5d 20 3d 20 70 4d 61 70 2d  aSvpt[i] = pMap-
4830: 3e 6e 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20  >nRollback;.    
4840: 7d 0a 20 20 20 20 70 4d 61 70 2d 3e 6e 53 76 70  }.    pMap->nSvp
4850: 74 20 3d 20 6e 53 76 70 74 3b 0a 20 20 7d 0a 0a  t = nSvpt;.  }..
4860: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4870: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e  OK;.}../* !defin
4880: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
4890: 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a  ONCURRENT).**.**
48a0: 20 52 6f 6c 6c 62 61 63 6b 20 28 69 66 20 6f 70   Rollback (if op
48b0: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
48c0: 42 41 43 4b 29 20 6f 72 20 72 65 6c 65 61 73 65  BACK) or release
48d0: 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50 4f 49   (if op==SAVEPOI
48e0: 4e 54 5f 52 45 4c 45 41 53 45 29 0a 2a 2a 20 73  NT_RELEASE).** s
48f0: 61 76 65 70 6f 69 6e 74 20 69 53 76 70 74 2e 0a  avepoint iSvpt..
4900: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4910: 74 72 65 65 50 74 72 6d 61 70 45 6e 64 28 42 74  treePtrmapEnd(Bt
4920: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74  Shared *pBt, int
4930: 20 6f 70 2c 20 69 6e 74 20 69 53 76 70 74 29 7b   op, int iSvpt){
4940: 0a 20 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a  .  BtreePtrmap *
4950: 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d 61 70  pMap = pBt->pMap
4960: 3b 0a 20 20 69 66 28 20 70 4d 61 70 20 29 7b 0a  ;.  if( pMap ){.
4970: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
4980: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
4990: 43 4b 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  CK || op==SAVEPO
49a0: 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 3b 0a 20  INT_RELEASE );. 
49b0: 20 20 20 61 73 73 65 72 74 28 20 69 53 76 70 74     assert( iSvpt
49c0: 3e 3d 30 20 7c 7c 20 28 69 53 76 70 74 3d 3d 2d  >=0 || (iSvpt==-
49d0: 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
49e0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
49f0: 20 20 20 20 69 66 28 20 69 53 76 70 74 3c 30 20      if( iSvpt<0 
4a00: 29 7b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e  ){.      pMap->n
4a10: 53 76 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Svpt = 0;.      
4a20: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20  pMap->nRollback 
4a30: 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  = 0;.      memse
4a40: 74 28 70 4d 61 70 2d 3e 61 50 74 72 2c 20 30 2c  t(pMap->aPtr, 0,
4a50: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 2a 20   sizeof(Pgno) * 
4a60: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 29  pMap->nPtrAlloc)
4a70: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4a80: 69 53 76 70 74 3c 70 4d 61 70 2d 3e 6e 53 76 70  iSvpt<pMap->nSvp
4a90: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  t ){.      if( o
4aa0: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
4ab0: 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
4ac0: 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
4ad0: 20 66 6f 72 28 69 69 3d 70 4d 61 70 2d 3e 6e 52   for(ii=pMap->nR
4ae0: 6f 6c 6c 62 61 63 6b 2d 31 3b 20 69 69 3e 3d 70  ollback-1; ii>=p
4af0: 4d 61 70 2d 3e 61 53 76 70 74 5b 69 53 76 70 74  Map->aSvpt[iSvpt
4b00: 5d 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  ]; ii--){.      
4b10: 20 20 20 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72      RollbackEntr
4b20: 79 20 2a 70 20 3d 20 26 70 4d 61 70 2d 3e 61 52  y *p = &pMap->aR
4b30: 6f 6c 6c 62 61 63 6b 5b 69 69 5d 3b 0a 20 20 20  ollback[ii];.   
4b40: 20 20 20 20 20 20 20 50 74 72 6d 61 70 45 6e 74         PtrmapEnt
4b50: 72 79 20 2a 70 45 6e 74 72 79 20 3d 20 26 70 4d  ry *pEntry = &pM
4b60: 61 70 2d 3e 61 50 74 72 5b 70 2d 3e 70 67 6e 6f  ap->aPtr[p->pgno
4b70: 20 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 5d   - pMap->iFirst]
4b80: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 6e 74  ;.          pEnt
4b90: 72 79 2d 3e 70 61 72 65 6e 74 20 3d 20 70 2d 3e  ry->parent = p->
4ba0: 70 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  parent;.        
4bb0: 20 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 20    pEntry->eType 
4bc0: 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20  = p->eType;.    
4bd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4be0: 20 20 20 20 70 4d 61 70 2d 3e 6e 53 76 70 74 20      pMap->nSvpt 
4bf0: 3d 20 69 53 76 70 74 20 2b 20 28 6f 70 3d 3d 53  = iSvpt + (op==S
4c00: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
4c10: 4b 29 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e  K);.      pMap->
4c20: 6e 52 6f 6c 6c 62 61 63 6b 20 3d 20 70 4d 61 70  nRollback = pMap
4c30: 2d 3e 61 53 76 70 74 5b 69 53 76 70 74 5d 3b 0a  ->aSvpt[iSvpt];.
4c40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20      }.  }.}../* 
4c50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4c60: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29  OMIT_CONCURRENT)
4c70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
4c80: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
4c90: 66 74 65 72 20 61 6e 20 43 4f 4e 43 55 52 52 45  fter an CONCURRE
4ca0: 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  NT transaction i
4cb0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 0a  s opened on the.
4cc0: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 49 74 20  ** database. It 
4cd0: 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 42 74  allocates the Bt
4ce0: 72 65 65 50 74 72 6d 61 70 20 73 74 72 75 63 74  reePtrmap struct
4cf0: 75 72 65 20 75 73 65 64 20 74 6f 20 74 72 61 63  ure used to trac
4d00: 6b 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f  k pointers.** to
4d10: 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 73   allocated pages
4d20: 20 61 6e 64 20 7a 65 72 6f 65 73 20 74 68 65 20   and zeroes the 
4d30: 6e 46 72 65 65 2f 69 54 72 75 6e 6b 20 66 69 65  nFree/iTrunk fie
4d40: 6c 64 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  lds in the datab
4d50: 61 73 65 20 0a 2a 2a 20 68 65 61 64 65 72 20 6f  ase .** header o
4d60: 6e 20 70 61 67 65 20 31 2e 0a 2a 2f 0a 73 74 61  n page 1..*/.sta
4d70: 74 69 63 20 69 6e 74 20 62 74 72 65 65 50 74 72  tic int btreePtr
4d80: 6d 61 70 41 6c 6c 6f 63 61 74 65 28 42 74 53 68  mapAllocate(BtSh
4d90: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
4da0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
4db0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 4d 61  ;.  if( pBt->pMa
4dc0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 42 74 72 65  p==0 ){.    Btre
4dd0: 65 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20  ePtrmap *pMap = 
4de0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
4df0: 69 7a 65 6f 66 28 42 74 72 65 65 50 74 72 6d 61  izeof(BtreePtrma
4e00: 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 61  p));.    if( pMa
4e10: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  p==0 ){.      rc
4e20: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4e30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4e40: 20 20 6d 65 6d 73 65 74 28 26 70 42 74 2d 3e 70    memset(&pBt->p
4e50: 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
4e60: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 33 32 29  , 0, sizeof(u32)
4e70: 2a 32 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  *2);.      memse
4e80: 74 28 70 4d 61 70 2c 20 30 2c 20 73 69 7a 65 6f  t(pMap, 0, sizeo
4e90: 66 28 42 74 72 65 65 50 74 72 6d 61 70 29 29 3b  f(BtreePtrmap));
4ea0: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 69 46 69  .      pMap->iFi
4eb0: 72 73 74 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65  rst = pBt->nPage
4ec0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d   + 1;.      pBt-
4ed0: 3e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20  >pMap = pMap;.  
4ee0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4ef0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69   rc;.}../* !defi
4f00: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4f10: 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a  CONCURRENT).**.*
4f20: 2a 20 46 72 65 65 20 61 6e 79 20 42 74 72 65 65  * Free any Btree
4f30: 50 74 72 6d 61 70 20 73 74 72 75 63 74 75 72 65  Ptrmap structure
4f40: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 6e   allocated by an
4f50: 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
4f60: 0a 2a 2a 20 62 74 72 65 65 50 74 72 6d 61 70 41  .** btreePtrmapA
4f70: 6c 6c 6f 63 61 74 65 28 29 2e 0a 2a 2f 0a 73 74  llocate()..*/.st
4f80: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
4f90: 74 72 6d 61 70 44 65 6c 65 74 65 28 42 74 53 68  trmapDelete(BtSh
4fa0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
4fb0: 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70 20  reePtrmap *pMap 
4fc0: 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69  = pBt->pMap;.  i
4fd0: 66 28 20 70 4d 61 70 20 29 7b 0a 20 20 20 20 73  f( pMap ){.    s
4fe0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 70  qlite3_free(pMap
4ff0: 2d 3e 61 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20  ->aRollback);.  
5000: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5010: 4d 61 70 2d 3e 61 50 74 72 29 3b 0a 20 20 20 20  Map->aPtr);.    
5020: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
5030: 70 2d 3e 61 53 76 70 74 29 3b 0a 20 20 20 20 73  p->aSvpt);.    s
5040: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 70  qlite3_free(pMap
5050: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4d 61 70  );.    pBt->pMap
5060: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61   = 0;.  }.}..sta
5070: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 68  tic void btreeCh
5080: 65 63 6b 50 74 72 6d 61 70 28 42 74 53 68 61 72  eckPtrmap(BtShar
5090: 65 64 20 2a 70 2c 20 69 6e 74 20 6e 50 61 67 65  ed *p, int nPage
50a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c  , const char *zL
50b0: 6f 67 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d  og){.  BtreePtrm
50c0: 61 70 20 2a 70 4d 61 70 20 3d 20 70 2d 3e 70 4d  ap *pMap = p->pM
50d0: 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20 29  ap;.  if( pMap )
50e0: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 4d 49  {.    int n = MI
50f0: 4e 28 31 20 2b 20 6e 50 61 67 65 20 2d 20 28 69  N(1 + nPage - (i
5100: 6e 74 29 70 4d 61 70 2d 3e 69 46 69 72 73 74 2c  nt)pMap->iFirst,
5110: 20 35 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a   5);.    int i;.
5120: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
5130: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
5140: 74 20 65 54 79 70 65 20 3d 20 70 4d 61 70 2d 3e  t eType = pMap->
5150: 61 50 74 72 5b 69 5d 2e 65 54 79 70 65 3b 0a 20  aPtr[i].eType;. 
5160: 20 20 20 20 20 69 66 28 20 28 65 54 79 70 65 3d       if( (eType=
5170: 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
5180: 31 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  1 || .          
5190: 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f    eType==PTRMAP_
51a0: 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 0a 20 20  OVERFLOW2 || .  
51b0: 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65 3d            eType=
51c0: 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 29 20 26  =PTRMAP_BTREE) &
51d0: 26 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69 5d 2e  & pMap->aPtr[i].
51e0: 70 61 72 65 6e 74 3d 3d 30 20 0a 20 20 20 20 20  parent==0 .     
51f0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
5200: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
5210: 5f 45 52 52 4f 52 2c 20 0a 20 20 20 20 20 20 20  _ERROR, .       
5220: 20 20 20 20 20 22 42 69 74 76 65 63 3a 20 65 72       "Bitvec: er
5230: 72 6f 72 20 61 74 20 28 25 73 29 20 2d 20 28 25  ror at (%s) - (%
5240: 64 2f 25 64 20 25 64 2f 25 64 20 25 64 2f 25 64  d/%d %d/%d %d/%d
5250: 20 25 64 2f 25 64 20 25 64 2f 25 64 29 22 2c 0a   %d/%d %d/%d)",.
5260: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4c 6f 67              zLog
5270: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 69  ,.            (i
5280: 6e 74 29 70 4d 61 70 2d 3e 61 50 74 72 5b 30 5d  nt)pMap->aPtr[0]
5290: 2e 65 54 79 70 65 2c 20 28 69 6e 74 29 70 4d 61  .eType, (int)pMa
52a0: 70 2d 3e 61 50 74 72 5b 30 5d 2e 70 61 72 65 6e  p->aPtr[0].paren
52b0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  t,.            (
52c0: 6e 3e 31 20 3f 20 28 69 6e 74 29 70 4d 61 70 2d  n>1 ? (int)pMap-
52d0: 3e 61 50 74 72 5b 31 5d 2e 65 54 79 70 65 20 3a  >aPtr[1].eType :
52e0: 20 2d 31 29 2c 0a 20 20 20 20 20 20 20 20 20 20   -1),.          
52f0: 20 20 28 6e 3e 31 20 3f 20 28 69 6e 74 29 70 4d    (n>1 ? (int)pM
5300: 61 70 2d 3e 61 50 74 72 5b 31 5d 2e 70 61 72 65  ap->aPtr[1].pare
5310: 6e 74 20 3a 20 2d 31 29 2c 0a 0a 20 20 20 20 20  nt : -1),..     
5320: 20 20 20 20 20 20 20 28 6e 3e 32 20 3f 20 28 69         (n>2 ? (i
5330: 6e 74 29 70 4d 61 70 2d 3e 61 50 74 72 5b 32 5d  nt)pMap->aPtr[2]
5340: 2e 65 54 79 70 65 20 3a 20 2d 31 29 2c 0a 20 20  .eType : -1),.  
5350: 20 20 20 20 20 20 20 20 20 20 28 6e 3e 32 20 3f            (n>2 ?
5360: 20 28 69 6e 74 29 70 4d 61 70 2d 3e 61 50 74 72   (int)pMap->aPtr
5370: 5b 32 5d 2e 70 61 72 65 6e 74 20 3a 20 2d 31 29  [2].parent : -1)
5380: 2c 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ,..            (
5390: 6e 3e 33 20 3f 20 28 69 6e 74 29 70 4d 61 70 2d  n>3 ? (int)pMap-
53a0: 3e 61 50 74 72 5b 33 5d 2e 65 54 79 70 65 20 3a  >aPtr[3].eType :
53b0: 20 2d 31 29 2c 0a 20 20 20 20 20 20 20 20 20 20   -1),.          
53c0: 20 20 28 6e 3e 33 20 3f 20 28 69 6e 74 29 70 4d    (n>3 ? (int)pM
53d0: 61 70 2d 3e 61 50 74 72 5b 33 5d 2e 70 61 72 65  ap->aPtr[3].pare
53e0: 6e 74 20 3a 20 2d 31 29 2c 0a 0a 20 20 20 20 20  nt : -1),..     
53f0: 20 20 20 20 20 20 20 28 6e 3e 34 20 3f 20 28 69         (n>4 ? (i
5400: 6e 74 29 70 4d 61 70 2d 3e 61 50 74 72 5b 34 5d  nt)pMap->aPtr[4]
5410: 2e 65 54 79 70 65 20 3a 20 2d 31 29 2c 0a 20 20  .eType : -1),.  
5420: 20 20 20 20 20 20 20 20 20 20 28 6e 3e 34 20 3f            (n>4 ?
5430: 20 28 69 6e 74 29 70 4d 61 70 2d 3e 61 50 74 72   (int)pMap->aPtr
5440: 5b 34 5d 2e 70 61 72 65 6e 74 20 3a 20 2d 31 29  [4].parent : -1)
5450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
5460: 20 20 20 20 20 20 20 20 61 62 6f 72 74 28 29 3b          abort();
5470: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5480: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5490: 7d 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 53 51  }.}.#else  /* SQ
54a0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
54b0: 52 45 4e 54 20 2a 2f 0a 23 20 64 65 66 69 6e 65  RENT */.# define
54c0: 20 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f   btreePtrmapAllo
54d0: 63 61 74 65 28 78 29 20 53 51 4c 49 54 45 5f 4f  cate(x) SQLITE_O
54e0: 4b 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65  K.# define btree
54f0: 50 74 72 6d 61 70 44 65 6c 65 74 65 28 78 29 20  PtrmapDelete(x) 
5500: 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 50  .# define btreeP
5510: 74 72 6d 61 70 42 65 67 69 6e 28 78 2c 79 29 20  trmapBegin(x,y) 
5520: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66   SQLITE_OK.# def
5530: 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70 45  ine btreePtrmapE
5540: 6e 64 28 78 2c 79 2c 7a 29 20 0a 23 20 64 65 66  nd(x,y,z) .# def
5550: 69 6e 65 20 62 74 72 65 65 43 68 65 63 6b 50 74  ine btreeCheckPt
5560: 72 6d 61 70 28 61 2c 62 2c 63 29 0a 23 65 6e 64  rmap(a,b,c).#end
5570: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
5580: 54 5f 43 4f 4e 43 55 52 52 45 4e 54 20 2a 2f 0a  T_CONCURRENT */.
5590: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
55a0: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
55b0: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
55c0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
55d0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69  */../*.***** Thi
55e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
55f0: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
5600: 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a  rt() only ****.*
5610: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
5620: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
5630: 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69  s the mutex on i
5640: 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23  ts BtShared.*/.#
5650: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
5660: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  UG.static int cu
5670: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42  rsorHoldsMutex(B
5680: 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72  tCursor *p){.  r
5690: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
56a0: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
56b0: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 20 56  >mutex);.}../* V
56c0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
56d0: 75 72 73 6f 72 20 61 6e 64 20 74 68 65 20 42 74  ursor and the Bt
56e0: 53 68 61 72 65 64 20 61 67 72 65 65 20 61 62 6f  Shared agree abo
56f0: 75 74 20 77 68 61 74 20 69 73 20 74 68 65 20 63  ut what is the c
5700: 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61  urrent.** databa
5710: 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e 20 54 68  se connetion. Th
5720: 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  is is important 
5730: 69 6e 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  in shared-cache 
5740: 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 64 61 74  mode. If the dat
5750: 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e 6e 65 63  abase .** connec
5760: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 67 65  tion pointers ge
5770: 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63 2c 20 69  t out-of-sync, i
5780: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
5790: 72 20 72 6f 75 74 69 6e 65 73 20 6c 69 6b 65 0a  r routines like.
57a0: 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
57b0: 28 29 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20  () to reference 
57c0: 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e 65 63 74  an stale connect
57d0: 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74 68 61 74  ion pointer that
57e0: 20 72 65 66 65 72 65 6e 63 65 73 20 61 0a 2a 2a   references a.**
57f0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68   a connection th
5800: 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 63  at has already c
5810: 6c 6f 73 65 64 2e 20 20 54 68 69 73 20 72 6f 75  losed.  This rou
5820: 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73  tine is used ins
5830: 69 64 65 20 61 73 73 65 72 74 28 29 0a 2a 2a 20  ide assert().** 
5840: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 20  statements only 
5850: 61 6e 64 20 66 6f 72 20 74 68 65 20 70 75 72 70  and for the purp
5860: 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65 2d 63 68  ose of double-ch
5870: 65 63 6b 69 6e 67 20 74 68 61 74 20 74 68 65 20  ecking that the 
5880: 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a 20 64 6f  btree code.** do
5890: 65 73 20 6b 65 65 70 20 74 68 65 20 64 61 74 61  es keep the data
58a0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
58b0: 70 6f 69 6e 74 65 72 73 20 75 70 2d 74 6f 2d 64  pointers up-to-d
58c0: 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
58d0: 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  nt cursorOwnsBtS
58e0: 68 61 72 65 64 28 42 74 43 75 72 73 6f 72 20 2a  hared(BtCursor *
58f0: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  p){.  assert( cu
5900: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
5910: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ) );.  return (p
5920: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 2d  ->pBtree->db==p-
5930: 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a 23 65 6e  >pBt->db);.}.#en
5940: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  dif../*.** Inval
5950: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
5960: 6f 77 20 63 61 63 68 65 20 6f 66 20 74 68 65 20  ow cache of the 
5970: 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
5980: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
5990: 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ent..** on the s
59a0: 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75  hared btree stru
59b0: 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64  cture pBt..*/.#d
59c0: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
59d0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43  OverflowCache(pC
59e0: 75 72 29 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  ur) (pCur->curFl
59f0: 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c  ags &= ~BTCF_Val
5a00: 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49  idOvfl)../*.** I
5a10: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
5a20: 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
5a30: 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63   cache for all c
5a40: 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a  ursors opened.**
5a50: 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62   on the shared b
5a60: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70  tree structure p
5a70: 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Bt..*/.static vo
5a80: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  id invalidateAll
5a90: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
5aa0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
5ab0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
5ac0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5ad0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
5ae0: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70  utex) );.  for(p
5af0: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
5b00: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
5b10: 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
5b20: 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20  rflowCache(p);. 
5b30: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
5b40: 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
5b50: 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  OB./*.** This fu
5b60: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
5b70: 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
5b80: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
5b90: 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20  f a table.** to 
5ba0: 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69  invalidate any i
5bb0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
5bc0: 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e  that are open on
5bd0: 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f   the.** row or o
5be0: 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62  ne of the rows b
5bf0: 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  eing modified..*
5c00: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
5c10: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73   isClearTable is
5c20: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
5c30: 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
5c40: 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  of the.** table 
5c50: 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64  is about to be d
5c60: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
5c70: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20  case invalidate 
5c80: 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20  all incrblob.** 
5c90: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
5ca0: 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74  any row within t
5cb0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
5cc0: 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74  ot-page pgnoRoot
5cd0: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
5ce0: 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69  e, if argument i
5cf0: 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66  sClearTable is f
5d00: 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72  alse, then the r
5d10: 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64  ow with.** rowid
5d20: 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72   iRow is being r
5d30: 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74  eplaced or delet
5d40: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
5d50: 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f   invalidate.** o
5d60: 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c  nly those incrbl
5d70: 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ob cursors open 
5d80: 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66 69 63  on that specific
5d90: 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
5da0: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49  void invalidateI
5db0: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a  ncrblobCursors(.
5dc0: 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c    Btree *pBtree,
5dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5de0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
5df0: 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e  o check */.  Pgn
5e00: 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20  o pgnoRoot,     
5e10: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
5e20: 65 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  e that might be 
5e30: 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 36  changing */.  i6
5e40: 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20  4 iRow,         
5e50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77        /* The row
5e60: 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  id that might be
5e70: 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69   changing */.  i
5e80: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
5e90: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
5ea0: 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62  f all rows are b
5eb0: 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
5ec0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
5ed0: 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 2d 3e  ;.  if( pBtree->
5ee0: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 3d 3d  hasIncrblobCur==
5ef0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
5f00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
5f10: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
5f20: 72 65 65 29 20 29 3b 0a 20 20 70 42 74 72 65 65  ree) );.  pBtree
5f30: 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72  ->hasIncrblobCur
5f40: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 42   = 0;.  for(p=pB
5f50: 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
5f60: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
5f70: 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e  t){.    if( (p->
5f80: 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
5f90: 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29 7b 0a  Incrblob)!=0 ){.
5fa0: 20 20 20 20 20 20 70 42 74 72 65 65 2d 3e 68 61        pBtree->ha
5fb0: 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 31  sIncrblobCur = 1
5fc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
5fd0: 67 6e 6f 52 6f 6f 74 3d 3d 70 67 6e 6f 52 6f 6f  gnoRoot==pgnoRoo
5fe0: 74 20 26 26 20 28 69 73 43 6c 65 61 72 54 61 62  t && (isClearTab
5ff0: 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b  le || p->info.nK
6000: 65 79 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20  ey==iRow) ){.   
6010: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
6020: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
6030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6040: 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a   }.}..#else.  /*
6050: 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77   Stub function w
6060: 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20  hen INCRBLOB is 
6070: 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65  omitted */.  #de
6080: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
6090: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 77  ncrblobCursors(w
60a0: 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  ,x,y,z).#endif /
60b0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
60c0: 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
60d0: 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66   Set bit pgno of
60e0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
60f0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
6100: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
6110: 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65   .** when a page
6120: 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79   that previously
6130: 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20   contained data 
6140: 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c  becomes a free-l
6150: 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67  ist leaf .** pag
6160: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53  e..**.** The BtS
6170: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
6180: 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20  t bitvec exists 
6190: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
61a0: 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67  n obscure.** bug
61b0: 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69   caused by the i
61c0: 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77  nteraction of tw
61d0: 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69  o useful IO opti
61e0: 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75  mizations surrou
61f0: 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69  nding.** free-li
6200: 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a  st leaf pages:.*
6210: 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61  *.**   1) When a
6220: 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
6230: 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61  ed from a page a
6240: 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f  nd the page beco
6250: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72  mes.**      a fr
6260: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
6270: 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  e, the page is n
6280: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
6290: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
62a0: 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74     (as free-list
62b0: 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74   leaf pages cont
62c0: 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75  ain no meaningfu
62d0: 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d  l data). Sometim
62e0: 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20  es.**      such 
62f0: 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76  a page is not ev
6300: 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61  en journalled (a
6310: 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
6320: 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20   modified,.**   
6330: 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f     why bother jo
6340: 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a  urnalling it?)..
6350: 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
6360: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
6370: 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c   page is reused,
6380: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20   its content is 
6390: 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  not read.**     
63a0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
63b0: 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f  se or written to
63c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
63d0: 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74  e (why should it
63e0: 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20  .**      be, if 
63f0: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  it is not at all
6400: 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a   meaningful?)..*
6410: 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76  *.** By themselv
6420: 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69  es, these optimi
6430: 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e  zations work fin
6440: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20  e and provide a 
6450: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
6460: 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75  ance boost to bu
6470: 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73  lk delete or ins
6480: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ert operations. 
6490: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61  However, if.** a
64a0: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74   page is moved t
64b0: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
64c0: 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20  and then reused 
64d0: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
64e0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ** transaction, 
64f0: 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20  a problem comes 
6500: 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  up. If the page 
6510: 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  is not journalle
6520: 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  d when.** it is 
6530: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
6540: 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73  e-list and it is
6550: 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61   also not journa
6560: 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20  lled when it.** 
6570: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
6580: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  m the free-list 
6590: 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e  and reused, then
65a0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
65b0: 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73  ta.** may be los
65c0: 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  t. In the event 
65d0: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  of a rollback, i
65e0: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  t may not be pos
65f0: 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74  sible.** to rest
6600: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
6610: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
6620: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
6630: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  **.** The soluti
6640: 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72  on is the BtShar
6650: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
6660: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
6670: 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f  a page is .** mo
6680: 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ved to become a 
6690: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
66a0: 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  age, the corresp
66b0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a  onding bit is.**
66c0: 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76   set in the bitv
66d0: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c  ec. Whenever a l
66e0: 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72  eaf page is extr
66f0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
6700: 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74  ree-list,.** opt
6710: 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76  imization 2 abov
6720: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  e is omitted if 
6730: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
6740: 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79  g bit is already
6750: 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61  .** set in BtSha
6760: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e  red.pHasContent.
6770: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
6780: 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20   the bitvec are 
6790: 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68  cleared.** at th
67a0: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74  e end of every t
67b0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
67c0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53  tatic int btreeS
67d0: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
67e0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
67f0: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
6800: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6810: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
6820: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  ntent ){.    ass
6830: 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e  ert( pgno<=pBt->
6840: 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74  nPage );.    pBt
6850: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
6860: 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
6870: 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ate(pBt->nPage);
6880: 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70  .    if( !pBt->p
6890: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
68a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
68b0: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
68c0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
68d0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e  SQLITE_OK && pgn
68e0: 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63  o<=sqlite3Bitvec
68f0: 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43 6f  Size(pBt->pHasCo
6900: 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72 63  ntent) ){.    rc
6910: 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
6920: 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  Set(pBt->pHasCon
6930: 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  tent, pgno);.  }
6940: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6950: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68 65  ./*.** Query the
6960: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
6970: 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a  ntent vector..**
6980: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
6990: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
69a0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
69b0: 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76 65  f page is remove
69c0: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72  d from the.** fr
69d0: 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75 73  ee-list for reus
69e0: 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66 61  e. It returns fa
69f0: 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61 66  lse if it is saf
6a00: 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  e to retrieve th
6a10: 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20 74  e.** page from t
6a20: 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  he pager layer w
6a30: 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
6a40: 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
6a50: 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  rue otherwise..*
6a60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
6a70: 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
6a80: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
6a90: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74  gno pgno){.  Bit
6aa0: 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48  vec *p = pBt->pH
6ab0: 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74  asContent;.  ret
6ac0: 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f 3e  urn (p && (pgno>
6ad0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
6ae0: 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33 42  e(p) || sqlite3B
6af0: 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67 6e  itvecTest(p, pgn
6b00: 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  o)));.}../*.** C
6b10: 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20 74  lear (destroy) t
6b20: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
6b30: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
6b40: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a  This should be.*
6b50: 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  * invoked at the
6b60: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65   conclusion of e
6b70: 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ach write-transa
6b80: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
6b90: 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61 72   void btreeClear
6ba0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
6bb0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c  red *pBt){.  sql
6bc0: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
6bd0: 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  y(pBt->pHasConte
6be0: 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73  nt);.  pBt->pHas
6bf0: 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  Content = 0;.}..
6c00: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
6c10: 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65 5b  l of the apPage[
6c20: 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63 75  ] pages for a cu
6c30: 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsor..*/.static 
6c40: 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61 73  void btreeReleas
6c50: 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
6c60: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
6c70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
6c80: 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
6c90: 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  age; i++){.    r
6ca0: 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
6cb0: 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
6cc0: 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d   pCur->apPage[i]
6cd0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72   = 0;.  }.  pCur
6ce0: 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a  ->iPage = -1;.}.
6cf0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  ./*.** The curso
6d00: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
6d10: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 6d 75  only argument mu
6d20: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61  st point to a va
6d30: 6c 69 64 20 65 6e 74 72 79 0a 2a 2a 20 77 68 65  lid entry.** whe
6d40: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
6d50: 69 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 20  is called (i.e. 
6d60: 68 61 76 65 20 65 53 74 61 74 65 3d 3d 43 55 52  have eState==CUR
6d70: 53 4f 52 5f 56 41 4c 49 44 29 2e 20 54 68 69 73  SOR_VALID). This
6d80: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 61 76  .** function sav
6d90: 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  es the current c
6da0: 75 72 73 6f 72 20 6b 65 79 20 69 6e 20 76 61 72  ursor key in var
6db0: 69 61 62 6c 65 73 20 70 43 75 72 2d 3e 6e 4b 65  iables pCur->nKe
6dc0: 79 20 61 6e 64 0a 2a 2a 20 70 43 75 72 2d 3e 70  y and.** pCur->p
6dd0: 4b 65 79 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  Key. SQLITE_OK i
6de0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75  s returned if su
6df0: 63 63 65 73 73 66 75 6c 20 6f 72 20 61 6e 20 53  ccessful or an S
6e00: 51 4c 69 74 65 20 65 72 72 6f 72 20 0a 2a 2a 20  QLite error .** 
6e10: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
6e20: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
6e30: 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61  sor is open on a
6e40: 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20  n intkey table, 
6e50: 74 68 65 6e 20 74 68 65 20 69 6e 74 65 67 65 72  then the integer
6e60: 20 6b 65 79 0a 2a 2a 20 28 74 68 65 20 72 6f 77   key.** (the row
6e70: 69 64 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e  id) is stored in
6e80: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 20   pCur->nKey and 
6e90: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 6c 65  pCur->pKey is le
6ea0: 66 74 20 73 65 74 20 74 6f 0a 2a 2a 20 4e 55 4c  ft set to.** NUL
6eb0: 4c 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  L. If the cursor
6ec0: 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 20 6e 6f   is open on a no
6ed0: 6e 2d 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20  n-intkey table, 
6ee0: 74 68 65 6e 20 70 43 75 72 2d 3e 70 4b 65 79 20  then pCur->pKey 
6ef0: 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f  is .** set to po
6f00: 69 6e 74 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 65  int to a malloce
6f10: 64 20 62 75 66 66 65 72 20 70 43 75 72 2d 3e 6e  d buffer pCur->n
6f20: 4b 65 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  Key bytes in siz
6f30: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a  e containing .**
6f40: 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61   the key..*/.sta
6f50: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
6f60: 6f 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  orKey(BtCursor *
6f70: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  pCur){.  int rc 
6f80: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
6f90: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
6fa0: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
6fb0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  e );.  assert( 0
6fc0: 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a  ==pCur->pKey );.
6fd0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
6fe0: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
6ff0: 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d   );..  if( pCur-
7000: 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b 0a 20 20  >curIntKey ){.  
7010: 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 72 6f    /* Only the ro
7020: 77 69 64 20 69 73 20 72 65 71 75 69 72 65 64 20  wid is required 
7030: 66 6f 72 20 61 20 74 61 62 6c 65 20 62 74 72 65  for a table btre
7040: 65 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 6e  e */.    pCur->n
7050: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72  Key = sqlite3Btr
7060: 65 65 49 6e 74 65 67 65 72 4b 65 79 28 70 43 75  eeIntegerKey(pCu
7070: 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
7080: 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78   /* For an index
7090: 20 62 74 72 65 65 2c 20 73 61 76 65 20 74 68 65   btree, save the
70a0: 20 63 6f 6d 70 6c 65 74 65 20 6b 65 79 20 63 6f   complete key co
70b0: 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 76 6f 69  ntent */.    voi
70c0: 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 70 43 75  d *pKey;.    pCu
70d0: 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65  r->nKey = sqlite
70e0: 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
70f0: 65 28 70 43 75 72 29 3b 0a 20 20 20 20 70 4b 65  e(pCur);.    pKe
7100: 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
7110: 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b  c( pCur->nKey );
7120: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b  .    if( pKey ){
7130: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
7140: 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28  te3BtreePayload(
7150: 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43  pCur, 0, (int)pC
7160: 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  ur->nKey, pKey);
7170: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
7180: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7190: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
71a0: 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c   pKey;.      }el
71b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
71c0: 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a  te3_free(pKey);.
71d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
71e0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
71f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
7200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
7210: 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72 49  ert( !pCur->curI
7220: 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e  ntKey || !pCur->
7230: 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72 6e  pKey );.  return
7240: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61   rc;.}../*.** Sa
7250: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ve the current c
7260: 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69  ursor position i
7270: 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20  n the variables 
7280: 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a  BtCursor.nKey .*
7290: 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70  * and BtCursor.p
72a0: 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27  Key. The cursor'
72b0: 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  s state is set t
72c0: 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  o CURSOR_REQUIRE
72d0: 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  SEEK..**.** The 
72e0: 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
72f0: 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  re that the curs
7300: 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73  or is valid (has
7310: 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f   eState==CURSOR_
7320: 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20  VALID).** prior 
7330: 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
7340: 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74  routine.  .*/.st
7350: 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72  atic int saveCur
7360: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
7370: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
7380: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
7390: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
73a0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c 20  pCur->eState || 
73b0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d  CURSOR_SKIPNEXT=
73c0: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b  =pCur->eState );
73d0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43  .  assert( 0==pC
73e0: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73  ur->pKey );.  as
73f0: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
7400: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
7410: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
7420: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
7430: 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75 72  NEXT ){.    pCur
7440: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
7450: 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65  R_VALID;.  }else
7460: 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
7470: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Next = 0;.  }.. 
7480: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
7490: 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66 28  Key(pCur);.  if(
74a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
74b0: 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65 61  {.    btreeRelea
74c0: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
74d0: 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75 72  (pCur);.    pCur
74e0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
74f0: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20  R_REQUIRESEEK;. 
7500: 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   }..  pCur->curF
7510: 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
7520: 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
7530: 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74 4c  lidOvfl|BTCF_AtL
7540: 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ast);.  return r
7550: 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
7560: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
7570: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
7580: 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72  NOINLINE saveCur
7590: 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75 72  sorsOnList(BtCur
75a0: 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73  sor*,Pgno,BtCurs
75b0: 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  or*);../*.** Sav
75c0: 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
75d0: 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 28  of all cursors (
75e0: 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29 20  except pExcept) 
75f0: 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e  that are open on
7600: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77 69  .** the table wi
7610: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f  th root-page iRo
7620: 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68 65  ot.  "Saving the
7630: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
7640: 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20  " means that.** 
7650: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  the location in 
7660: 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65 6d  the btree is rem
7670: 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68 20  embered in such 
7680: 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63 61  a way that it ca
7690: 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62 61  n be.** moved ba
76a0: 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  ck to the same s
76b0: 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62 74  pot after the bt
76c0: 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  ree has been mod
76d0: 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20  ified.  This.** 
76e0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
76f0: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
7700: 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73 20  rsor pExcept is 
7710: 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74  used to modify t
7720: 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f 72  he.** table, for
7730: 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72 65   example in Btre
7740: 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72  eDelete() or Btr
7750: 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a 2a  eeInsert()..**.*
7760: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 74  * If there are t
7770: 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f  wo or more curso
7780: 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62  rs on the same b
7790: 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73  tree, then all s
77a0: 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73 20  uch .** cursors 
77b0: 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65 69  should have thei
77c0: 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  r BTCF_Multiple 
77d0: 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20 62  flag set.  The b
77e0: 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a 20  treeCursor().** 
77f0: 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65 73  routine enforces
7800: 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68 69   that rule.  Thi
7810: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 6e  s routine only n
7820: 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c 65  eeds to be calle
7830: 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63 6f  d in.** the unco
7840: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20 70  mmon case when p
7850: 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20 42  Expect has the B
7860: 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
7870: 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  g set..**.** If 
7880: 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61 6e  pExpect!=NULL an
7890: 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63 75  d if no other cu
78a0: 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64 20  rsors are found 
78b0: 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  on the same root
78c0: 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 74  -page,.** then t
78d0: 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  he BTCF_Multiple
78e0: 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63 74   flag on pExpect
78f0: 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f 20   is cleared, to 
7900: 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a 2a  avoid another.**
7910: 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c 20   pointless call 
7920: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  to this routine.
7930: 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  .**.** Implement
7940: 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68 69  ation note:  Thi
7950: 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79  s routine merely
7960: 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
7970: 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a 2a  f any cursors.**
7980: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
7990: 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75 74  d.  It calls out
79a0: 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73 4f   to saveCursorsO
79b0: 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20 28  nList() in the (
79c0: 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65 6e  unusual).** even
79d0: 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20 61  t that cursors a
79e0: 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62 65  re in need to be
79f0: 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73 74  ing saved..*/.st
7a00: 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c  atic int saveAll
7a10: 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
7a20: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f   *pBt, Pgno iRoo
7a30: 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
7a40: 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  cept){.  BtCurso
7a50: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
7a60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7a70: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
7a80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63  ;.  assert( pExc
7a90: 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70  ept==0 || pExcep
7aa0: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
7ab0: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
7ac0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
7ad0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
7ae0: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
7af0: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
7b00: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62 72  oot==iRoot) ) br
7b10: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  eak;.  }.  if( p
7b20: 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43 75   ) return saveCu
7b30: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69  rsorsOnList(p, i
7b40: 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b 0a  Root, pExcept);.
7b50: 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29 20    if( pExcept ) 
7b60: 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61 67  pExcept->curFlag
7b70: 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74 69  s &= ~BTCF_Multi
7b80: 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ple;.  return SQ
7b90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54  LITE_OK;.}../* T
7ba0: 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74 69  his helper routi
7bb0: 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75 72  ne to saveAllCur
7bc0: 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61 63  sors does the ac
7bd0: 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61 76  tual work of sav
7be0: 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f  ing.** the curso
7bf0: 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20 61  rs if and when a
7c00: 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e 64   cursor is found
7c10: 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20 72   that actually r
7c20: 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e 0a  equires saving..
7c30: 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  ** The common ca
7c40: 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63 75  se is that no cu
7c50: 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62 65  rsors need to be
7c60: 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73 20   saved, so this 
7c70: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62 72  routine is.** br
7c80: 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69 74  oken out from it
7c90: 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f 69  s caller to avoi
7ca0: 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 74  d unnecessary st
7cb0: 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76 65  ack pointer move
7cc0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
7cd0: 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
7ce0: 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f  INE saveCursorsO
7cf0: 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73 6f  nList(.  BtCurso
7d00: 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f 2a  r *p,         /*
7d10: 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73 6f   The first curso
7d20: 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61 76  r that needs sav
7d30: 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52  ing */.  Pgno iR
7d40: 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  oot,          /*
7d50: 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73 6f   Only save curso
7d60: 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f 6f  r with this iRoo
7d70: 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20 7a  t. Save all if z
7d80: 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ero */.  BtCurso
7d90: 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f 2a  r *pExcept    /*
7da0: 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68 69   Do not save thi
7db0: 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  s cursor */.){. 
7dc0: 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21 3d   do{.    if( p!=
7dd0: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
7de0: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
7df0: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20  oot==iRoot) ){. 
7e00: 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61       if( p->eSta
7e10: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
7e20: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43   || p->eState==C
7e30: 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
7e40: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  {.        int rc
7e50: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
7e60: 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
7e70: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
7e80: 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =rc ){.         
7e90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
7ea0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
7eb0: 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  e{.        testc
7ec0: 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30 20  ase( p->iPage>0 
7ed0: 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65  );.        btree
7ee0: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
7ef0: 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20 20  Pages(p);.      
7f00: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  }.    }.    p = 
7f10: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69  p->pNext;.  }whi
7f20: 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74 75 72  le( p );.  retur
7f30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7f40: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
7f50: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
7f60: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  osition..*/.void
7f70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
7f80: 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  arCursor(BtCurso
7f90: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
7fa0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
7fb0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
7fc0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
7fd0: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
7fe0: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
7ff0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
8000: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
8010: 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  /*.** In this ve
8020: 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f  rsion of BtreeMo
8030: 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20  veto, pKey is a 
8040: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63  packed index rec
8050: 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69  ord.** such as i
8060: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
8070: 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
8080: 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b   opcode.  Unpack
8090: 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61   the.** record a
80a0: 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72  nd then call Btr
80b0: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
80c0: 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  () to do the wor
80d0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
80e0: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20   btreeMoveto(.  
80f0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
8100: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
8110: 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  en on the btree 
8120: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
8130: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
8140: 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65  pKey,   /* Packe
8150: 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72  d key if the btr
8160: 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a  ee is an index *
8170: 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
8180: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
8190: 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65  er key for table
81a0: 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79  s.  Size of pKey
81b0: 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a   for indices */.
81c0: 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20    int bias,     
81d0: 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65        /* Bias se
81e0: 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
81f0: 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
8200: 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Res           /*
8210: 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
8220: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
8230: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8250: 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   Status code */.
8260: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
8270: 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20   *pIdxKey;   /* 
8280: 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
8290: 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65  ey */..  if( pKe
82a0: 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
82b0: 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74   nKey==(i64)(int
82c0: 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64  )nKey );.    pId
82d0: 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64  xKey = sqlite3Vd
82e0: 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
82f0: 65 63 6f 72 64 28 70 43 75 72 2d 3e 70 4b 65 79  ecord(pCur->pKey
8300: 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 70  Info);.    if( p
8310: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
8320: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
8330: 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69 74 65  BKPT;.    sqlite
8340: 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
8350: 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  k(pCur->pKeyInfo
8360: 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65  , (int)nKey, pKe
8370: 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
8380: 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46   if( pIdxKey->nF
8390: 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ield==0 ){.     
83a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
83b0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
83c0: 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e   goto moveto_don
83d0: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  e;.    }.  }else
83e0: 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  {.    pIdxKey = 
83f0: 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  0;.  }.  rc = sq
8400: 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
8410: 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70  Unpacked(pCur, p
8420: 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69  IdxKey, nKey, bi
8430: 61 73 2c 20 70 52 65 73 29 3b 0a 6d 6f 76 65 74  as, pRes);.movet
8440: 6f 5f 64 6f 6e 65 3a 0a 20 20 69 66 28 20 70 49  o_done:.  if( pI
8450: 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  dxKey ){.    sql
8460: 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d  ite3DbFree(pCur-
8470: 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70  >pKeyInfo->db, p
8480: 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72  IdxKey);.  }.  r
8490: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
84a0: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
84b0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
84c0: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
84d0: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
84e0: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
84f0: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
8500: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
8510: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
8520: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
8530: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
8540: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
8550: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
8560: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
8570: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
8580: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
8590: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75  ective restoreCu
85a0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
85b0: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
85c0: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
85d0: 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74  ition()..*/.stat
85e0: 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73 74  ic int btreeRest
85f0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
8600: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
8610: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
8620: 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 61  nt skipNext;.  a
8630: 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
8640: 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
8650: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
8660: 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
8670: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
8680: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
8690: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
86a0: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
86b0: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a  pCur->skipNext;.
86c0: 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61    }.  pCur->eSta
86d0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
86e0: 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  LID;.  rc = btre
86f0: 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43  eMoveto(pCur, pC
8700: 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e  ur->pKey, pCur->
8710: 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65  nKey, 0, &skipNe
8720: 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  xt);.  if( rc==S
8730: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8740: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
8750: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43  r->pKey);.    pC
8760: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
8770: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
8780: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
8790: 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
87a0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
87b0: 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43 75 72  ALID );.    pCur
87c0: 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b  ->skipNext |= sk
87d0: 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  ipNext;.    if( 
87e0: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26  pCur->skipNext &
87f0: 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
8800: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
8810: 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
8820: 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50  te = CURSOR_SKIP
8830: 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NEXT;.    }.  }.
8840: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8850: 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43  #define restoreC
8860: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
8870: 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e   \.  (p->eState>
8880: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
8890: 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20  EEK ? \.        
88a0: 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72   btreeRestoreCur
88b0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a  sorPosition(p) :
88c0: 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49   \.         SQLI
88d0: 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  TE_OK)../*.** De
88e0: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
88f0: 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20  or not a cursor 
8900: 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74  has moved from t
8910: 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68 65 72  he position wher
8920: 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61 73 74  e.** it was last
8930: 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61 73 20   placed, or has 
8940: 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 64  been invalidated
8950: 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 72   for any other r
8960: 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72  eason..** Cursor
8970: 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20  s can move when 
8980: 74 68 65 20 72 6f 77 20 74 68 65 79 20 61 72 65  the row they are
8990: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69 73 20   pointing at is 
89a0: 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66  deleted out.** f
89b0: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2c 20  rom under them, 
89c0: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 43 75  for example.  Cu
89d0: 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73 6f 20  rsor might also 
89e0: 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65 65 0a  move if a btree.
89f0: 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63 65 64  ** is rebalanced
8a00: 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20  ..**.** Calling 
8a10: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
8a20: 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20  h a NULL cursor 
8a30: 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 73 20  pointer returns 
8a40: 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  false..**.** Use
8a50: 20 74 68 65 20 73 65 70 61 72 61 74 65 20 73 71   the separate sq
8a60: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
8a70: 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74 69 6e  Restore() routin
8a80: 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 63  e to restore a c
8a90: 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f  ursor.** back to
8aa0: 20 77 68 65 72 65 20 69 74 20 6f 75 67 68 74 20   where it ought 
8ab0: 74 6f 20 62 65 20 69 66 20 74 68 69 73 20 72 6f  to be if this ro
8ac0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72  utine returns tr
8ad0: 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ue..*/.int sqlit
8ae0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
8af0: 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a  Moved(BtCursor *
8b00: 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
8b10: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
8b20: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f  RSOR_VALID;.}../
8b30: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8b40: 65 20 72 65 73 74 6f 72 65 73 20 61 20 63 75 72  e restores a cur
8b50: 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20  sor back to its 
8b60: 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f  original positio
8b70: 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20 68 61  n after it.** ha
8b80: 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62 79 20  s been moved by 
8b90: 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61 63 74  some outside act
8ba0: 69 76 69 74 79 20 28 73 75 63 68 20 61 73 20 61  ivity (such as a
8bb0: 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e 63 65   btree rebalance
8bc0: 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76   or.** a row hav
8bd0: 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ing been deleted
8be0: 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
8bf0: 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a  the cursor).  .*
8c00: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
8c10: 20 74 68 65 20 2a 70 44 69 66 66 65 72 65 6e 74   the *pDifferent
8c20: 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 69 73  Row parameter is
8c30: 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 63 75   false if the cu
8c40: 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20  rsor is left.** 
8c50: 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78 61 63  pointing at exac
8c60: 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72 6f 77  tly the same row
8c70: 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52 6f 77  .  *pDifferntRow
8c80: 20 69 73 20 74 68 65 20 72 6f 77 20 74 68 65 20   is the row the 
8c90: 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f  cursor.** was po
8ca0: 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20 62 65  inting to has be
8cb0: 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f 72 63  en deleted, forc
8cc0: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
8cd0: 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a  o point to some.
8ce0: 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a  ** nearby row..*
8cf0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8d00: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
8d10: 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 63 75   called for a cu
8d20: 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74 20 72  rsor that just r
8d30: 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20  eturned.** TRUE 
8d40: 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65  from sqlite3Btre
8d50: 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
8d60: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
8d70: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
8d80: 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ore(BtCursor *pC
8d90: 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66 65 72  ur, int *pDiffer
8da0: 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72  entRow){.  int r
8db0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  c;..  assert( pC
8dc0: 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ur!=0 );.  asser
8dd0: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  t( pCur->eState!
8de0: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
8df0: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
8e00: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
8e10: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
8e20: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
8e30: 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Row = 1;.    ret
8e40: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
8e50: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
8e60: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
8e70: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
8e80: 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 1;.  }else{
8e90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
8ea0: 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29  r->skipNext==0 )
8eb0: 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  ;.    *pDifferen
8ec0: 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  tRow = 0;.  }.  
8ed0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8ee0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
8ef0: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
8f00: 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f  _HINTS./*.** Pro
8f10: 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74 68  vide hints to th
8f20: 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 70  e cursor.  The p
8f30: 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20 67  articular hint g
8f40: 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74 79  iven (and the ty
8f50: 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65 72  pe.** and number
8f60: 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73 20   of the varargs 
8f70: 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20 64  parameters) is d
8f80: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
8f90: 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70 61   eHintType.** pa
8fa0: 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74 68  rameter.  See th
8fb0: 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66  e definitions of
8fc0: 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54 5f   the BTREE_HINT_
8fd0: 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65 74  * macros for det
8fe0: 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ails..*/.void sq
8ff0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
9000: 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Hint(BtCursor *p
9010: 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54 79  Cur, int eHintTy
9020: 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55  pe, ...){.  /* U
9030: 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73 74  sed only by syst
9040: 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74 75  em that substitu
9050: 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74 6f  te their own sto
9060: 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d  rage engine */.}
9070: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
9080: 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e 74  rovide flag hint
9090: 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e  s to the cursor.
90a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
90b0: 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74 46  BtreeCursorHintF
90c0: 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70  lags(BtCursor *p
90d0: 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78 29  Cur, unsigned x)
90e0: 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d 42  {.  assert( x==B
90f0: 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20  TREE_SEEK_EQ || 
9100: 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41  x==BTREE_BULKLOA
9110: 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20 70  D || x==0 );.  p
9120: 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b 0a  Cur->hints = x;.
9130: 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
9140: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
9150: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
9160: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
9170: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
9180: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
9190: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
91a0: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
91b0: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
91c0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
91d0: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
91e0: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
91f0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
9200: 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61   (not a valid pa
9210: 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20  ge) for pgno==1 
9220: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a  since there is.*
9230: 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70  * no pointer map
9240: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9250: 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e   page 1.  The in
9260: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f  tegrity_check lo
9270: 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20  gic.** requires 
9280: 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e  that ptrmapPagen
9290: 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74  o(*,1)!=1..*/.st
92a0: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
92b0: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
92c0: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
92d0: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
92e0: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
92f0: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
9300: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9310: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
9320: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
9330: 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e   pgno<2 ) return
9340: 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d   0;.  nPagesPerM
9350: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
9360: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
9370: 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e    iPtrMap = (pgn
9380: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
9390: 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28  pPage;.  ret = (
93a0: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
93b0: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
93c0: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
93d0: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
93e0: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
93f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
9400: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
9410: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
9420: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
9430: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
9440: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
9450: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
9460: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
9470: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
9480: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
9490: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
94a0: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
94b0: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49   'pgno'..**.** I
94c0: 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61  f *pRC is initia
94d0: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f  lly non-zero (no
94e0: 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65  n-SQLITE_OK) the
94f0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
9500: 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  s.** a no-op.  I
9510: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
9520: 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  s, the appropria
9530: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
9540: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
9550: 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63   *pRC..*/.static
9560: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28   void ptrmapPut(
9570: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
9580: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
9590: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20  e, Pgno parent, 
95a0: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50  int *pRC){.  DbP
95b0: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
95c0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
95d0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
95e0: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
95f0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
9600: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
9610: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
9620: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
9630: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
9640: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
9650: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
9660: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
9670: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
9680: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
9690: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  n code from subf
96a0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
96b0: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
96c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
96d0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
96e0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
96f0: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
9700: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
9710: 65 72 20 69 73 20 6e 65 76 65 72 20 61 64 64 65  er is never adde
9720: 64 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  d to a pointer-m
9730: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73  ap page */.  ass
9740: 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49  ert( 0==PTRMAP_I
9750: 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49  SPAGE(pBt, PENDI
9760: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
9770: 29 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  )) );..#ifndef S
9780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
9790: 52 52 45 4e 54 0a 20 20 69 66 28 20 70 42 74 2d  RRENT.  if( pBt-
97a0: 3e 70 4d 61 70 20 29 7b 0a 20 20 20 20 2a 70 52  >pMap ){.    *pR
97b0: 43 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70 53  C = btreePtrmapS
97c0: 74 6f 72 65 28 70 42 74 2c 20 6b 65 79 2c 20 65  tore(pBt, key, e
97d0: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 3b 0a 20  Type, parent);. 
97e0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
97f0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
9800: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
9810: 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30   );.  if( key==0
9820: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
9830: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9840: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
9850: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
9860: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
9870: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
9880: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
9890: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
98a0: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20  rmap, &pDbPage, 
98b0: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
98c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
98d0: 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
98e0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  turn;.  }.  offs
98f0: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
9900: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
9910: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
9920: 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  t<0 ){.    *pRC 
9930: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
9940: 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
9950: 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d  ptrmap_exit;.  }
9960: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
9970: 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75  t <= (int)pBt->u
9980: 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20  sableSize-5 );. 
9990: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
99a0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
99b0: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
99c0: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
99d0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
99e0: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
99f0: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
9a00: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
9a10: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
9a20: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
9a30: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
9a40: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52  arent));.    *pR
9a50: 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  C= rc = sqlite3P
9a60: 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
9a70: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
9a80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9a90: 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65     pPtrmap[offse
9aa0: 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20  t] = eType;.    
9ab0: 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72    put4byte(&pPtr
9ac0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70  map[offset+1], p
9ad0: 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
9ae0: 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a  }..ptrmap_exit:.
9af0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
9b00: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ref(pDbPage);.}.
9b10: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65  ./*.** Read an e
9b20: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f  ntry from the po
9b30: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
9b40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
9b50: 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e  trieves the poin
9b60: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
9b70: 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72  r page 'key', wr
9b80: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70  iting.** the typ
9b90: 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  e and parent pag
9ba0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54  e number to *pET
9bb0: 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72  ype and *pPgno r
9bc0: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
9bd0: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
9be0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
9bf0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
9c00: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
9c10: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
9c20: 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28  c int ptrmapGet(
9c30: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
9c40: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54  gno key, u8 *pET
9c50: 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  ype, Pgno *pPgno
9c60: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
9c70: 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
9c80: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
9c90: 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70  */.  int iPtrmap
9ca0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
9cb0: 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65  er map page inde
9cc0: 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  x */.  u8 *pPtrm
9cd0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
9ce0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61  nter map page da
9cf0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  ta */.  int offs
9d00: 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  et;        /* Of
9d10: 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e  fset of entry in
9d20: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a   pointer map */.
9d30: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
9d40: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9d50: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
9d60: 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61  ex) );..  iPtrma
9d70: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
9d80: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
9d90: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
9da0: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
9db0: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
9dc0: 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ge, 0);.  if( rc
9dd0: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
9de0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72  n rc;.  }.  pPtr
9df0: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
9e00: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
9e10: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66  pDbPage);..  off
9e20: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
9e30: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
9e40: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
9e50: 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  et<0 ){.    sqli
9e60: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
9e70: 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  bPage);.    retu
9e80: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9e90: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
9ea0: 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20  sert( offset <= 
9eb0: 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
9ec0: 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65  Size-5 );.  asse
9ed0: 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b  rt( pEType!=0 );
9ee0: 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74  .  *pEType = pPt
9ef0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  rmap[offset];.  
9f00: 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67  if( pPgno ) *pPg
9f10: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
9f20: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
9f30: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  );..  sqlite3Pag
9f40: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
9f50: 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c  ;.  if( *pEType<
9f60: 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29  1 || *pEType>5 )
9f70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9f80: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72  ORRUPT_BKPT;.  r
9f90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9fa0: 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  .}..#else /* if 
9fb0: 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f  defined SQLITE_O
9fc0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
9fd0: 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  /.  #define ptrm
9fe0: 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63  apPut(w,x,y,z,rc
9ff0: 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  ).  #define ptrm
a000: 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53  apGet(w,x,y,z) S
a010: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
a020: 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  ne ptrmapPutOvfl
a030: 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65  Ptr(x, y, rc).#e
a040: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ndif../*.** Give
a050: 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61  n a btree page a
a060: 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20  nd a cell index 
a070: 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72  (0 means the fir
a080: 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68  st cell on.** th
a090: 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20  e page, 1 means 
a0a0: 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c  the second cell,
a0b0: 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72   and so forth) r
a0c0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
a0d0: 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  ** to the cell c
a0e0: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69  ontent..**.** fi
a0f0: 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20  ndCellPastPtr() 
a100: 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 65 78  does the same ex
a110: 63 65 70 74 20 69 74 20 73 6b 69 70 73 20 70 61  cept it skips pa
a120: 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  st the initial.*
a130: 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70  * 4-byte child p
a140: 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20  ointer found on 
a150: 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20  interior pages, 
a160: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
a170: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
a180: 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66  ine works only f
a190: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  or pages that do
a1a0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65   not contain ove
a1b0: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
a1c0: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
a1d0: 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e  (P,I) \.  ((P)->
a1e0: 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61  aData + ((P)->ma
a1f0: 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74  skPage & get2byt
a200: 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61  eAligned(&(P)->a
a210: 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29  CellIdx[2*(I)]))
a220: 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  ).#define findCe
a230: 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c  llPastPtr(P,I) \
a240: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66  .  ((P)->aDataOf
a250: 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  st + ((P)->maskP
a260: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41 6c  age & get2byteAl
a270: 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c  igned(&(P)->aCel
a280: 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a  lIdx[2*(I)])))..
a290: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
a2a0: 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65  ommon tail proce
a2b0: 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50  ssing for btreeP
a2c0: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
a2d0: 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  d.** btreeParseC
a2e0: 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f  ellPtrIndex() fo
a2f0: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20  r the case when 
a300: 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f  the cell does no
a310: 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a  t fit entirely.*
a320: 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d  * on a single B-
a330: 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65  tree page.  Make
a340: 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73   necessary adjus
a350: 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65  tments to the Ce
a360: 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  llInfo.** struct
a370: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ure..*/.static S
a380: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
a390: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
a3a0: 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f  llAdjustSizeForO
a3b0: 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61  verflow(.  MemPa
a3c0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
a3d0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
a3e0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
a3f0: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
a400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a410: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
a420: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
a430: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
a440: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
a450: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
a460: 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68  */.){.  /* If th
a470: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
a480: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
a490: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
a4a0: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a  age, we have.  *
a4b0: 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20  * to decide how 
a4c0: 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f  much to store lo
a4d0: 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75  cally and how mu
a4e0: 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f  ch to spill onto
a4f0: 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70  .  ** overflow p
a500: 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74  ages.  The strat
a510: 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69  egy is to minimi
a520: 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ze the amount of
a530: 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61   unused.  ** spa
a540: 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce on overflow p
a550: 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69  ages while keepi
a560: 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ng the amount of
a570: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20   local storage. 
a580: 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d   ** in between m
a590: 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c  inLocal and maxL
a5a0: 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ocal..  **.  ** 
a5b0: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
a5c0: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
a5d0: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
a5e0: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
a5f0: 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20  y.  ** way will 
a600: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
a610: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
a620: 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e  ormat..  */.  in
a630: 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t minLocal;  /* 
a640: 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Minimum amount o
a650: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
a660: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
a670: 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61  maxLocal;  /* Ma
a680: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
a690: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
a6a0: 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ally */.  int su
a6b0: 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72  rplus;   /* Over
a6c0: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61  flow payload ava
a6d0: 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c  ilable for local
a6e0: 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d   storage */..  m
a6f0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
a700: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78  >minLocal;.  max
a710: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
a720: 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c  axLocal;.  surpl
a730: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
a740: 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64  (pInfo->nPayload
a750: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
a760: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a770: 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63  Size-4);.  testc
a780: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
a790: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
a7a0: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
a7b0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
a7c0: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
a7d0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49  xLocal ){.    pI
a7e0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
a7f0: 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65  16)surplus;.  }e
a800: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  lse{.    pInfo->
a810: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69  nLocal = (u16)mi
a820: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49  nLocal;.  }.  pI
a830: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31  nfo->nSize = (u1
a840: 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  6)(&pInfo->pPayl
a850: 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  oad[pInfo->nLoca
a860: 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b  l] - pCell) + 4;
a870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
a880: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
a890: 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   are implementat
a8a0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  ions of the MemP
a8b0: 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c 28 29  age.xParseCell()
a8c0: 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a  .** method..**.*
a8d0: 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63  * Parse a cell c
a8e0: 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64  ontent block and
a8f0: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c   fill in the Cel
a900: 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  lInfo structure.
a910: 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  .**.** btreePars
a920: 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20 20 20  eCellPtr()      
a930: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72    =>   table btr
a940: 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a  ee leaf nodes.**
a950: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 4e   btreeParseCellN
a960: 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20  oPayload()  =>  
a970: 20 74 61 62 6c 65 20 62 74 72 65 65 20 69 6e 74   table btree int
a980: 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62  ernal nodes.** b
a990: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
a9a0: 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20 20 69  Index()   =>   i
a9b0: 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64 65 73  ndex btree nodes
a9c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
a9d0: 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72 20 66  also a wrapper f
a9e0: 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50 61 72  unction btreePar
a9f0: 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f  seCell() that wo
aa00: 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d  rks for.** all M
aa10: 65 6d 50 61 67 65 20 74 79 70 65 73 20 61 6e 64  emPage types and
aa20: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
aa30: 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69 6e 64   the cell by ind
aa40: 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 0a 2a  ex rather than.*
aa50: 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  * by pointer..*/
aa60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
aa70: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f  eeParseCellPtrNo
aa80: 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61  Payload(.  MemPa
aa90: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
aaa0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
aab0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
aac0: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
aae0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
aaf0: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
ab00: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
ab10: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
ab20: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
ab30: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
ab40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ab50: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
ab60: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
ab70: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
ab80: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
ab90: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
aba0: 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66  ze==4 );.#ifndef
abb0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
abc0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
abd0: 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a  (pPage);.#endif.
abe0: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
abf0: 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26   4 + getVarint(&
ac00: 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29  pCell[4], (u64*)
ac10: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
ac20: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
ac30: 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e   = 0;.  pInfo->n
ac40: 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e  Local = 0;.  pIn
ac50: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30  fo->pPayload = 0
ac60: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74  ;.  return;.}.st
ac70: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
ac80: 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d  arseCellPtr(.  M
ac90: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
aca0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
acb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
acc0: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
acd0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
ace0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
acf0: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
ad00: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
ad10: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
ad20: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
ad30: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
ad40: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
ad50: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
ad60: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
ad70: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
ad80: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
ad90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
ada0: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
adb0: 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b  d */.  u64 iKey;
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
add0: 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65 79 20  * Extracted Key 
ade0: 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65  value */..  asse
adf0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ae00: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
ae10: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
ae20: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
ae30: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
ae40: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73  leaf==1 );.  ass
ae50: 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
ae60: 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65  eyLeaf );.  asse
ae70: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
ae80: 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  PtrSize==0 );.  
ae90: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a  pIter = pCell;..
aea0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c    /* The next bl
aeb0: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65  ock of code is e
aec0: 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20  quivalent to:.  
aed0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65  **.  **     pIte
aee0: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
aef0: 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64  (pIter, nPayload
af00: 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  );.  **.  ** The
af10: 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64   code is inlined
af20: 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63   to avoid a func
af30: 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a  tion call..  */.
af40: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49    nPayload = *pI
af50: 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  ter;.  if( nPayl
af60: 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  oad>=0x80 ){.   
af70: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74   u8 *pEnd = &pIt
af80: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c  er[8];.    nPayl
af90: 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  oad &= 0x7f;.   
afa0: 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c   do{.      nPayl
afb0: 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c  oad = (nPayload<
afc0: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
afd0: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
afe0: 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30  ile( (*pIter)>=0
aff0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
b000: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
b010: 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65  ++;..  /* The ne
b020: 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  xt block of code
b030: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
b040: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
b050: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
b060: 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a  int(pIter, (u64*
b070: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
b080: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f    **.  ** The co
b090: 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f  de is inlined to
b0a0: 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f   avoid a functio
b0b0: 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69  n call..  */.  i
b0c0: 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  Key = *pIter;.  
b0d0: 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29  if( iKey>=0x80 )
b0e0: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
b0f0: 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20   &pIter[7];.    
b100: 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20  iKey &= 0x7f;.  
b110: 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20    while(1){.    
b120: 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c    iKey = (iKey<<
b130: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
b140: 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66   0x7f);.      if
b150: 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20  ( (*pIter)<0x80 
b160: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
b170: 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29  f( pIter>=pEnd )
b180: 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d  {.        iKey =
b190: 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b   (iKey<<8) | *++
b1a0: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62  pIter;.        b
b1b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
b1c0: 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b    }.  }.  pIter+
b1d0: 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65  +;..  pInfo->nKe
b1e0: 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79  y = *(i64*)&iKey
b1f0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  ;.  pInfo->nPayl
b200: 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  oad = nPayload;.
b210: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
b220: 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73  d = pIter;.  tes
b230: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
b240: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
b250: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
b260: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
b270: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
b280: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
b290: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
b2a0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
b2b0: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
b2c0: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
b2d0: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
b2e0: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
b2f0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
b300: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
b310: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
b320: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
b330: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28  e = nPayload + (
b340: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
b350: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ll);.    if( pIn
b360: 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49  fo->nSize<4 ) pI
b370: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
b380: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
b390: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
b3a0: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
b3b0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64  btreeParseCellAd
b3c0: 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66  justSizeForOverf
b3d0: 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  low(pPage, pCell
b3e0: 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a  , pInfo);.  }.}.
b3f0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
b400: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
b410: 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ex(.  MemPage *p
b420: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
b430: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
b440: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
b450: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
b460: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
b470: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
b480: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
b490: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
b4a0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
b4b0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
b4c0: 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20  .  u8 *pIter;   
b4d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
b4e0: 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  r scanning throu
b4f0: 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33  gh pCell */.  u3
b500: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
b510: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b520: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
b530: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
b540: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b550: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b560: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b570: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b580: 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67  >leaf==0 || pPag
b590: 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20  e->leaf==1 );.  
b5a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
b5b0: 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a  ntKeyLeaf==0 );.
b5c0: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20    pIter = pCell 
b5d0: 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
b5e0: 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61  rSize;.  nPayloa
b5f0: 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  d = *pIter;.  if
b600: 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30  ( nPayload>=0x80
b610: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
b620: 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20   = &pIter[8];.  
b630: 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78    nPayload &= 0x
b640: 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  7f;.    do{.    
b650: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50    nPayload = (nP
b660: 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b  ayload<<7) | (*+
b670: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
b680: 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49      }while( *(pI
b690: 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49  ter)>=0x80 && pI
b6a0: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
b6b0: 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e    pIter++;.  pIn
b6c0: 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c  fo->nKey = nPayl
b6d0: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  oad;.  pInfo->nP
b6e0: 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61  ayload = nPayloa
b6f0: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  d;.  pInfo->pPay
b700: 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20  load = pIter;.  
b710: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
b720: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
b730: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
b740: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
b750: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
b760: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
b770: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
b780: 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  l ){.    /* This
b790: 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63   is the (easy) c
b7a0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
b7b0: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c   the entire payl
b7c0: 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20  oad fits.    ** 
b7d0: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
b7e0: 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20  e.  No overflow 
b7f0: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
b800: 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   */.    pInfo->n
b810: 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20  Size = nPayload 
b820: 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  + (u16)(pIter - 
b830: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
b840: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29  pInfo->nSize<4 )
b850: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
b860: 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  4;.    pInfo->nL
b870: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79  ocal = (u16)nPay
b880: 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  load;.  }else{. 
b890: 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
b8a0: 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76  lAdjustSizeForOv
b8b0: 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43  erflow(pPage, pC
b8c0: 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d  ell, pInfo);.  }
b8d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  .}.static void b
b8e0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20  treeParseCell(. 
b8f0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
b900: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
b910: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
b920: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43  cell */.  int iC
b930: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
b940: 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e    /* The cell in
b950: 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c  dex.  First cell
b960: 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49   is 0 */.  CellI
b970: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
b980: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
b990: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
b9a0: 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  ){.  pPage->xPar
b9b0: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69  seCell(pPage, fi
b9c0: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
b9d0: 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  ell), pInfo);.}.
b9e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
b9f0: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
ba00: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
ba10: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
ba20: 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65  .xCellSize.** me
ba30: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  thod..**.** Comp
ba40: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ute the total nu
ba50: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68  mber of bytes th
ba60: 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20  at a Cell needs 
ba70: 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  in the cell.** d
ba80: 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20  ata area of the 
ba90: 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65  btree-page.  The
baa0: 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69   return number i
bab0: 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c  ncludes the cell
bac0: 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20  .** data header 
bad0: 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61  and the local pa
bae0: 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61  yload, but not a
baf0: 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
bb00: 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65   or.** the space
bb10: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c   used by the cel
bb20: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  l pointer..**.**
bb30: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
bb40: 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20  yload()    =>   
bb50: 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e  table internal n
bb60: 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65  odes.** cellSize
bb70: 50 74 72 28 29 20 20 20 20 20 20 20 20 20 20 20  Ptr()           
bb80: 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78    =>   all index
bb90: 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c   nodes & table l
bba0: 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61  eaf nodes.*/.sta
bbb0: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
bbc0: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
bbd0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
bbe0: 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43    u8 *pIter = pC
bbf0: 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  ell + pPage->chi
bc00: 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f  ldPtrSize; /* Fo
bc10: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62  r looping over b
bc20: 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f  ytes of pCell */
bc30: 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20  .  u8 *pEnd;    
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
bc60: 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61  nd mark for a va
bc70: 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53  rint */.  u32 nS
bc80: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65     /* Size value
bcb0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23   to return */..#
bcc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
bcd0: 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  UG.  /* The valu
bce0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
bcf0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
bd00: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ld always be the
bd10: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68   same as.  ** th
bd20: 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a  e (CellInfo.nSiz
bd30: 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62  e) value found b
bd40: 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70  y doing a full p
bd50: 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  arse of the.  **
bd60: 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45   cell. If SQLITE
bd70: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
bd80: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61  d, an assert() a
bd90: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a  t the bottom of.
bda0: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
bdb0: 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74  on verifies that
bdc0: 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   this invariant 
bdd0: 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e  is not violated.
bde0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64   */.  CellInfo d
bdf0: 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67  ebuginfo;.  pPag
be00: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
be10: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62  age, pCell, &deb
be20: 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a  uginfo);.#endif.
be30: 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65  .  nSize = *pIte
be40: 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d  r;.  if( nSize>=
be50: 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64  0x80 ){.    pEnd
be60: 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20   = &pIter[8];.  
be70: 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b    nSize &= 0x7f;
be80: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
be90: 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37  Size = (nSize<<7
bea0: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
beb0: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
bec0: 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38  e( *(pIter)>=0x8
bed0: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
bee0: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
bef0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
bf00: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
bf10: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
bf20: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
bf30: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
bf40: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
bf50: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
bf60: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
bf70: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
bf80: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
bf90: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
bfa0: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
bfb0: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
bfc0: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
bfd0: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
bfe0: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
bff0: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
c000: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
c010: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
c020: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
c030: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
c040: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
c050: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
c060: 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d  f( nSize<=pPage-
c070: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
c080: 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28   nSize += (u32)(
c090: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
c0a0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20      if( nSize<4 
c0b0: 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d  ) nSize = 4;.  }
c0c0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69  else{.    int mi
c0d0: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
c0e0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53  minLocal;.    nS
c0f0: 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  ize = minLocal +
c100: 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63   (nSize - minLoc
c110: 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  al) % (pPage->pB
c120: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
c130: 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
c140: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
c150: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  maxLocal );.    
c160: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
c170: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
c180: 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  +1 );.    if( nS
c190: 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ize>pPage->maxLo
c1a0: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  cal ){.      nSi
c1b0: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  ze = minLocal;. 
c1c0: 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b     }.    nSize +
c1d0: 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49 74 65  = 4 + (u16)(pIte
c1e0: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a  r - pCell);.  }.
c1f0: 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d    assert( nSize=
c200: 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65  =debuginfo.nSize
c210: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
c220: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
c230: 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20  nSize;.}.static 
c240: 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e  u16 cellSizePtrN
c250: 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65  oPayload(MemPage
c260: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
c270: 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  ll){.  u8 *pIter
c280: 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a   = pCell + 4; /*
c290: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
c2a0: 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c  r bytes of pCell
c2b0: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20   */.  u8 *pEnd; 
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c2d0: 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76  End mark for a v
c2e0: 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66  arint */..#ifdef
c2f0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
c300: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  /* The value ret
c310: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
c320: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  nction should al
c330: 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65  ways be the same
c340: 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65   as.  ** the (Ce
c350: 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61  llInfo.nSize) va
c360: 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69  lue found by doi
c370: 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20  ng a full parse 
c380: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  of the.  ** cell
c390: 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55  . If SQLITE_DEBU
c3a0: 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  G is defined, an
c3b0: 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65   assert() at the
c3c0: 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20   bottom of.  ** 
c3d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65  this function ve
c3e0: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73  rifies that this
c3f0: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f   invariant is no
c400: 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20  t violated. */. 
c410: 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69   CellInfo debugi
c420: 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  nfo;.  pPage->xP
c430: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
c440: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
c450: 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  o);.#else.  UNUS
c460: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61  ED_PARAMETER(pPa
c470: 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ge);.#endif..  a
c480: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
c490: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
c4a0: 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20  .  pEnd = pIter 
c4b0: 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a  + 9;.  while( (*
c4c0: 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26  pIter++)&0x80 &&
c4d0: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
c4e0: 20 61 73 73 65 72 74 28 20 64 65 62 75 67 69 6e   assert( debugin
c4f0: 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28  fo.nSize==(u16)(
c500: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c  pIter - pCell) |
c510: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
c520: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28 70    return (u16)(p
c530: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d  Iter - pCell);.}
c540: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
c550: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76  _DEBUG./* This v
c560: 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c  ariation on cell
c570: 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65  SizePtr() is use
c580: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
c590: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a  rt() statements.
c5a0: 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74  ** only. */.stat
c5b0: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28  ic u16 cellSize(
c5c0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
c5d0: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65  int iCell){.  re
c5e0: 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c  turn pPage->xCel
c5f0: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e  lSize(pPage, fin
c600: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
c610: 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ll));.}.#endif..
c620: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c630: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
c640: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
c650: 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20   pCell, part of 
c660: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
c670: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
c680: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
c690: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
c6a0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
c6b0: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
c6c0: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
c6d0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
c6e0: 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66  oid ptrmapPutOvf
c6f0: 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  lPtr(MemPage *pP
c700: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20  age, u8 *pCell, 
c710: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c  int *pRC){.  Cel
c720: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66  lInfo info;.  if
c730: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
c740: 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
c750: 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  !=0 );.  pPage->
c760: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
c770: 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
c780: 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63  .  if( info.nLoc
c790: 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  al<info.nPayload
c7a0: 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66   ){.    Pgno ovf
c7b0: 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
c7c0: 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell[info.nSize-4
c7d0: 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
c7e0: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
c7f0: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
c800: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
c810: 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23  o, pRC);.  }.}.#
c820: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
c830: 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67  fragment the pag
c840: 65 20 67 69 76 65 6e 2e 20 54 68 69 73 20 72 6f  e given. This ro
c850: 75 74 69 6e 65 20 72 65 6f 72 67 61 6e 69 7a 65  utine reorganize
c860: 73 20 63 65 6c 6c 73 20 77 69 74 68 69 6e 20 74  s cells within t
c870: 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f 20 74 68  he.** page so th
c880: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
c890: 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e 20 74  free-blocks on t
c8a0: 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6c 69  he free-block li
c8b0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  st..**.** Parame
c8c0: 74 65 72 20 6e 4d 61 78 46 72 61 67 20 69 73 20  ter nMaxFrag is 
c8d0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
c8e0: 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  nt of fragmented
c8f0: 20 73 70 61 63 65 20 74 68 61 74 20 6d 61 79 20   space that may 
c900: 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e  be.** present in
c910: 20 74 68 65 20 70 61 67 65 20 61 66 74 65 72 20   the page after 
c920: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
c930: 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44  urns..**.** EVID
c940: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32  ENCE-OF: R-44582
c950: 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61  -60138 SQLite ma
c960: 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74  y from time to t
c970: 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61  ime reorganize a
c980: 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20  .** b-tree page 
c990: 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72  so that there ar
c9a0: 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20  e no freeblocks 
c9b0: 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65  or fragment byte
c9c0: 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64  s, all.** unused
c9d0: 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61   bytes are conta
c9e0: 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c  ined in the unal
c9f0: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65  located space re
ca00: 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a  gion, and all.**
ca10: 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65   cells are packe
ca20: 64 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65  d tightly at the
ca30: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
ca40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ca50: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
ca60: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
ca70: 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b 0a 20 20  nt nMaxFrag){.  
ca80: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
ca90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
caa0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
cab0: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
cac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
cad0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74  dress of the i-t
cae0: 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  h cell */.  int 
caf0: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
cb00: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
cb10: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
cb20: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a  der */.  int siz
cb30: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
cb40: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
cb50: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75   cell */.  int u
cb60: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  sableSize;      
cb70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
cb80: 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20  of usable bytes 
cb90: 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  on a page */.  i
cba0: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
cbb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
cbc0: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
cbd0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
cbe0: 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20  .  int cbrk;    
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cc00: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
cc10: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
cc20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
cc50: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  lls on the page 
cc60: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
cc70: 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ar *data;       
cc80: 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61  /* The page data
cc90: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
cca0: 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20  har *temp;      
ccb0: 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f   /* Temp area fo
ccc0: 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  r cell content *
ccd0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
cce0: 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f  r *src;        /
ccf0: 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74  * Source of cont
cd00: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ent */.  int iCe
cd10: 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  llFirst;        
cd20: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
cd30: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  owable cell inde
cd40: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  x */.  int iCell
cd50: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
cd60: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
cd70: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
cd80: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
cd90: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
cda0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
cdb0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
cdc0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
cdd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
cde0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
cdf0: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
ce00: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
ce10: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
ce20: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
ce30: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ce40: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
ce50: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
ce60: 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20  ;.  temp = 0;.  
ce70: 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61  src = data = pPa
ce80: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
ce90: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
cea0: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
ceb0: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
cec0: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
ced0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
cee0: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
cef0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
cf00: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 69 43 65 6c  dr+3]) );.  iCel
cf10: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
cf20: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20  set + 2*nCell;. 
cf30: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
cf40: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
cf50: 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  Size;..  /* This
cf60: 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 20 70   block handles p
cf70: 61 67 65 73 20 77 69 74 68 20 74 77 6f 20 6f 72  ages with two or
cf80: 20 66 65 77 65 72 20 66 72 65 65 20 62 6c 6f 63   fewer free bloc
cf90: 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72 61 67 0a  ks and nMaxFrag.
cfa0: 20 20 2a 2a 20 6f 72 20 66 65 77 65 72 20 66 72    ** or fewer fr
cfb0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 2e 20  agmented bytes. 
cfc0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  In this case it 
cfd0: 69 73 20 66 61 73 74 65 72 20 74 6f 20 6d 6f 76  is faster to mov
cfe0: 65 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 28  e the.  ** two (
cff0: 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b 73 20 6f  or one) blocks o
d000: 66 20 63 65 6c 6c 73 20 75 73 69 6e 67 20 6d 65  f cells using me
d010: 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61 64 64 20  mmove() and add 
d020: 74 68 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a  the required.  *
d030: 2a 20 6f 66 66 73 65 74 73 20 74 6f 20 65 61 63  * offsets to eac
d040: 68 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  h pointer in the
d050: 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
d060: 72 61 79 20 74 68 61 6e 20 69 74 20 69 73 20 74  ray than it is t
d070: 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e 73 74 72  o .  ** reconstr
d080: 75 63 74 20 74 68 65 20 65 6e 74 69 72 65 20 70  uct the entire p
d090: 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28  age.  */.  if( (
d0a0: 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 3c  int)data[hdr+7]<
d0b0: 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a 20 20 20  =nMaxFrag ){.   
d0c0: 20 69 6e 74 20 69 46 72 65 65 20 3d 20 67 65 74   int iFree = get
d0d0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
d0e0: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 46 72  1]);.    if( iFr
d0f0: 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ee ){.      int 
d100: 69 46 72 65 65 32 20 3d 20 67 65 74 32 62 79 74  iFree2 = get2byt
d110: 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d 29 3b  e(&data[iFree]);
d120: 0a 0a 20 20 20 20 20 20 2f 2a 20 70 61 67 65 46  ..      /* pageF
d130: 69 6e 64 53 6c 6f 74 28 29 20 68 61 73 20 61 6c  indSlot() has al
d140: 72 65 61 64 79 20 76 65 72 69 66 69 65 64 20 74  ready verified t
d150: 68 61 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  hat free blocks 
d160: 61 72 65 20 73 6f 72 74 65 64 0a 20 20 20 20 20  are sorted.     
d170: 20 2a 2a 20 69 6e 20 6f 72 64 65 72 20 6f 66 20   ** in order of 
d180: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74 68  offset within th
d190: 65 20 70 61 67 65 2c 20 61 6e 64 20 74 68 61 74  e page, and that
d1a0: 20 6e 6f 20 62 6c 6f 63 6b 20 65 78 74 65 6e 64   no block extend
d1b0: 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 73 74 20  s.      ** past 
d1c0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
d1d0: 61 67 65 2e 20 50 72 6f 76 69 64 65 64 20 74 68  age. Provided th
d1e0: 65 20 74 77 6f 20 66 72 65 65 20 73 6c 6f 74 73  e two free slots
d1f0: 20 64 6f 20 6e 6f 74 20 0a 20 20 20 20 20 20 2a   do not .      *
d200: 2a 20 6f 76 65 72 6c 61 70 2c 20 74 68 69 73 20  * overlap, this 
d210: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
d220: 74 68 65 20 6d 65 6d 6d 6f 76 65 28 29 20 63 61  the memmove() ca
d230: 6c 6c 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  lls below will n
d240: 6f 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  ot.      ** over
d250: 77 72 69 74 65 20 74 68 65 20 75 73 61 62 6c 65  write the usable
d260: 53 69 7a 65 20 62 79 74 65 20 62 75 66 66 65 72  Size byte buffer
d270: 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 64 61  , even if the da
d280: 74 61 62 61 73 65 20 70 61 67 65 0a 20 20 20 20  tabase page.    
d290: 20 20 2a 2a 20 69 73 20 63 6f 72 72 75 70 74 2e    ** is corrupt.
d2a0: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
d2b0: 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20  t( iFree2==0 || 
d2c0: 69 46 72 65 65 32 3e 69 46 72 65 65 20 29 3b 0a  iFree2>iFree );.
d2d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
d2e0: 72 65 65 2b 67 65 74 32 62 79 74 65 28 26 64 61  ree+get2byte(&da
d2f0: 74 61 5b 69 46 72 65 65 2b 32 5d 29 20 3c 3d 20  ta[iFree+2]) <= 
d300: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
d310: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
d320: 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 2b  e2==0 || iFree2+
d330: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
d340: 46 72 65 65 32 2b 32 5d 29 20 3c 3d 20 75 73 61  Free2+2]) <= usa
d350: 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  bleSize );..    
d360: 20 20 69 66 28 20 30 3d 3d 69 46 72 65 65 32 20    if( 0==iFree2 
d370: 7c 7c 20 28 64 61 74 61 5b 69 46 72 65 65 32 5d  || (data[iFree2]
d380: 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 46 72 65  ==0 && data[iFre
d390: 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20 20 20  e2+1]==0) ){.   
d3a0: 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20       u8 *pEnd = 
d3b0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
d3c0: 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20   + nCell*2];.   
d3d0: 20 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 0a       u8 *pAddr;.
d3e0: 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 32 20          int sz2 
d3f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
d400: 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26   sz = get2byte(&
d410: 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29 3b 0a  data[iFree+2]);.
d420: 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f 70 20          int top 
d430: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
d440: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
d450: 20 20 69 66 28 20 69 46 72 65 65 32 20 29 7b 0a    if( iFree2 ){.
d460: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46            if( iF
d470: 72 65 65 2b 73 7a 3e 69 46 72 65 65 32 20 29 20  ree+sz>iFree2 ) 
d480: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d490: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d4a0: 20 20 20 20 20 20 73 7a 32 20 3d 20 67 65 74 32        sz2 = get2
d4b0: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
d4c0: 32 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  2+2]);.         
d4d0: 20 61 73 73 65 72 74 28 20 69 46 72 65 65 2b 73   assert( iFree+s
d4e0: 7a 2b 73 7a 32 2b 69 46 72 65 65 32 2d 28 69 46  z+sz2+iFree2-(iF
d4f0: 72 65 65 2b 73 7a 29 20 3c 3d 20 75 73 61 62 6c  ree+sz) <= usabl
d500: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
d510: 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61     memmove(&data
d520: 5b 69 46 72 65 65 2b 73 7a 2b 73 7a 32 5d 2c 20  [iFree+sz+sz2], 
d530: 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 5d 2c  &data[iFree+sz],
d540: 20 69 46 72 65 65 32 2d 28 69 46 72 65 65 2b 73   iFree2-(iFree+s
d550: 7a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  z));.          s
d560: 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20 20 20 20 20  z += sz2;.      
d570: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 62 72 6b    }.        cbrk
d580: 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20 20   = top+sz;.     
d590: 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b     assert( cbrk+
d5a0: 28 69 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20 75  (iFree-top) <= u
d5b0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
d5c0: 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61       memmove(&da
d5d0: 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  ta[cbrk], &data[
d5e0: 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70 29  top], iFree-top)
d5f0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 41  ;.        for(pA
d600: 64 64 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66  ddr=&data[cellOf
d610: 66 73 65 74 5d 3b 20 70 41 64 64 72 3c 70 45 6e  fset]; pAddr<pEn
d620: 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20 20  d; pAddr+=2){.  
d630: 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74          pc = get
d640: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
d650: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c 69          if( pc<i
d660: 46 72 65 65 20 29 7b 20 70 75 74 32 62 79 74 65  Free ){ put2byte
d670: 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b 20  (pAddr, pc+sz); 
d680: 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65  }.          else
d690: 20 69 66 28 20 70 63 3c 69 46 72 65 65 32 20 29   if( pc<iFree2 )
d6a0: 7b 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72  { put2byte(pAddr
d6b0: 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20 20  , pc+sz2); }.   
d6c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
d6d0: 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f  oto defragment_o
d6e0: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
d6f0: 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d 20  }.  }..  cbrk = 
d700: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43  usableSize;.  iC
d710: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
d720: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28  Size - 4;.  for(
d730: 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
d740: 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64  +){.    u8 *pAdd
d750: 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d  r;     /* The i-
d760: 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  th cell pointer 
d770: 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26  */.    pAddr = &
d780: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20  data[cellOffset 
d790: 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d  + i*2];.    pc =
d7a0: 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29   get2byte(pAddr)
d7b0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
d7c0: 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  pc==iCellFirst )
d7d0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
d7e0: 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
d7f0: 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f  .    /* These co
d800: 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c  nditions have al
d810: 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66  ready been verif
d820: 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74  ied in btreeInit
d830: 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66  Page().    ** if
d840: 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a   PRAGMA cell_siz
d850: 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20  e_check=ON..    
d860: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43  */.    if( pc<iC
d870: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
d880: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
d890: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d8a0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
d8b0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
d8c0: 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26  pc>=iCellFirst &
d8d0: 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20  & pc<=iCellLast 
d8e0: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50  );.    size = pP
d8f0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
d900: 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b  Page, &src[pc]);
d910: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
d920: 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c  e;.    if( cbrk<
d930: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
d940: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
d950: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
d960: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d970: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
d980: 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a  assert( cbrk+siz
d990: 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26  e<=usableSize &&
d9a0: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
d9b0: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
d9c0: 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73  e( cbrk+size==us
d9d0: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
d9e0: 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a  testcase( pc+siz
d9f0: 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e==usableSize );
da00: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
da10: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20  ddr, cbrk);.    
da20: 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20  if( temp==0 ){. 
da30: 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20       int x;.    
da40: 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29    if( cbrk==pc )
da50: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
da60: 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50   temp = sqlite3P
da70: 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50  agerTempSpace(pP
da80: 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  age->pBt->pPager
da90: 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74  );.      x = get
daa0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
dab0: 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  5]);.      memcp
dac0: 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74  y(&temp[x], &dat
dad0: 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65  a[x], (cbrk+size
dae0: 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72  ) - x);.      sr
daf0: 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a  c = temp;.    }.
db00: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
db10: 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d  [cbrk], &src[pc]
db20: 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 64  , size);.  }.  d
db30: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
db40: 0a 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74  . defragment_out
db50: 3a 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72  :.  if( data[hdr
db60: 2b 37 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c 46 69  +7]+cbrk-iCellFi
db70: 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65  rst!=pPage->nFre
db80: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
db90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
dba0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
dbb0: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
dbc0: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
dbd0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
dbe0: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
dbf0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
dc00: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d  [hdr+2] = 0;.  m
dc10: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c  emset(&data[iCel
dc20: 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b  lFirst], 0, cbrk
dc30: 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20  -iCellFirst);.  
dc40: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
dc50: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
dc60: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
dc70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
dc80: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
dc90: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 2d  Search the free-
dca0: 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67  list on page pPg
dcb0: 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74   for space to st
dcc0: 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65  ore a cell nByte
dcd0: 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a   bytes in.** siz
dce0: 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65  e. If one can be
dcf0: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61   found, return a
dd00: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
dd10: 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65  space and remove
dd20: 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   it.** from the 
dd30: 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
dd40: 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20   If no suitable 
dd50: 73 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75  space can be fou
dd60: 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  nd on the free-l
dd70: 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ist, return NULL
dd80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
dd90: 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74  ction may detect
dda0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68   corruption with
ddb0: 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72  in pPg.  If corr
ddc0: 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74  uption is.** det
ddd0: 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20  ected then *pRc 
dde0: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
ddf0: 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c  _CORRUPT and NUL
de00: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
de10: 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68  *.** Slots on th
de20: 65 20 66 72 65 65 20 6c 69 73 74 20 74 68 61 74  e free list that
de30: 20 61 72 65 20 62 65 74 77 65 65 6e 20 31 20 61   are between 1 a
de40: 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72 67 65  nd 3 bytes large
de50: 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20  r than nByte.** 
de60: 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20  will be ignored 
de70: 69 66 20 61 64 64 69 6e 67 20 74 68 65 20 65 78  if adding the ex
de80: 74 72 61 20 73 70 61 63 65 20 74 6f 20 74 68 65  tra space to the
de90: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
dea0: 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74  ount.** causes t
deb0: 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  he fragmentation
dec0: 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64   count to exceed
ded0: 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75   60..*/.static u
dee0: 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28  8 *pageFindSlot(
def0: 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  MemPage *pPg, in
df00: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52  t nByte, int *pR
df10: 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  c){.  const int 
df20: 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66  hdr = pPg->hdrOf
df30: 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  fset;.  u8 * con
df40: 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e  st aData = pPg->
df50: 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64  aData;.  int iAd
df60: 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  dr = hdr + 1;.  
df70: 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74  int pc = get2byt
df80: 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29  e(&aData[iAddr])
df90: 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74  ;.  int x;.  int
dfa0: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
dfb0: 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  g->pBt->usableSi
dfc0: 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ze;..  assert( p
dfd0: 63 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  c>0 );.  do{.   
dfe0: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
dff0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
e000: 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a   the free slot *
e010: 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  /.    /* EVIDENC
e020: 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33 39  E-OF: R-06866-39
e030: 31 32 35 20 46 72 65 65 62 6c 6f 63 6b 73 20 61  125 Freeblocks a
e040: 72 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63  re always connec
e050: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a  ted in order of.
e060: 20 20 20 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e      ** increasin
e070: 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20  g offset. */.   
e080: 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69   if( pc>usableSi
e090: 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64 72  ze-4 || pc<iAddr
e0a0: 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63  +4 ){.      *pRc
e0b0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
e0c0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
e0d0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
e0e0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
e0f0: 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20  : R-22710-53328 
e100: 54 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f  The third and fo
e110: 75 72 74 68 20 62 79 74 65 73 20 6f 66 20 65 61  urth bytes of ea
e120: 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c  ch.    ** freebl
e130: 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65  ock form a big-e
e140: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
e150: 69 63 68 20 69 73 20 74 68 65 20 73 69 7a 65 20  ich is the size 
e160: 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  of the freeblock
e170: 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73  .    ** in bytes
e180: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
e190: 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a  4-byte header. *
e1a0: 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74  /.    size = get
e1b0: 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b  2byte(&aData[pc+
e1c0: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20  2]);.    if( (x 
e1d0: 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e  = size - nByte)>
e1e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
e1f0: 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20  case( x==4 );.  
e200: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
e210: 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =3 );.      if( 
e220: 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f 66  pc < pPg->cellOf
e230: 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65 6c  fset+2*pPg->nCel
e240: 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20 75  l || size+pc > u
e250: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
e260: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
e270: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
e280: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e290: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
e2a0: 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20  f( x<4 ){.      
e2b0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
e2c0: 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20  : R-11498-58022 
e2d0: 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  In a well-formed
e2e0: 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68   b-tree page, th
e2f0: 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20  e total.        
e300: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  ** number of byt
e310: 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20  es in fragments 
e320: 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36  may not exceed 6
e330: 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  0. */.        if
e340: 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35  ( aData[hdr+7]>5
e350: 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  7 ) return 0;.. 
e360: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
e370: 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74   the slot from t
e380: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70  he free-list. Up
e390: 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  date the number 
e3a0: 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72  of.        ** fr
e3b0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77  agmented bytes w
e3c0: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20  ithin the page. 
e3d0: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  */.        memcp
e3e0: 79 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c  y(&aData[iAddr],
e3f0: 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b   &aData[pc], 2);
e400: 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68  .        aData[h
e410: 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a  dr+7] += (u8)x;.
e420: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e430: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74       /* The slot
e440: 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20   remains on the 
e450: 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63  free-list. Reduc
e460: 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63  e its size to ac
e470: 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a  count.         *
e480: 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  * for the portio
e490: 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65  n used by the ne
e4a0: 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f  w allocation. */
e4b0: 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74  .        put2byt
e4c0: 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20  e(&aData[pc+2], 
e4d0: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
e4e0: 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b    return &aData[
e4f0: 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20  pc + x];.    }. 
e500: 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20     iAddr = pc;. 
e510: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
e520: 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20  (&aData[pc]);.  
e530: 7d 77 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20  }while( pc );.. 
e540: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
e550: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
e560: 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  te bytes of spac
e570: 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  e from within th
e580: 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61  e B-Tree page pa
e590: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
e5a0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57  irst argument. W
e5b0: 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20  rite into *pIdx 
e5c0: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70  the index into p
e5d0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a  Page->aData[].**
e5e0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79   of the first by
e5f0: 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  te of allocated 
e600: 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69  space. Return ei
e610: 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  ther SQLITE_OK o
e620: 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  r.** an error co
e630: 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49  de (usually SQLI
e640: 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a  TE_CORRUPT)..**.
e650: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75  ** The caller gu
e660: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
e670: 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e  ere is sufficien
e680: 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20  t space to make 
e690: 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  the.** allocatio
e6a0: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
e6b0: 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64   might need to d
e6c0: 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64  efragment in ord
e6d0: 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61  er to bring.** a
e6e0: 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67  ll the space tog
e6f0: 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20  ether, however. 
e700: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
e710: 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a  ll avoid using.*
e720: 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20  * the first two 
e730: 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63  bytes past the c
e740: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61  ell pointer area
e750: 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c   since presumabl
e760: 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61  y this.** alloca
e770: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61  tion is being ma
e780: 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  de in order to i
e790: 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
e7a0: 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20  , so we will.** 
e7b0: 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64  also end up need
e7c0: 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70  ing a new cell p
e7d0: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
e7e0: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70  c int allocateSp
e7f0: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
e800: 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  ge, int nByte, i
e810: 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e  nt *pIdx){.  con
e820: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
e830: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
e840: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
e850: 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66   of pPage->hdrOf
e860: 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63  fset */.  u8 * c
e870: 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67  onst data = pPag
e880: 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f  e->aData;      /
e890: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
e8a0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
e8b0: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
e8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
e8e0: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
e8f0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
e900: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e910: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
e920: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
e930: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
e940: 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20   int gap;       
e950: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
e960: 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65  f gap between ce
e970: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ll pointers and 
e980: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
e990: 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
e9a0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
e9b0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
e9c0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
e9d0: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
e9e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e9f0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ea00: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
ea10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
ea20: 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e  te>=0 );  /* Min
ea30: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
ea40: 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s 4 */.  assert(
ea50: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e   pPage->nFree>=n
ea60: 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Byte );.  assert
ea70: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
ea80: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
ea90: 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29  t( nByte < (int)
eaa0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
eab0: 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20  bleSize-8) );.. 
eac0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ead0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
eae0: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
eaf0: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
eb00: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
eb10: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
eb20: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
eb30: 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  gap<=65536 );.  
eb40: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
eb50: 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66  R-29356-02391 If
eb60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
eb70: 65 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20  es a 65536-byte 
eb80: 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61  page size.  ** a
eb90: 6e 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20  nd the reserved 
eba0: 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74  space is zero (t
ebb0: 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66  he usual value f
ebc0: 6f 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63  or reserved spac
ebd0: 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  e).  ** then the
ebe0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
ebf0: 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79  fset of an empty
ec00: 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62   page wants to b
ec10: 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f  e 65536..  ** Ho
ec20: 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65  wever, that inte
ec30: 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ger is too large
ec40: 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e   to be stored in
ec50: 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e   a 2-byte unsign
ec60: 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c  ed.  ** integer,
ec70: 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30   so a value of 0
ec80: 20 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20   is used in its 
ec90: 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20  place. */.  top 
eca0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ecb0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65  [hdr+5]);.  asse
ecc0: 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50  rt( top<=(int)pP
ecd0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
ece0: 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65  Size ); /* Preve
ecf0: 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74  nt by getAndInit
ed00: 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20  Page() */.  if( 
ed10: 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69  gap>top ){.    i
ed20: 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61  f( top==0 && pPa
ed30: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
ed40: 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20  ize==65536 ){.  
ed50: 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b      top = 65536;
ed60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ed70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ed80: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ed90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
eda0: 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
edb0: 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 67   space between g
edc0: 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f  ap and top for o
edd0: 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69  ne more cell poi
ede0: 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20  nter.  ** array 
edf0: 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e  entry offset, an
ee00: 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69 73  d if the freelis
ee10: 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20  t is not empty, 
ee20: 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a  then search the.
ee30: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f    ** freelist lo
ee40: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
ee50: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
ee60: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
ee70: 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20  request..  */.  
ee80: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d  testcase( gap+2=
ee90: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
eea0: 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29  se( gap+1==top )
eeb0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
eec0: 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  p==top );.  if( 
eed0: 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20  (data[hdr+2] || 
eee0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20  data[hdr+1]) && 
eef0: 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20  gap+2<=top ){.  
ef00: 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70    u8 *pSpace = p
ef10: 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67  ageFindSlot(pPag
ef20: 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a  e, nByte, &rc);.
ef30: 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20 29      if( pSpace )
ef40: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ef50: 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20  pSpace>=data && 
ef60: 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c  (pSpace - data)<
ef70: 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a  65536 );.      *
ef80: 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70  pIdx = (int)(pSp
ef90: 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20  ace - data);.   
efa0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
efb0: 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
efc0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
efd0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
efe0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65    }..  /* The re
eff0: 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20  quest could not 
f000: 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69  be fulfilled usi
f010: 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c  ng a freelist sl
f020: 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20  ot.  Check.  ** 
f030: 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61 67  to see if defrag
f040: 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63  mentation is nec
f050: 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74  essary..  */.  t
f060: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e  estcase( gap+2+n
f070: 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69  Byte==top );.  i
f080: 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74  f( gap+2+nByte>t
f090: 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  op ){.    assert
f0a0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
f0b0: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
f0c0: 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61  ;.    rc = defra
f0d0: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 2c  gmentPage(pPage,
f0e0: 20 4d 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e 6e   MIN(4, pPage->n
f0f0: 46 72 65 65 20 2d 20 28 32 2b 6e 42 79 74 65 29  Free - (2+nByte)
f100: 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
f110: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f120: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
f130: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
f140: 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  5]);.    assert(
f150: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f   gap+2+nByte<=to
f160: 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  p );.  }...  /* 
f170: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
f180: 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20  from the gap in 
f190: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
f1a0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20   pointer array. 
f1b0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c   ** and the cell
f1c0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20   content area.  
f1d0: 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67  The btreeInitPag
f1e0: 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72  e() call has alr
f1f0: 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61  eady.  ** valida
f200: 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74  ted the freelist
f210: 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68  .  Given that th
f220: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61  e freelist is va
f230: 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20  lid, there.  ** 
f240: 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74  is no way that t
f250: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  he allocation ca
f260: 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65  n extend off the
f270: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
f280: 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72  ..  ** The asser
f290: 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69  t() below verifi
f2a0: 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  es the previous 
f2b0: 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  sentence..  */. 
f2c0: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
f2d0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
f2e0: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
f2f0: 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74  assert( top+nByt
f300: 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  e <= (int)pPage-
f310: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
f320: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
f330: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
f340: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f350: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
f360: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
f370: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
f380: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
f390: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
f3a0: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
f3b0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53   pPage->aData[iS
f3c0: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
f3d0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
f3e0: 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65  ck is iSize byte
f3f0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e  s..**.** Adjacen
f400: 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  t freeblocks are
f410: 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a   coalesced..**.*
f420: 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e  * Note that even
f430: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
f440: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
f450: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
f460: 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68  nitPage(),.** th
f470: 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  at routine will 
f480: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
f490: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73  ap between cells
f4a0: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   or freeblocks. 
f4b0: 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20   Nor.** does it 
f4c0: 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20  detect cells or 
f4d0: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
f4e0: 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68  encrouch into th
f4f0: 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  e reserved bytes
f500: 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
f510: 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20  f the page.  So 
f520: 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  do additional co
f530: 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20  rruption checks 
f540: 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72  inside this.** r
f550: 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72  outine and retur
f560: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f570: 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73   if any problems
f580: 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   are found..*/.s
f590: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
f5a0: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
f5b0: 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20  ge, u16 iStart, 
f5c0: 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31  u16 iSize){.  u1
f5d0: 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20  6 iPtr;         
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
f600: 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72  f ptr to next fr
f610: 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36  eeblock */.  u16
f620: 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20   iFreeBlk;      
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f640: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
f650: 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c   the next freebl
f660: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b  ock */.  u8 hdr;
f670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f690: 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69  * Page header si
f6a0: 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f  ze.  0 or 100 */
f6b0: 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b  .  u8 nFrag = 0;
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75           /* Redu
f6e0: 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e  ction in fragmen
f6f0: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20  tation */.  u16 
f700: 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a  iOrigSize = iSiz
f710: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
f720: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
f730: 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a  lue of iSize */.
f740: 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50    u32 iLast = pP
f750: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
f760: 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65  Size-4; /* Large
f770: 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65  st possible free
f780: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
f790: 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74    u32 iEnd = iSt
f7a0: 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20  art + iSize;    
f7b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
f7c0: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69   byte past the i
f7d0: 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a  Start buffer */.
f7e0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
f7f0: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
f800: 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20  Data;   /* Page 
f810: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
f820: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
f830: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
f840: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
f850: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
f860: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
f870: 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
f880: 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67   || iStart>=pPag
f890: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70  e->hdrOffset+6+p
f8a0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
f8b0: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
f8c0: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45  CORRUPT_DB || iE
f8d0: 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74  nd <= pPage->pBt
f8e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
f8f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f900: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
f910: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
f920: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 69  );.  assert( iSi
f930: 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69  ze>=4 );   /* Mi
f940: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
f950: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
f960: 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73 74 20  ( iStart<=iLast 
f970: 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69  );..  /* Overwri
f980: 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
f990: 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
f9a0: 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72  s when the secur
f9b0: 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70  e_delete.  ** op
f9c0: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
f9d0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
f9e0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
f9f0: 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
fa00: 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  E ){.    memset(
fa10: 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30  &data[iStart], 0
fa20: 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  , iSize);.  }.. 
fa30: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20   /* The list of 
fa40: 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20  freeblocks must 
fa50: 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  be in ascending 
fa60: 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65  order.  Find the
fa70: 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74   .  ** spot on t
fa80: 68 65 20 6c 69 73 74 20 77 68 65 72 65 20 69 53  he list where iS
fa90: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69  tart should be i
faa0: 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  nserted..  */.  
fab0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
fac0: 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d  Offset;.  iPtr =
fad0: 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20   hdr + 1;.  if( 
fae0: 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20  data[iPtr+1]==0 
faf0: 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30  && data[iPtr]==0
fb00: 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b   ){.    iFreeBlk
fb10: 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63   = 0;  /* Shortc
fb20: 75 74 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  ut for the case 
fb30: 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73  when the freelis
fb40: 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20  t is empty */.  
fb50: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
fb60: 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65  ( (iFreeBlk = ge
fb70: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
fb80: 72 5d 29 29 3c 69 53 74 61 72 74 20 29 7b 0a 20  r]))<iStart ){. 
fb90: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c       if( iFreeBl
fba0: 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20 20 20 20  k<iPtr+4 ){.    
fbb0: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
fbc0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
fbd0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fbe0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
fbf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
fc00: 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a  Ptr = iFreeBlk;.
fc10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46      }.    if( iF
fc20: 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72  reeBlk>iLast ) r
fc30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
fc40: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
fc50: 73 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e  ssert( iFreeBlk>
fc60: 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b  iPtr || iFreeBlk
fc70: 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  ==0 );.  .    /*
fc80: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a   At this point:.
fc90: 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42      **    iFreeB
fca0: 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65 65  lk:   First free
fcb0: 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61  block after iSta
fcc0: 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e  rt, or zero if n
fcd0: 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50  one.    **    iP
fce0: 74 72 3a 20 20 20 20 20 20 20 54 68 65 20 61 64  tr:       The ad
fcf0: 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74  dress of a point
fd00: 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20  er to iFreeBlk. 
fd10: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65     **.    ** Che
fd20: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 46 72  ck to see if iFr
fd30: 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20  eeBlk should be 
fd40: 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74  coalesced onto t
fd50: 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74  he end of iStart
fd60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fd70: 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e   iFreeBlk && iEn
fd80: 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b  d+3>=iFreeBlk ){
fd90: 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69  .      nFrag = i
fda0: 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a  FreeBlk - iEnd;.
fdb0: 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69        if( iEnd>i
fdc0: 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e  FreeBlk ) return
fdd0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
fde0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 45 6e 64  BKPT;.      iEnd
fdf0: 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65   = iFreeBlk + ge
fe00: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
fe10: 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20  eeBlk+2]);.     
fe20: 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67   if( iEnd > pPag
fe30: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
fe40: 7a 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ze ) return SQLI
fe50: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
fe60: 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69  .      iSize = i
fe70: 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20  End - iStart;.  
fe80: 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67      iFreeBlk = g
fe90: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
fea0: 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a  reeBlk]);.    }.
feb0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74    .    /* If iPt
fec0: 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65  r is another fre
fed0: 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c  eblock (that is,
fee0: 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20   if iPtr is not 
fef0: 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20  the freelist.   
ff00: 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74   ** pointer in t
ff10: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20  he page header) 
ff20: 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65  then check to se
ff30: 65 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75  e if iStart shou
ff40: 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61  ld be.    ** coa
ff50: 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20  lesced onto the 
ff60: 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20  end of iPtr..   
ff70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72   */.    if( iPtr
ff80: 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20  >hdr+1 ){.      
ff90: 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50  int iPtrEnd = iP
ffa0: 74 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  tr + get2byte(&d
ffb0: 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20  ata[iPtr+2]);.  
ffc0: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b      if( iPtrEnd+
ffd0: 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20  3>=iStart ){.   
ffe0: 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64       if( iPtrEnd
fff0: 3e 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e  >iStart ) return
10000 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10010 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46  BKPT;.        nF
10020 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20  rag += iStart - 
10030 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20  iPtrEnd;.       
10040 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20   iSize = iEnd - 
10050 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53  iPtr;.        iS
10060 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20  tart = iPtr;.   
10070 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
10080 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64  f( nFrag>data[hd
10090 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51  r+7] ) return SQ
100a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
100b0 54 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  T;.    data[hdr+
100c0 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d  7] -= nFrag;.  }
100d0 0a 20 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67  .  if( iStart==g
100e0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
100f0 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20  r+5]) ){.    /* 
10100 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63  The new freebloc
10110 6b 20 69 73 20 61 74 20 74 68 65 20 62 65 67 69  k is at the begi
10120 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c  nning of the cel
10130 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a  l content area,.
10140 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65      ** so just e
10150 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  xtend the cell c
10160 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74 68  ontent area rath
10170 65 72 20 74 68 61 6e 20 63 72 65 61 74 65 20 61  er than create a
10180 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72  nother.    ** fr
10190 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a  eelist entry */.
101a0 20 20 20 20 69 66 28 20 69 50 74 72 21 3d 68 64      if( iPtr!=hd
101b0 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r+1 ) return SQL
101c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
101d0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
101e0 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72  data[hdr+1], iFr
101f0 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32  eeBlk);.    put2
10200 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
10210 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73  ], iEnd);.  }els
10220 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  e{.    /* Insert
10230 20 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   the new freeblo
10240 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65  ck into the free
10250 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32  list */.    put2
10260 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d  byte(&data[iPtr]
10270 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70  , iStart);.    p
10280 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53  ut2byte(&data[iS
10290 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29  tart], iFreeBlk)
102a0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
102b0 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20  data[iStart+2], 
102c0 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50  iSize);.  }.  pP
102d0 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f  age->nFree += iO
102e0 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72  rigSize;.  retur
102f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10300 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
10310 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65   flags byte (the
10320 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
10330 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61  he header) for a
10340 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69   page.** and ini
10350 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f  tialize fields o
10360 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74  f the MemPage st
10370 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e  ructure accordin
10380 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  gly..**.** Only 
10390 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
103a0 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73  mbinations are s
103b0 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68  upported.  Anyth
103c0 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
103d0 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72   indicates a cor
103e0 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
103f0 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
10400 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a     PTF_ZERODATA.
10410 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
10420 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45  ERODATA | PTF_LE
10430 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  AF.**         PT
10440 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
10450 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20  _INTKEY.**      
10460 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
10470 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50  | PTF_INTKEY | P
10480 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69  TF_LEAF.*/.stati
10490 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67  c int decodeFlag
104a0 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
104b0 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b  , int flagByte){
104c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
104d0 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20  ;     /* A copy 
104e0 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f  of pPage->pBt */
104f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10500 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70  e->hdrOffset==(p
10510 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
10520 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73  100 : 0) );.  as
10530 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10540 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
10550 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10560 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
10570 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29  u8)(flagByte>>3)
10580 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c  ;  assert( PTF_L
10590 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20  EAF == 1<<3 );. 
105a0 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54   flagByte &= ~PT
105b0 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d  F_LEAF;.  pPage-
105c0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20  >childPtrSize = 
105d0 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  4-4*pPage->leaf;
105e0 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  .  pPage->xCellS
105f0 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
10600 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  r;.  pBt = pPage
10610 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61  ->pBt;.  if( fla
10620 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46  gByte==(PTF_LEAF
10630 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
10640 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  Y) ){.    /* EVI
10650 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32 39  DENCE-OF: R-0729
10660 31 2d 33 35 33 32 38 20 41 20 76 61 6c 75 65 20  1-35328 A value 
10670 6f 66 20 35 20 28 30 78 30 35 29 20 6d 65 61 6e  of 5 (0x05) mean
10680 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e  s the page is an
10690 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72  .    ** interior
106a0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61   table b-tree pa
106b0 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
106c0 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41  t( (PTF_LEAFDATA
106d0 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20  |PTF_INTKEY)==5 
106e0 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
106f0 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30 2d 30  CE-OF: R-26900-0
10700 39 31 37 36 20 41 20 76 61 6c 75 65 20 6f 66 20  9176 A value of 
10710 31 33 20 28 30 78 30 64 29 20 6d 65 61 6e 73 20  13 (0x0d) means 
10720 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20  the page is a.  
10730 20 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c 65 20    ** leaf table 
10740 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
10750 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
10760 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e  _LEAFDATA|PTF_IN
10770 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d  TKEY|PTF_LEAF)==
10780 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  13 );.    pPage-
10790 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20  >intKey = 1;.   
107a0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
107b0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   ){.      pPage-
107c0 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b  >intKeyLeaf = 1;
107d0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50  .      pPage->xP
107e0 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
107f0 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20  ParseCellPtr;.  
10800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
10810 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
10820 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
10830 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63  e->xCellSize = c
10840 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
10850 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61 67 65  oad;.      pPage
10860 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
10870 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
10880 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 7d  NoPayload;.    }
10890 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
108a0 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
108b0 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
108c0 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
108d0 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65  minLeaf;.  }else
108e0 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50   if( flagByte==P
108f0 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20  TF_ZERODATA ){. 
10900 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
10910 46 3a 20 52 2d 34 33 33 31 36 2d 33 37 33 30 38  F: R-43316-37308
10920 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20 28 30   A value of 2 (0
10930 78 30 32 29 20 6d 65 61 6e 73 20 74 68 65 20 70  x02) means the p
10940 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a  age is an.    **
10950 20 69 6e 74 65 72 69 6f 72 20 69 6e 64 65 78 20   interior index 
10960 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
10970 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
10980 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b  _ZERODATA)==2 );
10990 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
109a0 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34 32 38  -OF: R-59615-428
109b0 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30  28 A value of 10
109c0 20 28 30 78 30 61 29 20 6d 65 61 6e 73 20 74 68   (0x0a) means th
109d0 65 20 70 61 67 65 20 69 73 20 61 0a 20 20 20 20  e page is a.    
109e0 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78 20 62 2d  ** leaf index b-
109f0 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
10a00 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a    assert( (PTF_Z
10a10 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  ERODATA|PTF_LEAF
10a20 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70 50 61  )==10 );.    pPa
10a30 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a  ge->intKey = 0;.
10a40 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
10a50 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70  yLeaf = 0;.    p
10a60 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
10a70 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c   = btreeParseCel
10a80 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70  lPtrIndex;.    p
10a90 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
10aa0 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
10ab0 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
10ac0 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
10ad0 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
10ae0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
10af0 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20  : R-47608-56469 
10b00 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20  Any other value 
10b10 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70  for the b-tree p
10b20 61 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20  age type is.    
10b30 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a  ** an error. */.
10b40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10b50 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
10b60 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78    }.  pPage->max
10b70 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70  1bytePayload = p
10b80 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
10b90 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oad;.  return SQ
10ba0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10bb0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
10bc0 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
10bd0 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
10be0 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  k block..**.** R
10bf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
10c00 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
10c10 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20  we see that the 
10c20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  page does.** not
10c30 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d   contain a well-
10c40 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
10c50 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72  page, then retur
10c60 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  n .** SQLITE_COR
10c70 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74  RUPT.  Note that
10c80 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
10c90 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a  ITE_OK does not.
10ca0 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ** guarantee tha
10cb0 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65  t the page is we
10cc0 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f  ll-formed.  It o
10cd0 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a  nly shows that.*
10ce0 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64  * we failed to d
10cf0 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70  etect any corrup
10d00 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
10d10 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67  int btreeInitPag
10d20 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
10d30 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  ){..  assert( pP
10d40 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
10d50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
10d60 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  pBt->db!=0 );.  
10d70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10d80 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
10d90 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
10da0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10db0 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50  ->pgno==sqlite3P
10dc0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
10dd0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
10de0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
10df0 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  e == sqlite3Page
10e00 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
10e10 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
10e20 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
10e30 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  ata == sqlite3Pa
10e40 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
10e50 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
10e60 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49   if( !pPage->isI
10e70 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  nit ){.    int p
10e80 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
10e90 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72   Address of a fr
10ea0 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70  eeblock within p
10eb0 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f  Page->aData[] */
10ec0 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20  .    u8 hdr;    
10ed0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
10ee0 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f  t to beginning o
10ef0 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
10f00 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20  .    u8 *data;  
10f10 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c          /* Equal
10f20 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61   to pPage->aData
10f30 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64   */.    BtShared
10f40 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a   *pBt;        /*
10f50 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20   The main btree 
10f60 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
10f70 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
10f80 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
10f90 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
10fa0 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
10fb0 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74    u16 cellOffset
10fc0 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66  ;    /* Offset f
10fd0 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67  rom start of pag
10fe0 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20  e to first cell 
10ff0 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  pointer */.    i
11000 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
11010 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
11020 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74  nused bytes on t
11030 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69  he page */.    i
11040 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
11050 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
11060 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
11070 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20  ent area */.    
11080 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
11090 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
110a0 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  wable cell or fr
110b0 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
110c0 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c  /.    int iCellL
110d0 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74  ast;     /* Last
110e0 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f   possible cell o
110f0 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
11100 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d  et */..    pBt =
11110 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20   pPage->pBt;..  
11120 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
11130 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61  drOffset;.    da
11140 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
11150 61 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  a;.    /* EVIDEN
11160 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30  CE-OF: R-28594-0
11170 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74  2890 The one-byt
11180 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74  e flag at offset
11190 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20   0 indicating.  
111a0 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20    ** the b-tree 
111b0 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20  page type. */.  
111c0 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67    if( decodeFlag
111d0 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64  s(pPage, data[hd
111e0 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r]) ) return SQL
111f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
11200 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
11210 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
11220 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
11230 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20  e<=65536 );.    
11240 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
11250 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
11260 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20  eSize - 1);.    
11270 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
11280 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65   = 0;.    usable
11290 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
112a0 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  leSize;.    pPag
112b0 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
112c0 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72  cellOffset = hdr
112d0 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68   + 8 + pPage->ch
112e0 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
112f0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
11300 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69  = &data[usableSi
11310 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ze];.    pPage->
11320 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
11330 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20  [cellOffset];.  
11340 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66    pPage->aDataOf
11350 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  st = &data[pPage
11360 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b  ->childPtrSize];
11370 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
11380 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31  -OF: R-58015-481
11390 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  75 The two-byte 
113a0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
113b0 74 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20  t 5 designates. 
113c0 20 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20     ** the start 
113d0 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
113e0 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f  ent area. A zero
113f0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
11400 69 6e 74 65 67 65 72 20 69 73 0a 20 20 20 20 2a  integer is.    *
11410 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  * interpreted as
11420 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20 74   65536. */.    t
11430 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
11440 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
11450 5d 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  ]);.    /* EVIDE
11460 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d  NCE-OF: R-37002-
11470 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79  32774 The two-by
11480 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
11490 66 73 65 74 20 33 20 67 69 76 65 73 20 74 68 65  fset 3 gives the
114a0 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  .    ** number o
114b0 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
114c0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  age. */.    pPag
114d0 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
114e0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
114f0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
11500 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28  ->nCell>MX_CELL(
11510 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
11520 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66   To many cells f
11530 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  or a single page
11540 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74  .  The page must
11550 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   be corrupt */. 
11560 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11570 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
11580 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
11590 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ase( pPage->nCel
115a0 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  l==MX_CELL(pBt) 
115b0 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
115c0 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35  CE-OF: R-24089-5
115d0 37 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63  7979 If a page c
115e0 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
115f0 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a   (which is only.
11600 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20      ** possible 
11610 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20  for a root page 
11620 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  of a table that 
11630 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73  contains no rows
11640 29 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  ) then the.    *
11650 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * offset to the 
11660 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
11670 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65  a will equal the
11680 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73   page size minus
11690 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 79 74 65   the.    ** byte
116a0 73 20 6f 66 20 72 65 73 65 72 76 65 64 20 73 70  s of reserved sp
116b0 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ace. */.    asse
116c0 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
116d0 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c  >0 || top==usabl
116e0 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54  eSize || CORRUPT
116f0 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  _DB );..    /* A
11700 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62   malformed datab
11710 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63  ase page might c
11720 61 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20  ause us to read 
11730 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20  past the end.   
11740 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e   ** of page when
11750 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e   parsing a cell.
11760 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a    .    **.    **
11770 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
11780 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65  lock of code che
11790 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65  cks early to see
117a0 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e   if a cell exten
117b0 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74  ds.    ** past t
117c0 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65  he end of a page
117d0 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61   boundary and ca
117e0 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  uses SQLITE_CORR
117f0 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  UPT to be .    *
11800 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74  * returned if it
11810 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20   does..    */.  
11820 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
11830 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
11840 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
11850 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
11860 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20  leSize - 4;.    
11870 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61  if( pBt->db->fla
11880 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c  gs & SQLITE_Cell
11890 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 20 20  SizeCk ){.      
118a0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
118b0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
118c0 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
118d0 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20   array */.      
118e0 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
118f0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
11900 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  ell */..      if
11910 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
11920 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20   iCellLast--;.  
11930 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
11940 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
11950 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20  ){.        pc = 
11960 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
11970 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
11980 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*2]);.        
11990 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
119a0 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
119b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
119c0 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
119d0 20 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43         if( pc<iC
119e0 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
119f0 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
11a00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
11a10 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
11a20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11a30 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e      sz = pPage->
11a40 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  xCellSize(pPage,
11a50 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
11a60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
11a70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
11a80 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
11a90 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
11aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
11ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
11ac0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
11ad0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11ae0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
11af0 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
11b00 3b 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f  ;.    }  ..    /
11b10 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
11b20 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
11b30 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a  n the page.    *
11b40 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
11b50 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54 68 65  -23588-34450 The
11b60 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
11b70 72 20 61 74 20 6f 66 66 73 65 74 20 31 20 67 69  r at offset 1 gi
11b80 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  ves the.    ** s
11b90 74 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73  tart of the firs
11ba0 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74  t freeblock on t
11bb0 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a  he page, or is z
11bc0 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65  ero if there are
11bd0 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62   no.    ** freeb
11be0 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63  locks. */.    pc
11bf0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
11c00 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e  a[hdr+1]);.    n
11c10 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
11c20 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e  7] + top;  /* In
11c30 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d  it nFree to non-
11c40 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73  freeblock free s
11c50 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  pace */.    if( 
11c60 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33  pc>0 ){.      u3
11c70 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  2 next, size;.  
11c80 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
11c90 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 20  First ){.       
11ca0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
11cb0 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30 20 49   R-55530-52930 I
11cc0 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
11cd0 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65  b-tree page, the
11ce0 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20  re will.        
11cf0 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74 20  ** always be at 
11d00 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62  least one cell b
11d10 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
11d20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20  freeblock..     
11d30 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65     */.        re
11d40 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
11d50 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
11d60 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
11d70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  1 ){.        if(
11d80 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
11d90 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
11da0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11db0 5f 42 4b 50 54 3b 20 2f 2a 20 46 72 65 65 62 6c  _BKPT; /* Freebl
11dc0 6f 63 6b 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ock off the end 
11dd0 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
11de0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11df0 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
11e00 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
11e10 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
11e20 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
11e30 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 65 65  );.        nFree
11e40 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b   = nFree + size;
11e50 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 78  .        if( nex
11e60 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20 62  t<=pc+size+3 ) b
11e70 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 70 63  reak;.        pc
11e80 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 20 20 7d   = next;.      }
11e90 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74 3e  .      if( next>
11ea0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
11eb0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
11ec0 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 46 72 65  PT_BKPT;  /* Fre
11ed0 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73  eblock not in as
11ee0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f  cending order */
11ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11f00 66 28 20 70 63 2b 73 69 7a 65 3e 28 75 6e 73 69  f( pc+size>(unsi
11f10 67 6e 65 64 20 69 6e 74 29 75 73 61 62 6c 65 53  gned int)usableS
11f20 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
11f30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
11f40 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 4c  RUPT_BKPT;  /* L
11f50 61 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 65 78  ast freeblock ex
11f60 74 65 6e 64 73 20 70 61 73 74 20 70 61 67 65 20  tends past page 
11f70 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  end */.      }. 
11f80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
11f90 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
11fa0 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
11fb0 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
11fc0 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
11fd0 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c    ** of the cell
11fe0 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c  -content area pl
11ff0 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  us the number of
12000 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68   free bytes with
12010 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65  in.    ** the ce
12020 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll-content area.
12030 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61   If this is grea
12040 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61  ter than the usa
12050 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20  ble-size.    ** 
12060 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
12070 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
12080 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
12090 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
120a0 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
120b0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
120c0 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
120d0 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
120e0 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72  ontent.    ** ar
120f0 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ea, according to
12100 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
12110 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68  , lies within th
12120 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  e page..    */. 
12130 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61     if( nFree>usa
12140 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
12150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
12160 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
12170 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e    }.    pPage->n
12180 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72  Free = (u16)(nFr
12190 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29  ee - iCellFirst)
121a0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
121b0 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  nit = 1;.  }.  r
121c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
121d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
121e0 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
121f0 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
12200 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
12210 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
12220 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
12230 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
12240 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
12250 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
12260 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
12270 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
12280 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
12290 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
122a0 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67  .  u8 hdr = pPag
122b0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
122c0 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  u16 first;..  as
122d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
122e0 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
122f0 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
12300 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
12310 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
12320 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
12330 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
12340 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
12350 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12360 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
12370 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
12380 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  data );.  assert
12390 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
123a0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
123b0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
123c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
123d0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
123e0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
123f0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
12400 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
12410 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
12420 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
12430 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
12440 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61  hdr);.  }.  data
12450 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
12460 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
12470 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46  dr + ((flags&PTF
12480 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a  _LEAF)==0 ? 12 :
12490 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   8);.  memset(&d
124a0 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
124b0 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
124c0 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
124d0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
124e0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
124f0 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
12500 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
12510 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29  bleSize - first)
12520 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
12530 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
12540 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
12550 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
12560 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
12570 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
12580 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
12590 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
125a0 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
125b0 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
125c0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
125d0 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61  dPtrSize];.  pPa
125e0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
125f0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
12600 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
12610 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
12620 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61  <=65536 );.  pPa
12630 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
12640 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
12650 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65  ze - 1);.  pPage
12660 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
12670 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
12680 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
12690 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
126a0 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
126b0 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
126c0 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
126d0 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
126e0 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
126f0 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
12700 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
12710 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
12720 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
12730 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
12740 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
12750 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
12760 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
12770 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65   if( pgno!=pPage
12780 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
12790 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
127a0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
127b0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70  (pDbPage);.    p
127c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
127d0 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61  pDbPage;.    pPa
127e0 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
127f0 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d     pPage->pgno =
12800 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65   pgno;.    pPage
12810 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67  ->hdrOffset = pg
12820 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
12830 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
12840 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  Page->aData==sql
12850 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
12860 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  (pDbPage) );.  r
12870 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a  eturn pPage; .}.
12880 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
12890 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
128a0 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
128b0 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
128c0 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
128d0 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
128e0 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f  eeded.  See also
128f0 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  : btreeGetUnused
12900 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Page()..**.** If
12910 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e   the PAGER_GET_N
12920 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73  OCONTENT flag is
12930 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74   set, it means t
12940 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
12950 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20  re.** about the 
12960 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
12970 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
12980 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20  .  So do not go 
12990 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74  to the disk.** t
129a0 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74  o fetch the cont
129b0 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ent.  Just fill 
129c0 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  in the content w
129d0 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f  ith zeros for no
129e0 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20  w..** If in the 
129f0 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73  future we call s
12a00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
12a10 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  () on this page,
12a20 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77   that.** means w
12a30 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74  e have started t
12a40 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61  o be concerned a
12a50 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64  bout content and
12a60 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61   the disk.** rea
12a70 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
12a80 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
12a90 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
12aa0 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68  eGetPage(.  BtSh
12ab0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
12ac0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
12ad0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
12ae0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12af0 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
12b00 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
12b10 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
12b20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
12b30 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
12b40 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
12b50 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
12b60 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
12b70 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
12b80 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
12b90 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
12ba0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
12bb0 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
12bc0 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ==0 || flags==PA
12bd0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
12be0 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  T || flags==PAGE
12bf0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29  R_GET_READONLY )
12c00 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12c10 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12c20 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
12c30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12c40 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
12c50 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
12c60 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
12c70 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
12c80 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
12c90 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
12ca0 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
12cb0 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
12cc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12cd0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
12ce0 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
12cf0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
12d00 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
12d10 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
12d20 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
12d30 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
12d40 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
12d50 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
12d60 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
12d70 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
12d80 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
12d90 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
12da0 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
12db0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
12dc0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
12dd0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
12de0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12df0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
12e00 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
12e10 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
12e20 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
12e30 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
12e40 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
12e50 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
12e60 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
12e70 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
12e80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12e90 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
12ea0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
12eb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12ec0 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
12ed0 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
12ee0 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
12ef0 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
12f00 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
12f10 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
12f20 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
12f30 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
12f40 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
12f50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
12f60 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
12f70 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12f80 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
12f90 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
12fa0 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
12fb0 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30  e)&0x8000000)==0
12fc0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72   );.  return btr
12fd0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70  eePagecount(p->p
12fe0 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Bt);.}../*.** Ge
12ff0 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
13000 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
13010 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ialize it..**.**
13020 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e   If pCur!=0 then
13030 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
13040 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61  ng fetched as pa
13050 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68  rt of a moveToCh
13060 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20  ild().** call.  
13070 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  Do additional sa
13080 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
13090 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
130a0 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69  s case..** And i
130b0 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c  f the fetch fail
130c0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
130d0 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70  must decrement p
130e0 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a  Cur->iPage..**.*
130f0 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65  * The page is fe
13100 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72  tched as read-wr
13110 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20  ite unless pCur 
13120 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20  is not NULL and 
13130 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c  is.** a read-onl
13140 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  y cursor..**.** 
13150 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
13160 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  rs, then *ppPage
13170 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49   is undefined. I
13180 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20  t.** may remain 
13190 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74  unchanged, or it
131a0 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61   may be set to a
131b0 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e  n invalid value.
131c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
131d0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
131e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
131f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13200 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
13210 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
13220 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
13230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13240 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
13250 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
13260 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
13270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13280 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
13290 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
132a0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132c0 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65   /* Cursor to re
132d0 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20  ceive the page, 
132e0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  or NULL */.  int
132f0 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20   bReadOnly      
13300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13310 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
13320 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a  only page */.){.
13330 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
13340 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
13350 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
13360 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
13370 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
13380 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70  t( pCur==0 || pp
13390 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50  Page==&pCur->apP
133a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
133b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
133c0 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e  ur==0 || bReadOn
133d0 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67  ly==pCur->curPag
133e0 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73  erFlags );.  ass
133f0 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
13400 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
13410 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
13420 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
13430 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
13440 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
13450 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
13460 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
13470 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
13480 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
13490 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
134a0 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
134b0 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20  e, bReadOnly);. 
134c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67   if( rc ){.    g
134d0 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
134e0 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
134f0 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61  *ppPage = (MemPa
13500 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
13510 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
13520 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  );.  if( (*ppPag
13530 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  e)->isInit==0 ){
13540 0a 20 20 20 20 62 74 72 65 65 50 61 67 65 46 72  .    btreePageFr
13550 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
13560 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
13570 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
13580 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
13590 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
135a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
135b0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
135c0 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67  e);.      goto g
135d0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
135e0 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
135f0 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
13600 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
13610 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
13620 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71  Page)->aData==sq
13630 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
13640 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  a(pDbPage) );.. 
13650 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67   /* If obtaining
13660 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f   a child page fo
13670 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d  r a cursor, we m
13680 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20  ust verify that 
13690 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a  the page is.  **
136a0 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
136b0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20   the root page. 
136c0 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26  */.  if( pCur &&
136d0 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65   ((*ppPage)->nCe
136e0 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65  ll<1 || (*ppPage
136f0 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d  )->intKey!=pCur-
13700 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20  >curIntKey) ){. 
13710 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
13720 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
13730 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
13740 50 61 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Page);.    goto 
13750 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
13760 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rror;.  }.  retu
13770 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67  rn SQLITE_OK;..g
13780 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
13790 72 6f 72 3a 0a 20 20 69 66 28 20 70 43 75 72 20  ror:.  if( pCur 
137a0 29 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b  ) pCur->iPage--;
137b0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
137c0 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
137d0 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d  ( pgno!=0 || rc=
137e0 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
137f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
13800 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13810 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
13820 54 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20 74 68 65  T./* .** Set the
13830 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4d 65   value of the Me
13840 6d 50 61 67 65 2e 70 67 6e 6f 52 6f 6f 74 20 76  mPage.pgnoRoot v
13850 61 72 69 61 62 6c 65 2c 20 69 66 20 69 74 20 65  ariable, if it e
13860 78 69 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  xists..*/.static
13870 20 76 6f 69 64 20 73 65 74 4d 65 6d 70 61 67 65   void setMempage
13880 52 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50  Root(MemPage *pP
13890 67 2c 20 75 33 32 20 70 67 6e 6f 52 6f 6f 74 29  g, u32 pgnoRoot)
138a0 7b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 52 6f 6f  {.  pPg->pgnoRoo
138b0 74 20 3d 20 70 67 6e 6f 52 6f 6f 74 3b 0a 7d 0a  t = pgnoRoot;.}.
138c0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
138d0 65 74 4d 65 6d 70 61 67 65 52 6f 6f 74 28 78 2c  etMempageRoot(x,
138e0 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  y).#endif../*.**
138f0 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
13900 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
13910 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
13920 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
13930 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47  * call to btreeG
13940 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
13950 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
13960 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67  geNotNull(MemPag
13970 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73  e *pPage){.  ass
13980 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
13990 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a );.  assert( p
139a0 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
139b0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44  ssert( pPage->pD
139c0 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  bPage!=0 );.  as
139d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
139e0 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
139f0 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
13a00 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
13a10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
13a20 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
13a30 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
13a40 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
13a50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
13a60 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
13a70 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
13a80 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
13a90 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65  refNotNull(pPage
13aa0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74  ->pDbPage);.}.st
13ab0 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
13ac0 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
13ad0 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
13ae0 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65  ge ) releasePage
13af0 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a  NotNull(pPage);.
13b00 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20  }../*.** Get an 
13b10 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a  unused page..**.
13b20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75  ** This works ju
13b30 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65 74  st like btreeGet
13b40 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65 20  Page() with the 
13b50 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20  addition:.**.** 
13b60 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67 65    *  If the page
13b70 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75   is already in u
13b80 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  se for some othe
13b90 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64  r purpose, immed
13ba0 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72  iately.**      r
13bb0 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72 65  elease it and re
13bc0 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
13bd0 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a  URRUPT error..**
13be0 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65 20     *  Make sure 
13bf0 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67 20  the isInit flag 
13c00 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74  is clear.*/.stat
13c10 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 55  ic int btreeGetU
13c20 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74 53  nusedPage(.  BtS
13c30 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
13c40 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
13c50 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
13c60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13c70 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
13c80 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
13c90 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
13ca0 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
13cb0 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
13cc0 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
13cd0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
13ce0 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
13cf0 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
13d00 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
13d10 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 62  .){.  int rc = b
13d20 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
13d30 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66   pgno, ppPage, f
13d40 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d  lags);.  if( rc=
13d50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13d60 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
13d70 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28  erPageRefcount((
13d80 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
13d90 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65  e)>1 ){.      re
13da0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
13db0 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67  e);.      *ppPag
13dc0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
13dd0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
13de0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
13df0 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73     (*ppPage)->is
13e00 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Init = 0;.  }els
13e10 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
13e20 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
13e30 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44   rc;.}.../*.** D
13e40 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
13e50 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  , when the pager
13e60 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61   reloads informa
13e70 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61  tion into the ca
13e80 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  che.** so that t
13e90 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74  he cache is rest
13ea0 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
13eb0 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68  inal state at th
13ec0 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
13ed0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  e transaction, f
13ee0 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73  or each page res
13ef0 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69  tored this routi
13f00 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
13f10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13f20 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20   needs to reset 
13f30 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73  the extra data s
13f40 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e  ection at the en
13f50 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d of the.** page
13f60 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
13f70 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61  he restored data
13f80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13f90 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61   pageReinit(DbPa
13fa0 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65  ge *pData){.  Me
13fb0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
13fc0 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
13fd0 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
13fe0 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
13ff0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14000 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
14010 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20  nt(pData)>0 );. 
14020 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
14030 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
14040 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14050 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
14060 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
14070 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
14080 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
14090 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
140a0 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20  nt(pData)>1 ){. 
140b0 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69       /* pPage mi
140c0 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72  ght not be a btr
140d0 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67  ee page;  it mig
140e0 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ht be an overflo
140f0 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
14100 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f  or ptrmap page o
14110 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20  r a free page.  
14120 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20  In those cases, 
14130 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
14140 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62      ** call to b
14150 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77  treeInitPage() w
14160 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72  ill likely retur
14170 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
14180 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  ..      ** But n
14190 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62  o harm is done b
141a0 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20  y this.  And it 
141b0 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e  is very importan
141c0 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  t that.      ** 
141d0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
141e0 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
141f0 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
14200 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
14210 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
14220 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
14230 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
14240 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
14250 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
14260 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
14270 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
14280 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
14290 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a  r for a btree..*
142a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
142b0 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
142c0 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ler(void *pArg){
142d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
142e0 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
142f0 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
14300 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
14310 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
14320 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
14330 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
14340 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
14350 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
14360 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
14370 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
14380 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
14390 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
143a0 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
143b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
143c0 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
143d0 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  me is NULL.** th
143e0 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
143f0 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
14400 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65  ted.  The epheme
14410 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67  ral database mig
14420 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69  ht.** be exclusi
14430 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  vely in memory, 
14440 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20  or it might use 
14450 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d  a disk-based mem
14460 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69  ory cache..** Ei
14470 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70  ther way, the ep
14480 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
14490 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
144a0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a  ically deleted .
144b0 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ** when sqlite3B
144c0 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
144d0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
144e0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
144f0 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
14500 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
14510 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
14520 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
14530 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
14540 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
14550 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66  ed..**.** The "f
14560 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20  lags" parameter 
14570 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
14580 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  t might contain 
14590 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52  bits like.** BTR
145a0 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  EE_OMIT_JOURNAL 
145b0 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d  and/or BTREE_MEM
145c0 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ORY..**.** If th
145d0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
145e0 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
145f0 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
14600 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
14610 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
14620 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
14630 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
14640 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
14650 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
14660 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
14670 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
14680 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
14690 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
146a0 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
146b0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
146c0 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
146d0 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
146e0 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
146f0 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
14700 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73  e3BtreeOpen(.  s
14710 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
14720 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f  ,      /* VFS to
14730 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d   use for this b-
14740 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tree */.  const 
14750 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
14760 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
14770 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
14780 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
14790 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
147a0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
147b0 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
147c0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
147d0 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
147e0 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
147f0 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
14800 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
14810 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
14820 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
14830 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
14840 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
14850 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
14860 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
14870 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
14880 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
14890 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
148a0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
148b0 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
148c0 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
148d0 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
148e0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
148f0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
14900 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
14910 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
14920 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
14930 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
14940 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
14950 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
14960 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14970 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
14980 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
14990 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
149a0 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
149b0 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
149c0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
149d0 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
149e0 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
149f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
14a00 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
14a10 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
14a20 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
14a30 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69  /* True if openi
14a40 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c  ng an ephemeral,
14a50 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
14a60 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ase */.  const i
14a70 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46  nt isTempDb = zF
14a80 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
14a90 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a  ilename[0]==0;..
14aa0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
14ab0 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
14ac0 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
14ad0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
14ae0 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
14af0 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
14b00 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
14b10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
14b20 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f  IT_MEMORYDB.  co
14b30 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
14b40 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  = 0;.#else.  con
14b50 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
14b60 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73   (zFilename && s
14b70 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
14b80 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29   ":memory:")==0)
14b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14ba0 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65          || (isTe
14bb0 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54  mpDb && sqlite3T
14bc0 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29  empInMemory(db))
14bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14be0 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46          || (vfsF
14bf0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
14c00 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23  EN_MEMORY)!=0;.#
14c10 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
14c20 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
14c30 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20  rt( pVfs!=0 );. 
14c40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14c50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
14c60 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
14c70 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29  rt( (flags&0xff)
14c80 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20  ==flags );   /* 
14c90 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62  flags fit in 8 b
14ca0 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c  its */..  /* Onl
14cb0 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  y a BTREE_SINGLE
14cc0 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
14cd0 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
14ce0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
14cf0 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f  lags & BTREE_UNO
14d00 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66  RDERED)==0 || (f
14d10 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
14d20 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  GLE)!=0 );..  /*
14d30 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   A BTREE_SINGLE 
14d40 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61  database is alwa
14d50 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61  ys a temporary a
14d60 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20  nd/or ephemeral 
14d70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
14d80 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
14d90 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  LE)==0 || isTemp
14da0 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d  Db );..  if( isM
14db0 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
14dc0 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
14dd0 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
14de0 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
14df0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
14e00 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
14e10 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
14e20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
14e30 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
14e40 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
14e50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
14e60 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
14e70 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
14e80 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
14e90 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
14ea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14eb0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
14ec0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
14ed0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
14ee0 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20  b = db;.#ifndef 
14ef0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14f00 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f  ED_CACHE.  p->lo
14f10 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  ck.pBtree = p;. 
14f20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20   p->lock.iTable 
14f30 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 1;.#endif..#if
14f40 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14f50 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
14f60 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
14f70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
14f80 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  IO).  /*.  ** If
14f90 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61   this Btree is a
14fa0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73   candidate for s
14fb0 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79  hared cache, try
14fc0 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a   to find an.  **
14fd0 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72   existing BtShar
14fe0 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  ed object that w
14ff0 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68  e can share with
15000 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65  .  */.  if( isTe
15010 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65  mpDb==0 && (isMe
15020 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c  mdb==0 || (vfsFl
15030 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
15040 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  URI)!=0) ){.    
15050 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53  if( vfsFlags & S
15060 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
15070 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20  DCACHE ){.      
15080 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20  int nFilename = 
15090 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
150a0 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20  zFilename)+1;.  
150b0 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
150c0 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
150d0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
150e0 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
150f0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
15100 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50  alloc(MAX(nFullP
15110 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d  athname,nFilenam
15120 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  e));.      MUTEX
15130 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
15140 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
15150 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e  ed; )..      p->
15160 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
15170 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
15180 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
15190 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
151a0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
151b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
151c0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
151d0 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29     if( isMemdb )
151e0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
151f0 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
15200 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65  zFilename, nFile
15210 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
15220 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
15230 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
15240 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
15250 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
15260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15270 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c             nFull
15280 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
15290 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
152a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
152b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
152c0 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
152d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
152e0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
152f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
15300 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
15310 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
15320 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20  THREADSAFE.     
15330 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c   mutexOpen = sql
15340 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
15350 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
15360 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20  IC_OPEN);.      
15370 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
15380 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ter(mutexOpen);.
15390 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
153a0 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
153b0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
153c0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
153d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
153e0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
153f0 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69  exShared);.#endi
15400 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d  f.      for(pBt=
15410 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
15420 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
15430 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70  cheList); pBt; p
15440 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
15450 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15460 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
15470 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74         if( 0==st
15480 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rcmp(zFullPathna
15490 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  me, sqlite3Pager
154a0 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50  Filename(pBt->pP
154b0 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20  ager, 0)).      
154c0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
154d0 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
154e0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
154f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
15500 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
15510 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62   for(iDb=db->nDb
15520 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d  -1; iDb>=0; iDb-
15530 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
15540 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67  Btree *pExisting
15550 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
15560 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBt;.           
15570 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26   if( pExisting &
15580 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74  & pExisting->pBt
15590 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ==pBt ){.       
155a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
155b0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
155c0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20  Shared);.       
155d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
155e0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
155f0 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Open);.         
15600 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
15610 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
15620 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15630 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
15640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
15650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
15660 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
15670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15680 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
15690 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
156a0 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b       pBt->nRef++
156b0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
156c0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
156d0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
156e0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
156f0 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
15700 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15710 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
15720 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
15730 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c  ITE_DEBUG.    el
15740 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
15750 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d  debug mode, we m
15760 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65  ark all persiste
15770 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20  nt databases as 
15780 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a  sharable.      *
15790 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79  * even when they
157a0 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20   are not.  This 
157b0 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f  exercises the lo
157c0 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20  cking code and. 
157d0 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f       ** gives mo
157e0 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66  re opportunity f
157f0 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74  or asserts(sqlit
15800 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29  e3_mutex_held())
15810 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
15820 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63  ents to find loc
15830 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20  king problems.. 
15840 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
15850 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
15860 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
15870 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
15880 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
15890 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
158a0 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
158b0 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
158c0 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
158d0 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a   btree are.    *
158e0 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
158f0 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
15900 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
15910 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
15920 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sult.    ** when
15930 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20   compiling on a 
15940 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74  different archit
15950 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ecture..    */. 
15960 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
15970 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(i64)==8 );.   
15980 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
15990 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61  u64)==8 );.    a
159a0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
159b0 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
159c0 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
159d0 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
159e0 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
159f0 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
15a00 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
15a10 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
15a20 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
15a30 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
15a40 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
15a50 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
15a60 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
15a70 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
15a80 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
15a90 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
15aa0 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
15ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ac0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
15ad0 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61 67 73  (MemPage), flags
15ae0 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
15af0 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
15b00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15b10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
15b20 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
15b30 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62  (pBt->pPager, db
15b40 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20  ->szMmap);.     
15b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15b60 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
15b70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
15b80 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
15b90 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
15ba0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
15bb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15bc0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
15bd0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
15be0 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
15bf0 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
15c00 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
15c10 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
15c20 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
15c30 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
15c40 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
15c50 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
15c60 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
15c70 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
15c80 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
15c90 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  1 = 0;.    if( s
15ca0 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
15cb0 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
15cc0 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  r) ) pBt->btsFla
15cd0 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
15ce0 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NLY;.#ifdef SQLI
15cf0 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
15d00 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
15d10 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
15d20 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a  _DELETE;.#endif.
15d30 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
15d40 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
15d50 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
15d60 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
15d70 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
15d80 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
15d90 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
15da0 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
15db0 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
15dc0 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
15dd0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
15de0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
15df0 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  */.    pBt->page
15e00 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
15e10 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
15e20 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
15e30 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
15e40 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
15e50 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
15e60 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
15e70 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
15e80 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
15e90 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
15ea0 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
15eb0 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
15ec0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15ed0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
15ee0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
15ef0 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
15f00 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
15f10 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
15f20 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
15f30 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
15f40 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
15f50 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
15f60 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
15f70 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
15f80 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
15f90 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
15fa0 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
15fb0 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
15fc0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
15fd0 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
15fe0 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
15ff0 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
16000 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
16010 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
16020 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
16030 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
16040 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
16050 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
16060 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
16070 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
16080 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
16090 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
160a0 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
160b0 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
160c0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
160d0 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
160e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
160f0 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
16100 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
16110 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
16120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
16130 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
16140 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
16150 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
16160 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
16170 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e       ** determin
16180 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
16190 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
161a0 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
161b0 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
161c0 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
161d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
161e0 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52  der. */.      nR
161f0 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
16200 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
16210 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
16220 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
16230 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
16240 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
16250 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
16260 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
16270 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
16280 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
16290 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
162a0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
162b0 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
162c0 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
162d0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
162e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
162f0 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
16300 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
16310 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
16320 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
16330 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
16340 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
16350 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
16360 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
16370 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
16380 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
16390 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
163a0 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
163b0 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
163c0 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
163d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
163e0 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
163f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16400 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
16410 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
16420 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
16430 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
16440 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
16450 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
16460 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
16470 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
16480 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45  le ){.      MUTE
16490 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
164a0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
164b0 72 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55 54  red; ).      MUT
164c0 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53  EX_LOGIC( mutexS
164d0 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
164e0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
164f0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
16500 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66  STER);).      if
16510 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
16520 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c  AFE && sqlite3Gl
16530 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
16540 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
16550 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
16560 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
16570 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
16580 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
16590 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  pBt->mutex==0 ){
165a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
165b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
165c0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
165d0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
165e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
165f0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
16600 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
16610 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
16620 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
16630 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
16640 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
16650 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
16660 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
16670 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
16680 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
16690 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
166a0 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
166b0 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
166c0 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
166d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
166e0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
166f0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
16700 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
16710 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
16720 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
16730 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
16740 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
16750 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
16760 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
16770 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
16780 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
16790 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
167a0 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
167b0 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
167c0 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
167d0 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
167e0 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
167f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
16800 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
16810 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
16820 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
16830 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
16840 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
16850 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
16860 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
16870 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
16880 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
16890 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
168a0 66 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74 3c  f( (uptr)p->pBt<
168b0 28 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74 20  (uptr)pSib->pBt 
168c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
168d0 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
168e0 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
168f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
16900 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
16910 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
16920 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
16930 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
16940 28 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65 78  (uptr)pSib->pNex
16950 74 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d 3e  t->pBt<(uptr)p->
16960 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
16970 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
16980 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
16990 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
169a0 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
169b0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
169c0 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
169d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
169e0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
169f0 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
16a00 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
16a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16a20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
16a30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16a40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16a50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
16a60 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
16a70 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
16a80 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
16a90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16aa0 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
16ab0 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
16ac0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
16ad0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30  e(pBt->pPager, 0
16ae0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
16af0 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
16b00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
16b10 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
16b20 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
16b30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
16b40 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a   *pFile;..    /*
16b50 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
16b60 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
16b70 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
16b80 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
16b90 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
16ba0 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78  efault value. Ex
16bb0 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69  cept, when openi
16bc0 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e  ng on an existin
16bd0 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63  g shared pager-c
16be0 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20  ache,.    ** do 
16bf0 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70  not change the p
16c00 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e  ager-cache size.
16c10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
16c20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
16c30 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29  ma(p, 0, 0)==0 )
16c40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
16c50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
16c60 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
16c70 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
16c80 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20  CACHE_SIZE);.   
16c90 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d 20   }..    pFile = 
16ca0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
16cb0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
16cc0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d     if( pFile->pM
16cd0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
16ce0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
16cf0 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20  trolHint(pFile, 
16d00 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42  SQLITE_FCNTL_PDB
16d10 2c 20 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64  , (void*)&pBt->d
16d20 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
16d30 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b  if( mutexOpen ){
16d40 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
16d50 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16d60 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20  mutexOpen) );.  
16d70 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16d80 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
16d90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
16da0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
16db0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e   sqlite3BtreeCon
16dc0 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70  nectionCount(*pp
16dd0 42 74 72 65 65 29 3e 30 20 29 3b 0a 20 20 72 65  Btree)>0 );.  re
16de0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16df0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
16e00 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
16e10 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
16e20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
16e30 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
16e40 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
16e50 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
16e60 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
16e70 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
16e80 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
16e90 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
16ea0 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
16eb0 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
16ec0 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
16ed0 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
16ee0 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
16ef0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
16f00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16f10 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
16f20 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  E.  MUTEX_LOGIC(
16f30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
16f40 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53  pMaster; ).  BtS
16f50 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
16f60 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
16f70 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
16f80 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
16f90 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
16fa0 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
16fb0 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
16fc0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
16fd0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
16fe0 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c  MASTER); ).  sql
16ff0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
17000 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
17010 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
17020 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
17030 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
17040 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
17050 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
17060 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
17070 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
17080 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
17090 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
170a0 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
170b0 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
170c0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
170d0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
170e0 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
170f0 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
17100 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
17110 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
17120 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
17130 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
17140 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
17150 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
17160 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
17170 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
17180 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
17190 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
171a0 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
171b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
171c0 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
171d0 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
171e0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
171f0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
17200 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
17210 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
17220 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
17230 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
17240 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
17250 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
17260 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
17270 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
17280 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69  ZE(pBt) bytes wi
17290 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66  th a 4-byte pref
172a0 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68  ix for a left-ch
172b0 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a  ild.** pointer..
172c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
172d0 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
172e0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
172f0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
17300 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
17310 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
17320 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
17330 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
17340 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  );..    /* One o
17350 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42  f the uses of pB
17360 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20  t->pTmpSpace is 
17370 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20  to format cells 
17380 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e  before.    ** in
17390 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74  serting them int
173a0 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66  o a leaf page (f
173b0 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65  unction fillInCe
173c0 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ll()). If.    **
173d0 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20   a cell is less 
173e0 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20  than 4 bytes in 
173f0 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e  size, it is roun
17400 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65  ded up to 4 byte
17410 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  s.    ** by the 
17420 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73  various routines
17430 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65   that manipulate
17440 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57   binary cells. W
17450 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20  hich.    ** can 
17460 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e  mean that fillIn
17470 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74  Cell() only init
17480 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73  ializes the firs
17490 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20  t 2 or 3.    ** 
174a0 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61  bytes of pTmpSpa
174b0 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65  ce, but that the
174c0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61   first 4 bytes a
174d0 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20  re copied from. 
174e0 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20     ** it into a 
174f0 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
17500 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
17510 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62  lly a problem, b
17520 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ut it.    ** doe
17530 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69  s cause a valgri
17540 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68  nd error when th
17550 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f  e 1 or 2 bytes o
17560 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f unitialized . 
17570 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61     ** data is pa
17580 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63  ssed to system c
17590 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20  all write(). So 
175a0 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72  to avoid this er
175b0 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f  ror,.    ** zero
175c0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
175d0 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65  es of temp space
175e0 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   here..    **.  
175f0 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76    ** Also:  Prov
17600 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f  ide four bytes o
17610 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  f initialized sp
17620 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20  ace before the. 
17630 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20     ** beginning 
17640 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20  of pTmpSpace as 
17650 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c  an area availabl
17660 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65  e to prepend the
17670 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69  .    ** left-chi
17680 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ld pointer to th
17690 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
176a0 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   cell..    */.  
176b0 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
176c0 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  pace ){.      me
176d0 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70  mset(pBt->pTmpSp
176e0 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20  ace, 0, 8);.    
176f0 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
17700 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 4;.    }.  }
17710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
17720 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
17730 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
17740 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
17750 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
17760 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
17770 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
17780 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
17790 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73  pace -= 4;.    s
177a0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
177b0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
177c0 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
177d0 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ce = 0;.  }.}../
177e0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
177f0 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
17800 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
17810 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
17820 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
17830 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
17840 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17850 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
17860 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
17870 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
17880 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
17890 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
178a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
178b0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
178c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
178d0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
178e0 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
178f0 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
17900 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
17910 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
17920 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
17930 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
17940 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
17950 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
17960 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
17970 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
17980 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
17990 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
179a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
179b0 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
179c0 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
179d0 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
179e0 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
179f0 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
17a00 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
17a10 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
17a20 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
17a30 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
17a40 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  p, SQLITE_OK, 0)
17a50 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17a60 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
17a70 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
17a80 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
17a90 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
17aa0 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
17ab0 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
17ac0 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
17ad0 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
17ae0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
17af0 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
17b00 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
17b10 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
17b20 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
17b30 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
17b40 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
17b50 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
17b60 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
17b70 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
17b80 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
17b90 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
17ba0 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
17bb0 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
17bc0 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
17bd0 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
17be0 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
17bf0 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
17c00 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
17c10 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
17c20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
17c30 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
17c40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
17c50 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
17c60 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20  ager, p->db);.  
17c70 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
17c80 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
17c90 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
17ca0 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
17cb0 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
17cc0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
17cd0 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e  3DbFree(0, pBt->
17ce0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72  pSchema);.    fr
17cf0 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
17d00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
17d10 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69  ee(pBt);.  }..#i
17d20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17d30 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
17d40 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
17d50 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61  ToLock==0 );.  a
17d60 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64  ssert( p->locked
17d70 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
17d80 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76  pPrev ) p->pPrev
17d90 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
17da0 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65  xt;.  if( p->pNe
17db0 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  xt ) p->pNext->p
17dc0 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
17dd0 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
17de0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65  e3_free(p);.  re
17df0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17e00 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
17e10 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69 74  the "soft" limit
17e20 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
17e30 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  f pages in the c
17e40 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20  ache..** Unused 
17e50 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20 70  and unmodified p
17e60 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65 63  ages will be rec
17e70 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6e  ycled when the n
17e80 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
17e90 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 65  s in the cache e
17ea0 78 63 65 65 64 73 20 74 68 69 73 20 73 6f 66 74  xceeds this soft
17eb0 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68 65   limit.  But the
17ec0 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
17ed0 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65 64  cache is allowed
17ee0 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72 20   to grow larger 
17ef0 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74 20  than this limit 
17f00 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a  if it contains.*
17f10 2a 20 64 69 72 74 79 20 70 61 67 65 73 20 6f 72  * dirty pages or
17f20 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e 20   pages still in 
17f30 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69  active use..*/.i
17f40 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
17f50 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
17f60 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
17f70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
17f80 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
17f90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
17fa0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
17fb0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
17fc0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17fd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
17fe0 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
17ff0 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
18000 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
18010 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18020 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18030 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
18040 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69  the "spill" limi
18050 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
18060 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
18070 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65  cache..** If the
18080 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
18090 20 65 78 63 65 65 64 73 20 74 68 69 73 20 6c 69   exceeds this li
180a0 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77 72 69  mit during a wri
180b0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  te transaction,.
180c0 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69 67  ** the pager mig
180d0 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22 73  ht attempt to "s
180e0 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20 74  pill" pages to t
180f0 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79  he journal early
18100 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20   in.** order to 
18110 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a  free up memory..
18120 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
18130 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
18140 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69  current spill si
18150 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20  ze.  If zero is 
18160 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20  passed.** as an 
18170 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61  argument, no cha
18180 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
18190 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65 20   the spill size 
181a0 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75  setting, so.** u
181b0 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20 30  sing mxPage of 0
181c0 20 69 73 20 61 20 77 61 79 20 74 6f 20 71 75 65   is a way to que
181d0 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ry the current s
181e0 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e  pill size..*/.in
181f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
18200 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65 65  tSpillSize(Btree
18210 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
18220 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
18230 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
18240 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28  t res;.  assert(
18250 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
18260 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
18270 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
18280 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
18290 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  es = sqlite3Page
182a0 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 42  rSetSpillsize(pB
182b0 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
182c0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
182d0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
182e0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66  turn res;.}..#if
182f0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
18300 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  _SIZE>0./*.** Ch
18310 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
18320 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
18330 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18340 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
18350 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a   memory mapped..
18360 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18370 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
18380 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65  Btree *p, sqlite
18390 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
183a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
183b0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
183c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
183d0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
183e0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
183f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
18400 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
18410 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
18420 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29  >pPager, szMmap)
18430 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
18440 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
18450 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18460 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
18470 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
18480 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
18490 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
184a0 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
184b0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
184c0 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
184d0 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
184e0 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
184f0 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
18500 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
18510 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
18520 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
18530 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
18540 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
18550 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
18560 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
18570 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
18580 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
18590 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
185a0 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
185b0 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
185c0 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
185d0 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
185e0 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
185f0 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
18600 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
18610 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
18620 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
18630 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
18640 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
18650 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
18660 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
18670 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61  BtreeSetPagerFla
18680 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  gs(.  Btree *p, 
18690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
186a0 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
186b0 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
186c0 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  l on */.  unsign
186d0 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
186e0 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45   /* Various PAGE
186f0 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  R_* flags */.){.
18700 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
18710 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
18720 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
18730 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
18740 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
18750 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18760 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
18770 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
18780 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20  er, pgFlags);.  
18790 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
187a0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
187b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
187c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  if../*.** Change
187d0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
187e0 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20  es size and the 
187f0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
18800 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ed bytes per pag
18810 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  e..** Or, if the
18820 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61   page size has a
18830 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65  lready been fixe
18840 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
18850 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69  _READONLY .** wi
18860 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61  thout changing a
18870 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  nything..**.** T
18880 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
18890 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
188a0 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
188b0 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
188c0 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
188d0 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
188e0 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
188f0 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
18900 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
18910 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
18920 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
18930 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
18940 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
18950 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
18960 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
18970 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
18980 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
18990 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
189a0 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
189b0 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
189c0 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
189d0 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
189e0 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
189f0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
18a00 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
18a10 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
18a20 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
18a30 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
18a40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
18a50 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
18a60 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
18a70 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
18a80 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30  * If the iFix!=0
18a90 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41   then the BTS_PA
18aa0 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61  GESIZE_FIXED fla
18ab0 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
18ac0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
18ad0 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
18ae0 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
18af0 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
18b00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18b10 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
18b20 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
18b30 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
18b40 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
18b50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18b60 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
18b70 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
18b80 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
18b90 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
18ba0 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
18bb0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
18bc0 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41  );.#if SQLITE_HA
18bd0 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52  S_CODEC.  if( nR
18be0 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69  eserve>pBt->opti
18bf0 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70 42 74  malReserve ) pBt
18c00 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
18c10 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b   = (u8)nReserve;
18c20 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
18c30 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
18c40 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
18c50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
18c60 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18c70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18c80 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
18c90 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
18ca0 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
18cb0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
18cc0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
18cd0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
18ce0 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
18cf0 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
18d00 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
18d10 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
18d20 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
18d30 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
18d40 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
18d50 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
18d60 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
18d70 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
18d80 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
18d90 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
18da0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
18db0 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a   (u32)pageSize;.
18dc0 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
18dd0 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
18de0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
18df0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
18e00 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
18e10 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
18e20 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
18e30 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
18e40 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
18e50 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
18e60 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
18e70 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
18e80 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65  _FIXED;.  sqlite
18e90 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18ea0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18eb0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18ec0 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
18ed0 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a  ed page size.*/.
18ee0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18ef0 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  GetPageSize(Btre
18f00 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
18f10 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
18f20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
18f30 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69  function is simi
18f40 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lar to sqlite3Bt
18f50 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c  reeGetReserve(),
18f60 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a   except that it.
18f70 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  ** may only be c
18f80 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67  alled if it is g
18f90 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
18fa0 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  he b-tree mutex 
18fb0 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65  is already.** he
18fc0 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ld..**.** This i
18fd0 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20  s useful in one 
18fe0 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20  special case in 
18ff0 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63  the backup API c
19000 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a  ode where it is.
19010 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68  ** known that th
19020 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20  e shared b-tree 
19030 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62  mutex is held, b
19040 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ut the mutex on 
19050 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
19060 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
19070 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20  s *p is not. In 
19080 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c  this case if sql
19090 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
190a0 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63  .** were to be c
190b0 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20  alled, it might 
190c0 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d  collide with som
190d0 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f  e other operatio
190e0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  n on the.** data
190f0 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
19100 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e   owns *p, causin
19110 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61  g undefined beha
19120 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  vior..*/.int sql
19130 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
19140 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65  rveNoMutex(Btree
19150 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
19160 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19170 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
19180 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
19190 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  n = p->pBt->page
191a0 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
191b0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74  sableSize;.  ret
191c0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
191d0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
191e0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
191f0 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
19200 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  f every page tha
19210 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75  t.** are intentu
19220 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64  ally left unused
19230 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22  .  This is the "
19240 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20  reserved" space 
19250 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74  that is.** somet
19260 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74  imes used by ext
19270 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  ensions..**.** I
19280 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54  f SQLITE_HAS_MUT
19290 45 58 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  EX is defined th
192a0 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65  en the number re
192b0 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a  turned is the.**
192c0 20 67 72 65 61 74 65 72 20 6f 66 20 74 68 65 20   greater of the 
192d0 63 75 72 72 65 6e 74 20 72 65 73 65 72 76 65 64  current reserved
192e0 20 73 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d   space and the m
192f0 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64  aximum requested
19300 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61 63  .** reserve spac
19310 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
19320 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c  3BtreeGetOptimal
19330 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
19340 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
19350 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
19360 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
19370 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
19380 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64  NoMutex(p);.#ifd
19390 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
193a0 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70  DEC.  if( n<p->p
193b0 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
193c0 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  ve ) n = p->pBt-
193d0 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b  >optimalReserve;
193e0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
193f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19400 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
19410 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
19420 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
19430 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
19440 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
19450 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
19460 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
19470 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
19480 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
19490 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
194a0 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
194b0 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
194c0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
194d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
194e0 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
194f0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
19500 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
19510 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
19520 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
19530 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
19540 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
19550 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
19560 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
19570 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
19580 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
19590 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44  the BTS_SECURE_D
195a0 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65  ELETE flag if ne
195b0 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e  wFlag is 0 or 1.
195c0 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20    If newFlag is 
195d0 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65  -1,.** then make
195e0 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c   no changes.  Al
195f0 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
19600 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53  value of the BTS
19610 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a  _SECURE_DELETE.*
19620 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20  * setting after 
19630 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69  the change..*/.i
19640 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
19650 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65  ecureDelete(Btre
19660 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61  e *p, int newFla
19670 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69  g){.  int b;.  i
19680 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
19690 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   0;.  sqlite3Btr
196a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
196b0 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a  ( newFlag>=0 ){.
196c0 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46      p->pBt->btsF
196d0 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43  lags &= ~BTS_SEC
196e0 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20  URE_DELETE;.    
196f0 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d  if( newFlag ) p-
19700 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c  >pBt->btsFlags |
19710 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  = BTS_SECURE_DEL
19720 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20  ETE;.  } .  b = 
19730 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67  (p->pBt->btsFlag
19740 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
19750 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c  ELETE)!=0;.  sql
19760 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19770 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d  );.  return b;.}
19780 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
19790 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
197a0 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
197b0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
197c0 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
197d0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
197e0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
197f0 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
19800 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
19810 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
19820 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
19830 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
19840 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
19850 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
19860 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
19870 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
19880 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
19890 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
198a0 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
198b0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
198c0 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
198d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
198e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
198f0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
19900 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
19910 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
19920 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
19930 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
19940 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
19950 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
19960 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
19970 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
19980 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
19990 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61  _FIXED)!=0 && (a
199a0 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75  v ?1:0)!=pBt->au
199b0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
199c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
199d0 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
199e0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
199f0 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20  um = av ?1:0;.  
19a00 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
19a10 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a  m = av==2 ?1:0;.
19a20 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
19a30 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
19a40 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
19a50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
19a60 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
19a70 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
19a80 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
19a90 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
19aa0 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
19ab0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
19ac0 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
19ad0 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
19ae0 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
19af0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
19b00 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
19b10 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
19b20 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
19b30 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
19b40 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
19b50 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
19b60 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
19b70 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
19b80 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
19b90 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
19ba0 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
19bb0 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
19bc0 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
19bd0 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
19be0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
19bf0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
19c00 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
19c10 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20  .** If the user 
19c20 68 61 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20  has not set the 
19c30 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f 72  safety-level for
19c40 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
19c50 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73 69  onnection.** usi
19c60 6e 67 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68  ng "PRAGMA synch
19c70 72 6f 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66 20  ronous", and if 
19c80 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c  the safety-level
19c90 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
19ca0 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  ** set to the va
19cb0 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 74 68  lue passed to th
19cc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 74  is function as t
19cd0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
19ce0 74 65 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20 73  ter,.** set it s
19cf0 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  o..*/.#if SQLITE
19d00 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f  _DEFAULT_SYNCHRO
19d10 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44 45 46  NOUS!=SQLITE_DEF
19d20 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f  AULT_WAL_SYNCHRO
19d30 4e 4f 55 53 0a 73 74 61 74 69 63 20 76 6f 69 64  NOUS.static void
19d40 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
19d50 6c 61 67 28 42 74 53 68 61 72 65 64 20 2a 70 42  lag(BtShared *pB
19d60 74 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65 76  t, u8 safety_lev
19d70 65 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  el){.  sqlite3 *
19d80 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20  db;.  Db *pDb;. 
19d90 20 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62   if( (db=pBt->db
19da0 29 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d  )!=0 && (pDb=db-
19db0 3e 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20  >aDb)!=0 ){.    
19dc0 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d  while( pDb->pBt=
19dd0 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e  =0 || pDb->pBt->
19de0 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62 2b  pBt!=pBt ){ pDb+
19df0 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62  +; }.    if( pDb
19e00 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20  ->bSyncSet==0 . 
19e10 20 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65      && pDb->safe
19e20 74 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74 79  ty_level!=safety
19e30 5f 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26 20  _level .     && 
19e40 70 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d  pDb!=&db->aDb[1]
19e50 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70   .    ){.      p
19e60 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
19e70 20 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b   = safety_level;
19e80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
19e90 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
19ea0 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20  >pPager,.       
19eb0 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c     pDb->safety_l
19ec0 65 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67  evel | (db->flag
19ed0 73 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f  s & PAGER_FLAGS_
19ee0 4d 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20  MASK));.    }.  
19ef0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
19f00 6e 65 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e  ne setDefaultSyn
19f10 63 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74 79  cFlag(pBt,safety
19f20 5f 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a  _level).#endif..
19f30 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
19f40 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
19f50 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19f60 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
19f70 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
19f80 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
19f90 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
19fa0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
19fb0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
19fc0 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
19fd0 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
19fe0 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
19ff0 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
1a000 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
1a010 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
1a020 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
1a030 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
1a040 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
1a050 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
1a060 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
1a070 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
1a080 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
1a090 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
1a0a0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
1a0b0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1a0c0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1a0d0 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
1a0e0 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
1a0f0 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
1a100 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
1a110 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1a120 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
1a130 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1a140 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1a150 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
1a160 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  nt nPageFile = 0
1a170 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
1a180 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
1a190 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1a1a0 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72   int nPageHeader
1a1b0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1a1c0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1a1d0 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
1a1e0 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
1a1f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1a200 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1a210 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1a220 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
1a230 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
1a240 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
1a250 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
1a260 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a270 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1a280 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
1a290 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
1a2a0 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
1a2b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a2c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
1a2d0 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
1a2e0 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
1a2f0 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
1a300 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
1a310 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
1a320 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
1a330 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
1a340 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
1a350 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
1a360 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
1a370 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1a380 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1a390 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
1a3a0 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
1a3b0 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
1a3c0 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
1a3d0 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
1a3e0 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
1a3f0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
1a400 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  e;.  }.  if( nPa
1a410 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  ge>0 ){.    u32 
1a420 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33  pageSize;.    u3
1a430 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  2 usableSize;.  
1a440 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
1a450 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
1a460 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
1a470 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ADB;.    /* EVID
1a480 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37  ENCE-OF: R-43737
1a490 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c  -39999 Every val
1a4a0 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  id SQLite databa
1a4b0 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20  se file begins. 
1a4c0 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66     ** with the f
1a4d0 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65  ollowing 16 byte
1a4e0 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35  s (in hex): 53 5
1a4f0 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30  1 4c 69 74 65 20
1a500 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20   66 6f 72 6d.   
1a510 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20   ** 61 74 20 33 
1a520 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d  00. */.    if( m
1a530 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
1a540 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
1a550 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
1a560 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1a570 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  d;.    }..#ifdef
1a580 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1a590 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
1a5a0 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
1a5b0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1a5c0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
1a5d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
1a5e0 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
1a5f0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1a600 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23  _failed;.    }.#
1a610 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67  else.    if( pag
1a620 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[18]>2 ){.    
1a630 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1a640 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
1a650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a660 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20  page1[19]>2 ){. 
1a670 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1a680 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1a690 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1a6a0 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20  e write version 
1a6b0 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69  is set to 2, thi
1a6c0 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  s database shoul
1a6d0 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20  d be accessed.  
1a6e0 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65    ** in WAL mode
1a6f0 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20  . If the log is 
1a700 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
1a710 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54  , open it now. T
1a720 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75  hen .    ** retu
1a730 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
1a740 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
1a750 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61  populating BtSha
1a760 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20  red.pPage1..    
1a770 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65  ** The caller de
1a780 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63  tects this and c
1a790 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
1a7a0 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69  on again. This i
1a7b0 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  s.    ** require
1a7c0 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e  d as the version
1a7d0 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65   of page 1 curre
1a7e0 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
1a7f0 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20  1 buffer.    ** 
1a800 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c  may not be the l
1a810 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20  atest version - 
1a820 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e  there may be a n
1a830 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20  ewer one in the 
1a840 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  log.    ** file.
1a850 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1a860 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20  page1[19]==2 && 
1a870 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1a880 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20   BTS_NO_WAL)==0 
1a890 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
1a8a0 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
1a8b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a8c0 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
1a8d0 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
1a8e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a8f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a900 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1a910 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
1a920 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1a930 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
1a940 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45  g(pBt, SQLITE_DE
1a950 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52  FAULT_WAL_SYNCHR
1a960 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 20 20  ONOUS+1);.      
1a970 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20    if( isOpen==0 
1a980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
1a990 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
1a9a0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1a9b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1a9c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1a9d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1a9e0 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65  E_NOTADB;.    }e
1a9f0 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44 65  lse{.      setDe
1aa00 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42  faultSyncFlag(pB
1aa10 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  t, SQLITE_DEFAUL
1aa20 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29  T_SYNCHRONOUS+1)
1aa30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1aa40 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1aa50 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31  OF: R-15465-2081
1aa60 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e  3 The maximum an
1aa70 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64  d minimum embedd
1aa80 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a  ed payload.    *
1aa90 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20  * fractions and 
1aaa0 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64  the leaf payload
1aab0 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73   fraction values
1aac0 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c   must be 64, 32,
1aad0 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a   and 32..    **.
1aae0 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69      ** The origi
1aaf0 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77  nal design allow
1ab00 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73  ed these amounts
1ab10 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73   to vary, but as
1ab20 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   of.    ** versi
1ab30 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71  on 3.6.0, we req
1ab40 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20  uire them to be 
1ab50 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  fixed..    */.  
1ab60 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61    if( memcmp(&pa
1ab70 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30  ge1[21], "\100\0
1ab80 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b  40\040",3)!=0 ){
1ab90 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
1aba0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
1abb0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
1abc0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
1abd0 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
1abe0 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
1abf0 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
1ac00 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
1ac10 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
1ac20 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
1ac30 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
1ac40 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
1ac50 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1ac60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1ac70 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ile. */.    page
1ac80 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36  Size = (page1[16
1ac90 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31  ]<<8) | (page1[1
1aca0 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20  7]<<16);.    /* 
1acb0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1acc0 35 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73  5008-21688 The s
1acd0 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73  ize of a page is
1ace0 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a   a power of two.
1acf0 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35      ** between 5
1ad00 31 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63  12 and 65536 inc
1ad10 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69  lusive. */.    i
1ad20 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
1ad30 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20  &pageSize)!=0.  
1ad40 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53     || pageSize>S
1ad50 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
1ad60 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67  IZE .     || pag
1ad70 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20  eSize<=256 .    
1ad80 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
1ad90 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
1ada0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1adb0 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
1adc0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==0 );.    /* E
1add0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
1ade0 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72  310-51205 The "r
1adf0 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73  eserved space" s
1ae00 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74  ize in the 1-byt
1ae10 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72  e.    ** integer
1ae20 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73   at offset 20 is
1ae30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1ae40 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
1ae50 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20   the end of.    
1ae60 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20  ** each page to 
1ae70 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65  reserve for exte
1ae80 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a  nsions. .    **.
1ae90 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
1aea0 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
1aeb0 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
1aec0 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
1aed0 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  n is.    ** dete
1aee0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
1aef0 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
1af00 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
1af10 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
1af20 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
1af30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
1af40 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73  eader. */.    us
1af50 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
1af60 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
1af70 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61  .    if( (u32)pa
1af80 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
1af90 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
1afa0 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
1afb0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1afc0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
1afd0 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
1afe0 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
1aff0 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
1b000 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
1b010 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
1b020 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
1b030 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
1b040 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
1b050 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
1b060 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
1b070 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
1b080 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1b090 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
1b0a0 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
1b0b0 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
1b0c0 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
1b0d0 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
1b0e0 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
1b0f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1b100 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
1b110 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
1b120 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
1b130 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
1b140 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
1b150 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
1b160 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
1b170 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
1b180 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
1b190 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
1b1a0 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
1b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1c0 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a           pageSiz
1b1d0 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  e-usableSize);. 
1b1e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b1f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
1b200 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
1b210 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d  SQLITE_RecoveryM
1b220 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65  ode)==0 && nPage
1b230 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20  >nPageFile ){.  
1b240 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b250 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1b260 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
1b270 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
1b280 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
1b290 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34  E-OF: R-28312-64
1b2a0 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65  704 However, the
1b2b0 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20   usable size is 
1b2c0 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20  not allowed to. 
1b2d0 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68     ** be less th
1b2e0 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72  an 480. In other
1b2f0 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70   words, if the p
1b300 61 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c  age size is 512,
1b310 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
1b320 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
1b330 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65  size cannot exce
1b340 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66  ed 32. */.    if
1b350 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
1b360 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
1b370 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
1b380 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
1b390 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
1b3a0 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
1b3b0 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
1b3c0 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
1b3d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1b3e0 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
1b3f0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
1b400 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
1b410 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
1b420 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
1b430 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
1b440 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
1b450 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
1b460 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
1b470 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
1b480 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
1b490 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
1b4a0 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
1b4b0 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
1b4c0 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
1b4d0 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
1b4e0 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
1b4f0 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
1b500 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
1b510 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
1b520 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
1b530 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
1b540 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
1b550 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
1b560 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
1b570 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
1b580 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
1b590 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
1b5a0 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
1b5b0 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
1b5c0 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
1b5d0 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
1b5e0 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
1b5f0 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
1b600 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
1b610 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
1b620 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61  -byte pointer, a
1b630 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
1b640 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
1b650 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
1b660 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
1b670 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
1b680 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
1b690 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
1b6a0 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
1b6b0 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
1b6c0 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
1b6d0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
1b6e0 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
1b6f0 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75  t->minLocal = (u
1b700 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
1b710 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
1b720 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61  - 23);.  pBt->ma
1b730 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42  xLeaf = (u16)(pB
1b740 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
1b750 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  35);.  pBt->minL
1b760 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74  eaf = (u16)((pBt
1b770 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
1b780 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
1b790 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63   if( pBt->maxLoc
1b7a0 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42  al>127 ){.    pB
1b7b0 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
1b7c0 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73  ad = 127;.  }els
1b7d0 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  e{.    pBt->max1
1b7e0 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75  bytePayload = (u
1b7f0 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  8)pBt->maxLocal;
1b800 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1b810 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
1b820 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
1b830 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
1b840 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
1b850 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
1b860 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
1b870 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
1b880 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
1b890 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1b8a0 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
1b8b0 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
1b8c0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
1b8d0 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
1b8e0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1b8f0 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  of cursors open 
1b900 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20  on pBt. This is 
1b910 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73  for use.** in as
1b920 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
1b930 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c  ns, so it is onl
1b940 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44  y compiled if ND
1b950 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64  EBUG is not.** d
1b960 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  efined..**.** On
1b970 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
1b980 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20   are counted if 
1b990 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20  wrOnly is true. 
1b9a0 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a   If wrOnly is.**
1b9b0 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20   false then all 
1b9c0 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
1b9d0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ted..**.** For t
1b9e0 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
1b9f0 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63  his routine, a c
1ba00 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
1ba10 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
1ba20 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e  apable of readin
1ba30 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20  g or writing to 
1ba40 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43  the database.  C
1ba50 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68  ursors that.** h
1ba60 61 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64  ave been tripped
1ba70 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52   into the CURSOR
1ba80 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65  _FAULT state are
1ba90 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f   not counted..*/
1baa0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
1bab0 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74  tValidCursors(Bt
1bac0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74  Shared *pBt, int
1bad0 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75   wrOnly){.  BtCu
1bae0 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
1baf0 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  t r = 0;.  for(p
1bb00 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
1bb10 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
1bb20 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
1bb30 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c  f( (wrOnly==0 ||
1bb40 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
1bb50 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
1bb60 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70  g)!=0).     && p
1bb70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
1bb80 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b  SOR_FAULT ) r++;
1bb90 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
1bba0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1bbb0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
1bbc0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  o outstanding cu
1bbd0 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65  rsors and we are
1bbe0 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64   not in the midd
1bbf0 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73  le.** of a trans
1bc00 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65  action but there
1bc10 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20   is a read lock 
1bc20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  on the database,
1bc30 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
1bc40 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65  utine unrefs the
1bc50 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
1bc60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1bc70 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74   which .** has t
1bc80 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c  he effect of rel
1bc90 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20  easing the read 
1bca0 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
1bcb0 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
1bcc0 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
1bcd0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
1bce0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1bcf0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
1bd00 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
1bd10 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1bd20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1bd30 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1bd40 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1bd50 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
1bd60 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30  ursors(pBt,0)==0
1bd70 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   || pBt->inTrans
1bd80 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e  action>TRANS_NON
1bd90 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  E );.  if( pBt->
1bda0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1bdb0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74  RANS_NONE && pBt
1bdc0 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20  ->pPage1!=0 ){. 
1bdd0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
1bde0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1bdf0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1be00 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
1be10 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
1be20 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1be30 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
1be40 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
1be50 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  e1 = 0;.    rele
1be60 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
1be70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Page1);.  }.}../
1be80 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e  *.** If pBt poin
1be90 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66  ts to an empty f
1bea0 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  ile then convert
1beb0 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65   that empty file
1bec0 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65  .** into a new e
1bed0 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79  mpty database by
1bee0 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
1bef0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a  e first page of.
1bf00 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ** the database.
1bf10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
1bf20 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
1bf30 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
1bf40 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
1bf50 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
1bf60 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
1bf70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1bf80 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1bf90 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
1bfa0 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20  Bt->nPage>0 ){. 
1bfb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bfc0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d  _OK;.  }.  pP1 =
1bfd0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1bfe0 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29  assert( pP1!=0 )
1bff0 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e  ;.  data = pP1->
1c000 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
1c010 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1c020 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pP1->pDbPage);. 
1c030 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1c040 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61   rc;.  memcpy(da
1c050 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  ta, zMagicHeader
1c060 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  , sizeof(zMagicH
1c070 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72  eader));.  asser
1c080 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  t( sizeof(zMagic
1c090 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20  Header)==16 );. 
1c0a0 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29   data[16] = (u8)
1c0b0 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
1c0c0 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  >8)&0xff);.  dat
1c0d0 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42  a[17] = (u8)((pB
1c0e0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29  t->pageSize>>16)
1c0f0 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
1c100 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
1c110 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  9] = 1;.  assert
1c120 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
1c130 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
1c140 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   && pBt->usableS
1c150 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61  ize+255>=pBt->pa
1c160 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
1c170 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e  20] = (u8)(pBt->
1c180 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
1c190 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64  usableSize);.  d
1c1a0 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20  ata[21] = 64;.  
1c1b0 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20  data[22] = 32;. 
1c1c0 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a   data[23] = 32;.
1c1d0 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
1c1e0 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
1c1f0 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
1c200 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
1c210 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
1c220 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c   );.  pBt->btsFl
1c230 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
1c240 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
1c250 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1c260 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65  UTOVACUUM.  asse
1c270 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
1c280 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61  uum==1 || pBt->a
1c290 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  utoVacuum==0 );.
1c2a0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1c2b0 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  ncrVacuum==1 || 
1c2c0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
1c2d0 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
1c2e0 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
1c2f0 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
1c300 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  m);.  put4byte(&
1c310 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20  data[36 + 7*4], 
1c320 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
1c330 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  ;.#endif.  pBt->
1c340 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74  nPage = 1;.  dat
1c350 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74  a[31] = 1;.  ret
1c360 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1c370 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
1c380 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ze the first pag
1c390 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1c3a0 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67  e file (creating
1c3b0 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63   a database.** c
1c3c0 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
1c3d0 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e  ingle page and n
1c3e0 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73  o schema objects
1c3f0 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
1c400 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73  _OK.** if succes
1c410 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
1c420 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
1c430 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
1c440 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44  sqlite3BtreeNewD
1c450 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  b(Btree *p){.  i
1c460 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1c470 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1c480 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d   p->pBt->nPage =
1c490 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61   0;.  rc = newDa
1c4a0 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a  tabase(p->pBt);.
1c4b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1c4c0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1c4d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
1c4e0 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61  tempt to start a
1c4f0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
1c500 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  . A write-transa
1c510 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72  ction.** is star
1c520 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ted if the secon
1c530 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
1c540 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  nzero, otherwise
1c550 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e   a read-.** tran
1c560 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  saction.  If the
1c570 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1c580 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e   is 2 or more an
1c590 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74  d exclusive.** t
1c5a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
1c5b0 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74  arted, meaning t
1c5c0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
1c5d0 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a  cess is allowed.
1c5e0 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ** to access the
1c5f0 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72   database.  A pr
1c600 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61  eexisting transa
1c610 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
1c620 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20  .** upgraded to 
1c630 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c  exclusive by cal
1c640 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
1c650 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20  e a second time 
1c660 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69  - the.** exclusi
1c670 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77  vity flag only w
1c680 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74  orks for a new t
1c690 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1c6a0 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
1c6b0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
1c6c0 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  arted before att
1c6d0 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20  empting any .** 
1c6e0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
1c6f0 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f  atabase.  None o
1c700 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1c710 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c  routines .** wil
1c720 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20  l work unless a 
1c730 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
1c740 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a  tarted first:.**
1c750 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1c760 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
1c770 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1c780 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  e3BtreeCreateInd
1c790 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ex().**      sql
1c7a0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
1c7b0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
1c7c0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
1c7d0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
1c7e0 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
1c7f0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1c800 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a  e3BtreeDelete().
1c810 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1c820 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29  treeUpdateMeta()
1c830 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69  .**.** If an ini
1c840 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  tial attempt to 
1c850 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b  acquire the lock
1c860 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
1c870 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  f lock contentio
1c880 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  n.** and the dat
1c890 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f  abase was previo
1c8a0 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  usly unlocked, t
1c8b0 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  hen invoke the b
1c8c0 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69  usy handler.** i
1c8d0 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
1c8e0 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61   But if there wa
1c8f0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72  s previously a r
1c900 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74  ead-lock, do not
1c910 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  .** invoke the b
1c920 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75  usy handler - ju
1c930 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
1c940 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42  _BUSY.  SQLITE_B
1c950 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  USY is .** retur
1c960 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  ned when there i
1c970 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
1c980 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74  -lock in order t
1c990 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f  o avoid a deadlo
1c9a0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  ck..**.** Suppos
1c9b0 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  e there are two 
1c9c0 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20  processes A and 
1c9d0 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64  B.  A has a read
1c9e0 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a   lock and B has.
1c9f0 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ** a reserved lo
1ca00 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20  ck.  B tries to 
1ca10 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75  promote to exclu
1ca20 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63  sive but is bloc
1ca30 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f  ked because.** o
1ca40 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e  f A's read lock.
1ca50 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f    A tries to pro
1ca60 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64  mote to reserved
1ca70 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
1ca80 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20  by B..** One or 
1ca90 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
1caa0 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d   two processes m
1cab0 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20  ust give way or 
1cac0 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
1cad0 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79  no progress.  By
1cae0 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
1caf0 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69  E_BUSY and not i
1cb00 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79  nvoking the busy
1cb10 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65   callback.** whe
1cb20 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  n A already has 
1cb30 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20  a read lock, we 
1cb40 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67  encourage A to g
1cb50 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42  ive up and let B
1cb60 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a  .** proceed..*/.
1cb70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1cb80 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65  BeginTrans(Btree
1cb90 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29   *p, int wrflag)
1cba0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1cbb0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
1cbc0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1cbd0 3b 0a 20 20 69 6e 74 20 62 43 6f 6e 63 75 72 72  ;.  int bConcurr
1cbe0 65 6e 74 20 3d 20 28 70 2d 3e 64 62 2d 3e 62 43  ent = (p->db->bC
1cbf0 6f 6e 63 75 72 72 65 6e 74 20 26 26 20 21 49 53  oncurrent && !IS
1cc00 41 55 54 4f 56 41 43 55 55 4d 29 3b 0a 0a 20 20  AUTOVACUUM);..  
1cc10 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1cc20 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
1cc30 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
1cc40 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
1cc50 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
1cc60 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
1cc70 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
1cc80 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
1cc90 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
1cca0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
1ccb0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
1ccc0 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
1ccd0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
1cce0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1ccf0 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
1cd00 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1cd10 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
1cd20 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
1cd30 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20  ans_begun;.  }. 
1cd40 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1cd50 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1cd60 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f  NS_WRITE || IfNo
1cd70 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
1cd80 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a  Truncate)==0 );.
1cd90 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
1cda0 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
1cdb0 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
1cdc0 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
1cdd0 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d  e */.  if( (pBt-
1cde0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1cdf0 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26  READ_ONLY)!=0 &&
1ce00 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
1ce10 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
1ce20 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
1ce30 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
1ce40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ce50 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1ce60 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
1ce70 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   *pBlock = 0;.  
1ce80 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
1ce90 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1cea0 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
1ceb0 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
1cec0 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f  action .    ** o
1ced0 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
1cee0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
1cef0 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
1cf00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
1cf10 20 20 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64      ** requested
1cf20 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1cf30 4c 4f 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20  LOCKED..    */. 
1cf40 20 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26     if( (wrflag &
1cf50 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
1cf60 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1cf70 45 29 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d  E).     || (pBt-
1cf80 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1cf90 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20  PENDING)!=0.    
1cfa0 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20  ){.      pBlock 
1cfb0 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
1cfc0 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  db;.    }else if
1cfd0 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20  ( wrflag>1 ){.  
1cfe0 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65      BtLock *pIte
1cff0 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74  r;.      for(pIt
1d000 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
1d010 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
1d020 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
1d030 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
1d040 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
1d050 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49       pBlock = pI
1d060 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  ter->pBtree->db;
1d070 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1d080 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d090 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1d0a0 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( pBlock ){.    
1d0b0 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
1d0c0 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
1d0d0 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  , pBlock);.     
1d0e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
1d0f0 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
1d100 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  .      goto tran
1d110 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20  s_begun;.    }. 
1d120 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1d130 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  Any read-only or
1d140 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e   read-write tran
1d150 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  saction implies 
1d160 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a  a read-lock on .
1d170 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20    ** page 1. So 
1d180 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68  if some other sh
1d190 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
1d1a0 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  t already has a 
1d1b0 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a  write-lock .  **
1d1c0 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20   on page 1, the 
1d1d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e  transaction cann
1d1e0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f  ot be opened. */
1d1f0 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61  .  rc = querySha
1d200 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1d210 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
1d220 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
1d230 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
1d240 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62  c ) goto trans_b
1d250 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74  egun;..  pBt->bt
1d260 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49  sFlags &= ~BTS_I
1d270 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
1d280 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
1d290 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  ==0 ) pBt->btsFl
1d2a0 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49  ags |= BTS_INITI
1d2b0 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f  ALLY_EMPTY;.  do
1d2c0 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
1d2d0 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
1d2e0 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
1d2f0 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
1d300 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
1d310 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
1d320 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
1d330 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
1d340 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
1d350 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
1d360 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
1d370 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
1d380 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
1d390 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
1d3a0 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
1d3b0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
1d3c0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1d3d0 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
1d3e0 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
1d3f0 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
1d400 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
1d410 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
1d420 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
1d430 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
1d440 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
1d450 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
1d460 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
1d470 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
1d480 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
1d490 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
1d4a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1d4b0 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1d4c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
1d4d0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1d4e0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
1d4f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1d500 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1d510 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d520 20 20 20 20 20 20 20 69 6e 74 20 65 78 46 6c 61         int exFla
1d530 67 20 3d 20 62 43 6f 6e 63 75 72 72 65 6e 74 20  g = bConcurrent 
1d540 3f 20 2d 31 20 3a 20 28 77 72 66 6c 61 67 3e 31  ? -1 : (wrflag>1
1d550 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1d560 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1d570 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 65  n(pBt->pPager, e
1d580 78 46 6c 61 67 2c 20 73 71 6c 69 74 65 33 54 65  xFlag, sqlite3Te
1d590 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62  mpInMemory(p->db
1d5a0 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
1d5b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d5c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1d5d0 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
1d5e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d5f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1d600 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d610 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  OK ){.      unlo
1d620 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1d630 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
1d640 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d  hile( (rc&0xFF)=
1d650 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1d660 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1d670 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
1d680 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
1d690 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
1d6a0 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
1d6b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d6c0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
1d6d0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1d6e0 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
1d6f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
1d700 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d710 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1d720 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
1d730 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
1d740 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
1d750 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70  k.pBtree==p && p
1d760 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31  ->lock.iTable==1
1d770 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   );.        p->l
1d780 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44  ock.eLock = READ
1d790 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
1d7a0 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70  ->lock.pNext = p
1d7b0 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20  Bt->pLock;.     
1d7c0 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
1d7d0 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  &p->lock;.      
1d7e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
1d7f0 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1d800 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
1d810 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
1d820 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1d830 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
1d840 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1d850 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1d860 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
1d870 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77  .    }.    if( w
1d880 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d  rflag ){.      M
1d890 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1d8a0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69   pBt->pPage1;.#i
1d8b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d8c0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1d8d0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
1d8e0 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
1d8f0 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
1d900 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
1d910 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1d920 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  S_EXCLUSIVE;.   
1d930 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20     if( wrflag>1 
1d940 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1d950 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45  |= BTS_EXCLUSIVE
1d960 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
1d970 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a  /* If the db-siz
1d980 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69  e header field i
1d990 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20  s incorrect (as 
1d9a0 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20  it may be if an 
1d9b0 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69  old.      ** cli
1d9c0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  ent has been wri
1d9d0 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
1d9e0 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20  e file), update 
1d9f0 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20  it now. Doing.  
1da00 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e      ** this soon
1da10 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
1da20 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64  ater means the d
1da30 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e  atabase size can
1da40 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a   safely .      *
1da50 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61  * re-read the da
1da60 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d  tabase size from
1da70 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76   page 1 if a sav
1da80 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61  epoint or transa
1da90 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ction.      ** r
1daa0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77  ollback occurs w
1dab0 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ithin the transa
1dac0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
1dad0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
1dae0 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26  Page!=get4byte(&
1daf0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1db00 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
1db10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1db20 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1db30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1db40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1db50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1db60 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1db70 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1db80 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
1db90 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1dba0 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
1dbb0 6e 3a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  n:.#ifndef SQLIT
1dbc0 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
1dbd0 54 0a 20 20 69 66 28 20 62 43 6f 6e 63 75 72 72  T.  if( bConcurr
1dbe0 65 6e 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ent && rc==SQLIT
1dbf0 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 50  E_OK && sqlite3P
1dc00 61 67 65 72 49 73 57 61 6c 28 70 42 74 2d 3e 70  agerIsWal(pBt->p
1dc10 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63  Pager) ){.    rc
1dc20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
1dc30 65 67 69 6e 43 6f 6e 63 75 72 72 65 6e 74 28 70  eginConcurrent(p
1dc40 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
1dc50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dc60 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
1dc70 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
1dc80 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28 70  PtrmapAllocate(p
1dc90 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  Bt);.    }.  }.#
1dca0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63 3d  endif..  if( rc=
1dcb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1dcc0 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54  flag ){.    /* T
1dcd0 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
1dce0 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
1dcf0 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
1dd00 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
1dd10 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69   ** open savepoi
1dd20 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f  nts. If the seco
1dd30 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
1dd40 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61  greater than 0 a
1dd50 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  nd.    ** the su
1dd60 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  b-journal is not
1dd70 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
1dd80 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f  hen it will be o
1dd90 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20  pened here..    
1dda0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 61 76 65  */.    int nSave
1ddb0 70 6f 69 6e 74 20 3d 20 70 2d 3e 64 62 2d 3e 6e  point = p->db->n
1ddc0 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 72  Savepoint;.    r
1ddd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1dde0 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
1ddf0 74 2d 3e 70 50 61 67 65 72 2c 20 6e 53 61 76 65  t->pPager, nSave
1de00 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  point);.    if( 
1de10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1de20 20 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   nSavepoint ){. 
1de30 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 50       rc = btreeP
1de40 74 72 6d 61 70 42 65 67 69 6e 28 70 42 74 2c 20  trmapBegin(pBt, 
1de50 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  nSavepoint);.   
1de60 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49   }.  }..  btreeI
1de70 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
1de80 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1de90 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1dea0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1deb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1dec0 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
1ded0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
1dee0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
1def0 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
1df00 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
1df10 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
1df20 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
1df30 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1df40 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
1df50 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
1df60 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
1df70 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
1df80 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
1df90 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
1dfa0 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
1dfb0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfd0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
1dfe0 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
1dff0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
1e000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e010 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e020 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
1e030 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
1e040 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e060 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1e070 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1e080 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1e090 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
1e0a0 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
1e0b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1e0c0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1e0d0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
1e0e0 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
1e0f0 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
1e100 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1e110 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65  return rc;.  nCe
1e120 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1e130 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
1e140 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1e150 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1e160 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1e170 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ;..    ptrmapPut
1e180 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
1e190 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20  Cell, &rc);..   
1e1a0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1e1b0 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
1e1c0 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1e1d0 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
1e1e0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1e1f0 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
1e200 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
1e210 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1e220 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
1e230 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1e240 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1e250 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1e260 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1e270 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74  fset+8]);.    pt
1e280 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1e290 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1e2a0 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1e2b0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1e2c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
1e2d0 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
1e2e0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1e2f0 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
1e300 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
1e310 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
1e320 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
1e330 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
1e340 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
1e350 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
1e360 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
1e370 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
1e380 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
1e390 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
1e3a0 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1e3b0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1e3c0 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1e3e0 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
1e3f0 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1e400 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
1e410 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1e420 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1e430 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
1e440 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e450 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
1e460 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
1e470 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
1e480 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1e490 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
1e4a0 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
1e4b0 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1e4c0 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
1e4d0 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
1e4e0 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
1e4f0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1e500 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
1e510 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
1e520 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
1e530 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
1e540 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
1e550 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
1e560 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1e570 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1e580 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1e590 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
1e5a0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
1e5b0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
1e5c0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1e5d0 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
1e5e0 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
1e5f0 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
1e600 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
1e610 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
1e620 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
1e630 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
1e640 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
1e650 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e660 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1e670 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
1e680 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
1e690 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
1e6a0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b  else{.    int i;
1e6b0 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
1e6c0 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
1e6d0 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
1e6e0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
1e6f0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1e700 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  rc;.    nCell = 
1e710 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1e720 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1e730 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
1e740 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
1e750 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1e760 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1e770 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1e780 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
1e790 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1e7a0 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
1e7b0 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
1e7c0 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
1e7d0 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c       if( info.nL
1e7e0 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f  ocal<info.nPaylo
1e7f0 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ad ){.          
1e800 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  if( pCell+info.n
1e810 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61 44  Size > pPage->aD
1e820 61 74 61 2b 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ata+pPage->pBt->
1e830 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
1e840 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1e850 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1e860 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1e870 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1e880 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
1e890 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
1e8a0 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -4) ){.         
1e8b0 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
1e8c0 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20  l+info.nSize-4, 
1e8d0 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
1e8e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1e8f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1e900 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e910 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
1e920 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
1e930 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1e940 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
1e950 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1e960 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1e970 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
1e980 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
1e990 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
1e9a0 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
1e9b0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
1e9c0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1e9d0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1e9e0 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
1e9f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1ea00 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1ea10 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
1ea20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1ea30 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1ea40 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1ea50 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  , iTo);.    }.  
1ea60 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1ea70 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
1ea80 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
1ea90 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1eaa0 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
1eab0 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
1eac0 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
1ead0 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
1eae0 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
1eaf0 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  id..**.** The is
1eb00 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69  Commit flag indi
1eb10 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65  cates that there
1eb20 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
1eb30 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20  emember that.** 
1eb40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
1eb50 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
1eb60 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
1eb70 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70   page pDbPage->p
1eb80 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77  gno .** can be w
1eb90 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
1eba0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1ebb0 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
1ebc0 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a  o write to that.
1ebd0 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ** page..*/.stat
1ebe0 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
1ebf0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1ec00 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
1ec10 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
1ec20 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
1ec30 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
1ec40 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
1ec50 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
1ec60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1ec70 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
1ec80 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1ec90 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
1eca0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1ecb0 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1ecc0 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
1ecd0 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
1ece0 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
1ecf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ed00 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
1ed10 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
1ed20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
1ed30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43            /* isC
1ed40 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65  ommit flag passe
1ed50 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  d to sqlite3Page
1ed60 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a  rMovepage */.){.
1ed70 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
1ed80 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
1ed90 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
1eda0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
1edb0 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1edc0 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
1edd0 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
1ede0 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
1edf0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1ee00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
1ee10 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1ee20 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
1ee30 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
1ee40 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
1ee50 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1ee60 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1ee70 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
1ee80 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1ee90 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1eea0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1eeb0 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
1eec0 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  Bt );..  /* Move
1eed0 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
1eee0 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c  om its current l
1eef0 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
1ef00 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
1ef10 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
1ef20 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
1ef30 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
1ef40 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
1ef50 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
1ef60 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
1ef70 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
1ef80 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
1ef90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
1efa0 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
1efb0 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
1efc0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43  , iFreePage, isC
1efd0 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
1efe0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1eff0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f000 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
1f010 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
1f020 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
1f030 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
1f040 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
1f050 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
1f060 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
1f070 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
1f080 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
1f090 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
1f0a0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
1f0b0 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
1f0c0 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
1f0d0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
1f0e0 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
1f0f0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
1f100 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
1f110 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
1f120 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
1f130 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
1f140 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
1f150 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
1f160 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
1f170 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
1f180 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
1f190 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
1f1a0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1f1b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1f1c0 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
1f1d0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1f1e0 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
1f1f0 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
1f200 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
1f210 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1f220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f230 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1f240 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
1f250 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
1f260 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
1f270 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
1f280 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
1f290 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1f2a0 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
1f2b0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
1f2c0 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b  iFreePage, &rc);
1f2d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1f2e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f2f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f300 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1f310 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
1f320 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
1f330 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
1f340 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
1f350 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
1f360 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1f370 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
1f380 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
1f390 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
1f3a0 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
1f3b0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1f3c0 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
1f3d0 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  E ){.    rc = bt
1f3e0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1f3f0 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
1f400 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
1f410 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f420 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1f430 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1f440 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1f450 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
1f460 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1f470 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f480 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1f490 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
1f4a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f4b0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
1f4c0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
1f4d0 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
1f4e0 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
1f4f0 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
1f500 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
1f510 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1f520 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f530 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
1f540 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
1f550 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b   iPtrPage, &rc);
1f560 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1f570 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
1f580 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1f590 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
1f5a0 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
1f5b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
1f5c0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1f5d0 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
1f5e0 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
1f5f0 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
1f600 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
1f610 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
1f620 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
1f630 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
1f640 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
1f650 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
1f660 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
1f670 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
1f680 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63  o point in .** c
1f690 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1f6a0 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
1f6b0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
1f6c0 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
1f6d0 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74   .** occurs, ret
1f6e0 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  urn some other e
1f6f0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
1f700 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c   More specifical
1f710 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
1f720 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
1f730 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61  -organize the da
1f740 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68  tabase so .** th
1f750 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
1f760 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
1f770 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73  rently in use is
1f780 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
1f790 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  e..**.** Paramet
1f7a0 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e  er nFin is the n
1f7b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1f7c0 68 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73  hat this databas
1f7d0 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a  e would contain.
1f7e0 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e  ** were this fun
1f7f0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74  ction called unt
1f800 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  il it returns SQ
1f810 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
1f820 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20   If the bCommit 
1f830 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
1f840 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63  -zero, this func
1f850 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
1f860 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  t the .** caller
1f870 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
1f880 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
1f890 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74  p() until it ret
1f8a0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1f8b0 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72   .** or an error
1f8c0 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73  . bCommit is pas
1f8d0 73 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20  sed true for an 
1f8e0 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63  auto-vacuum-on-c
1f8f0 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74  ommit .** operat
1f900 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f  ion, or false fo
1f910 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  r an incremental
1f920 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74   vacuum..*/.stat
1f930 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
1f940 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
1f950 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20  pBt, Pgno nFin, 
1f960 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e  Pgno iLastPg, in
1f970 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67  t bCommit){.  Pg
1f980 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20  no nFreeList;   
1f990 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f9a0 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c  r of pages still
1f9b0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
1f9c0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t */.  int rc;..
1f9d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f9e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1f9f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1fa00 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46  sert( iLastPg>nF
1fa10 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54  in );..  if( !PT
1fa20 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1fa30 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
1fa40 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
1fa50 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1fa60 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
1fa70 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
1fa80 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
1fa90 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1faa0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1fab0 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
1fac0 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eeList==0 ){.   
1fad0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fae0 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
1faf0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1fb00 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
1fb10 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
1fb20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1fb30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fb40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1fb50 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
1fb60 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1fb70 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
1fb80 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1fb90 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
1fba0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1fbb0 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
1fbc0 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
1fbd0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1fbe0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
1fbf0 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ge from the file
1fc00 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  s free-list. Thi
1fc10 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
1fc20 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  d.        ** if 
1fc30 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a  bCommit is non-z
1fc40 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
1fc50 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
1fc60 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
1fc70 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
1fc80 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
1fc90 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1fca0 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
1fcb0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
1fcc0 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
1fcd0 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
1fce0 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
1fcf0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1fd00 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
1fd10 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
1fd20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
1fd30 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
1fd40 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
1fd50 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
1fd60 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c  , iLastPg, BTALL
1fd70 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20  OC_EXACT);.     
1fd80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fd90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1fda0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1fdb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1fdc0 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
1fdd0 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1fde0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1fdf0 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1fe00 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
1fe10 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1fe20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1fe30 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
1fe40 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
1fe50 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
1fe60 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
1fe70 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65  ;.      u8 eMode
1fe80 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20   = BTALLOC_ANY; 
1fe90 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65    /* Mode parame
1fea0 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
1feb0 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20  BtreePage() */. 
1fec0 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20       Pgno iNear 
1fed0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1fee0 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74  * nearby paramet
1fef0 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1ff00 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20  treePage() */.. 
1ff10 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
1ff20 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
1ff30 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
1ff40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1ff50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ff60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ff70 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1ff80 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73  /* If bCommit is
1ff90 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
1ffa0 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
1ffb0 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
1ffc0 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
1ffd0 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
1ffe0 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
1fff0 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
20000 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
20010 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
20020 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
20030 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72  if bCommit is gr
20040 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
20050 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
20060 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
20070 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
20080 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
20090 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
200a0 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
200b0 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
200c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
200d0 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
200e0 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
200f0 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20  = BTALLOC_LE;.  
20100 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46        iNear = nF
20110 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  in;.      }.    
20120 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
20130 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
20140 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
20150 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
20160 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
20170 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20  iFreePg, iNear, 
20180 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  eMode);.        
20190 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
201a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
201b0 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
201c0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
201d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
201e0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
201f0 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
20200 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
20210 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65  bCommit && iFree
20220 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
20230 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
20240 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
20250 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65    .      rc = re
20260 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
20270 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
20280 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
20290 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  g, bCommit);.   
202a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
202b0 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
202c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
202d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
202e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
202f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
20300 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
20310 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61    do {.      iLa
20320 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69  stPg--;.    }whi
20330 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
20340 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
20350 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53  Bt) || PTRMAP_IS
20360 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
20370 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62  g) );.    pBt->b
20380 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
20390 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
203a0 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
203b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
203c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
203d0 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
203e0 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  y the first argu
203f0 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d  ment is an auto-
20400 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a  vacuum database.
20410 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69  ** nOrig pages i
20420 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
20430 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67  g nFree free pag
20440 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65  es. Return the e
20450 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65  xpected .** size
20460 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20470 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77   in pages follow
20480 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ing an auto-vacu
20490 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  um operation..*/
204a0 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e  .static Pgno fin
204b0 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65  alDbSize(BtShare
204c0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72  d *pBt, Pgno nOr
204d0 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b  ig, Pgno nFree){
204e0 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20  .  int nEntry;  
204f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20500 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20510 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70  entries on one p
20520 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  trmap page */.  
20530 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20  Pgno nPtrmap;   
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20550 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72  /* Number of Ptr
20560 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20  Map pages to be 
20570 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  freed */.  Pgno 
20580 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nFin;           
20590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
205a0 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
205b0 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
205c0 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e  sableSize/5;.  n
205d0 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d  Ptrmap = (nFree-
205e0 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47  nOrig+PTRMAP_PAG
205f0 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b  ENO(pBt, nOrig)+
20600 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a  nEntry)/nEntry;.
20610 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
20620 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
20630 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45  ;.  if( nOrig>PE
20640 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
20650 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
20660 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
20670 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
20680 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  -;.  }.  while( 
20690 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
206a0 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
206b0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
206c0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
206d0 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72  nFin--;.  }..  r
206e0 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f  eturn nFin;.}../
206f0 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
20700 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
20710 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63   opened before c
20720 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
20730 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66  tion..** It perf
20740 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e  orms a single un
20750 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72  it of work towar
20760 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ds an incrementa
20770 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20  l vacuum..**.** 
20780 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  If the increment
20790 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e  al vacuum is fin
207a0 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73  ished after this
207b0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75   function has ru
207c0 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  n,.** SQLITE_DON
207d0 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  E is returned. I
207e0 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69  f it is not fini
207f0 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72  shed, but no err
20800 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20  or occurred,.** 
20810 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
20820 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
20830 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
20840 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73   code. .*/.int s
20850 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56  qlite3BtreeIncrV
20860 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
20870 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
20880 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
20890 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
208a0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
208b0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
208c0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
208d0 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e  S_WRITE && p->in
208e0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
208f0 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74  TE );.  if( !pBt
20900 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
20910 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20920 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DONE;.  }else{. 
20930 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20     Pgno nOrig = 
20940 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
20950 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  Bt);.    Pgno nF
20960 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
20970 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
20980 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e  ta[36]);.    Pgn
20990 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62  o nFin = finalDb
209a0 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
209b0 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66   nFree);..    if
209c0 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a  ( nOrig<nFin ){.
209d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
209e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
209f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
20a00 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
20a10 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
20a20 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
20a30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
20a40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20a50 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
20a60 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
20a70 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
20a80 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
20a90 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c  Bt, nFin, nOrig,
20aa0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
20ab0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20ac0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20ad0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20ae0 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
20af0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
20b00 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
20b10 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
20b20 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
20b30 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
20b40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
20b50 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
20b60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
20b70 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20b80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20b90 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
20ba0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
20bb0 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
20bc0 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
20bd0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
20be0 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f   is committed fo
20bf0 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
20c00 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
20c10 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
20c20 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
20c30 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20  *pnTrunc is set 
20c40 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
20c50 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61   pages.** the da
20c60 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
20c70 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  ld be truncated 
20c80 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  to during the co
20c90 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a  mmit process. .*
20ca0 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62  * i.e. the datab
20cb0 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f  ase has been reo
20cc0 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74  rganized so that
20cd0 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   only the first 
20ce0 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65  *pnTrunc.** page
20cf0 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f  s are in use..*/
20d00 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f  .static int auto
20d10 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53  VacuumCommit(BtS
20d20 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
20d30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20d40 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
20d50 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
20d60 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e  ;.  VVA_ONLY( in
20d70 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
20d80 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
20d90 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65  ager); )..  asse
20da0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
20db0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
20dc0 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61  x) );.  invalida
20dd0 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
20de0 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72  he(pBt);.  asser
20df0 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  t(pBt->autoVacuu
20e00 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  m);.  if( !pBt->
20e10 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20  incrVacuum ){.  
20e20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
20e30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20e40 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
20e50 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61  ase after autova
20e60 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50  cuuming */.    P
20e70 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20  gno nFree;      
20e80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
20e90 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
20ea0 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a  list initially *
20eb0 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65  /.    Pgno iFree
20ec0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
20ed0 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20  next page to be 
20ee0 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e  freed */.    Pgn
20ef0 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
20f00 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
20f10 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20   before freeing 
20f20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20  */..    nOrig = 
20f30 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
20f40 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52  Bt);.    if( PTR
20f50 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
20f60 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d  nOrig) || nOrig=
20f70 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
20f80 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
20f90 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
20fa0 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
20fb0 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20   a database for 
20fc0 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20  which the final 
20fd0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
20fe0 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
20ff0 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68  r-map page or th
21000 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
21010 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20  age. If one.    
21020 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
21030 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61  red, this indica
21040 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  tes corruption..
21050 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
21060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
21070 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
21080 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  ..    nFree = ge
21090 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
210a0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
210b0 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61  .    nFin = fina
210c0 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
210d0 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20  ig, nFree);.    
210e0 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29  if( nFin>nOrig )
210f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
21100 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
21110 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20   if( nFin<nOrig 
21120 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
21130 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
21140 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
21150 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72     for(iFree=nOr
21160 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26  ig; iFree>nFin &
21170 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
21180 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20   iFree--){.     
21190 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
211a0 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
211b0 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d  iFree, 1);.    }
211c0 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
211d0 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
211e0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
211f0 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
21200 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21210 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
21220 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
21230 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
21240 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
21250 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
21260 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
21270 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
21280 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
21290 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
212a0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46  1->aData[28], nF
212b0 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  in);.      pBt->
212c0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
212d0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
212e0 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a  e = nFin;.    }.
212f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21300 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
21310 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
21320 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
21330 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
21340 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50  ( nRef>=sqlite3P
21350 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
21360 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
21370 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a   rc;.}..#else /*
21380 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
21390 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
213a0 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68  /.# define setCh
213b0 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51  ildPtrmaps(x) SQ
213c0 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
213d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
213e0 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 2f  MIT_CONCURRENT./
213f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21400 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  on is called as 
21410 70 61 72 74 20 6f 66 20 6d 65 72 67 69 6e 67 20  part of merging 
21420 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72  an CONCURRENT tr
21430 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 0a 2a  ansaction with.*
21440 2a 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 61  * the snapshot a
21450 74 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  t the head of th
21460 65 20 77 61 6c 20 66 69 6c 65 2e 20 49 74 20 72  e wal file. It r
21470 65 6c 6f 63 61 74 65 73 20 61 6c 6c 20 70 61 67  elocates all pag
21480 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 72 61 6e  es in the.** ran
21490 67 65 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74  ge iFirst..iLast
214a0 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 49 74 20  , inclusive. It 
214b0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
214c0 74 68 65 20 42 74 72 65 65 50 74 72 6d 61 70 20  the BtreePtrmap 
214d0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61 74  .** structure at
214e0 20 42 74 53 68 61 72 65 64 2e 70 4d 61 70 20 63   BtShared.pMap c
214f0 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 63 61  ontains the loca
21500 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 6f 69 6e  tion of the poin
21510 74 65 72 73 20 74 6f 20 65 61 63 68 0a 2a 2a 20  ters to each.** 
21520 70 61 67 65 20 69 6e 20 74 68 65 20 72 61 6e 67  page in the rang
21530 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e 43 75  e..**.** If pnCu
21540 72 72 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  rrent is NULL, t
21550 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 69 6e  hen all pages in
21560 20 74 68 65 20 72 61 6e 67 65 20 61 72 65 20 6d   the range are m
21570 6f 76 65 64 20 74 6f 20 63 75 72 72 65 6e 74 6c  oved to currentl
21580 79 0a 2a 2a 20 66 72 65 65 20 6c 6f 63 61 74 69  y.** free locati
21590 6f 6e 73 20 28 69 2e 65 2e 20 66 72 65 65 2d 6c  ons (i.e. free-l
215a0 69 73 74 20 65 6e 74 72 69 65 73 29 20 77 69 74  ist entries) wit
215b0 68 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hin the database
215c0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 70 61 67   file before pag
215d0 65 0a 2a 2a 20 69 46 69 72 73 74 2e 0a 2a 2a 0a  e.** iFirst..**.
215e0 2a 2a 20 4f 72 2c 20 69 66 20 70 6e 43 75 72 72  ** Or, if pnCurr
215f0 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ent is not NULL,
21600 20 74 68 65 6e 20 69 74 20 70 6f 69 6e 74 73 20   then it points 
21610 74 6f 20 61 20 76 61 6c 75 65 20 63 6f 6e 74 61  to a value conta
21620 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 63 75 72  ining the.** cur
21630 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
21640 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
21650 6e 20 70 61 67 65 73 2e 20 49 6e 20 74 68 69 73  n pages. In this
21660 20 63 61 73 65 2c 20 61 6c 6c 20 70 61 67 65 73   case, all pages
21670 20 61 72 65 0a 2a 2a 20 72 65 6c 6f 63 61 74 65   are.** relocate
21680 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  d to the end of 
21690 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
216a0 65 20 2d 20 70 61 67 65 20 69 46 69 72 73 74 20  e - page iFirst 
216b0 69 73 20 72 65 6c 6f 63 61 74 65 64 20 74 6f 0a  is relocated to.
216c0 2a 2a 20 70 61 67 65 20 28 2a 70 6e 43 75 72 72  ** page (*pnCurr
216d0 65 6e 74 2b 31 29 2c 20 70 61 67 65 20 69 46 69  ent+1), page iFi
216e0 72 73 74 2b 31 20 74 6f 20 70 61 67 65 20 28 2a  rst+1 to page (*
216f0 70 6e 43 75 72 72 65 6e 74 2b 32 29 2c 20 61 6e  pnCurrent+2), an
21700 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 20 56 61 6c 75  d so on..** Valu
21710 65 20 2a 70 6e 43 75 72 72 65 6e 74 20 69 73 20  e *pnCurrent is 
21720 73 65 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73  set to the new s
21730 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
21740 61 73 65 20 62 65 66 6f 72 65 20 74 68 69 73 20  ase before this 
21750 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
21760 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  urns..**.** If n
21770 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
21780 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
21790 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
217a0 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
217b0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
217c0 63 20 69 6e 74 20 62 74 72 65 65 52 65 6c 6f 63  c int btreeReloc
217d0 61 74 65 52 61 6e 67 65 28 0a 20 20 42 74 53 68  ateRange(.  BtSh
217e0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
217f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
21800 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  -tree handle */.
21810 20 20 50 67 6e 6f 20 69 46 69 72 73 74 2c 20 20    Pgno iFirst,  
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21830 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
21840 74 6f 20 72 65 6c 6f 63 61 74 65 20 2a 2f 0a 20  to relocate */. 
21850 20 50 67 6e 6f 20 69 4c 61 73 74 2c 20 20 20 20   Pgno iLast,    
21860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21870 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 74 6f   /* Last page to
21880 20 72 65 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 50   relocate */.  P
21890 67 6e 6f 20 2a 70 6e 43 75 72 72 65 6e 74 20 20  gno *pnCurrent  
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
218b0 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 49  * If not NULL, I
218c0 4e 2f 4f 55 54 3a 20 44 61 74 61 62 61 73 65 20  N/OUT: Database 
218d0 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  size */.){.  int
218e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
218f0 0a 20 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a  .  BtreePtrmap *
21900 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d 61 70  pMap = pBt->pMap
21910 3b 0a 20 20 50 67 6e 6f 20 69 50 67 3b 0a 0a 20  ;.  Pgno iPg;.. 
21920 20 66 6f 72 28 69 50 67 3d 69 46 69 72 73 74 3b   for(iPg=iFirst;
21930 20 69 50 67 3c 3d 69 4c 61 73 74 20 26 26 20 72   iPg<=iLast && r
21940 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 50  c==SQLITE_OK; iP
21950 67 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  g++){.    MemPag
21960 65 20 2a 70 46 72 65 65 20 3d 20 30 3b 20 20 20  e *pFree = 0;   
21970 20 20 2f 2a 20 50 61 67 65 20 61 6c 6c 6f 63 61    /* Page alloca
21980 74 65 64 20 66 72 6f 6d 20 66 72 65 65 2d 6c 69  ted from free-li
21990 73 74 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  st */.    MemPag
219a0 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
219b0 50 67 6e 6f 20 69 4e 65 77 3b 20 20 20 20 20 20  Pgno iNew;      
219c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70          /* New p
219d0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
219e0 50 67 20 2a 2f 0a 20 20 20 20 50 74 72 6d 61 70  Pg */.    Ptrmap
219f0 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 3b 20 20  Entry *pEntry;  
21a00 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
21a10 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
21a20 69 50 67 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  iPg */..    if( 
21a30 69 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  iPg==PENDING_BYT
21a40 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 63 6f  E_PAGE(pBt) ) co
21a50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 6e 74  ntinue;.    pEnt
21a60 72 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72  ry = &pMap->aPtr
21a70 5b 69 50 67 20 2d 20 70 4d 61 70 2d 3e 69 46 69  [iPg - pMap->iFi
21a80 72 73 74 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70  rst];..    if( p
21a90 45 6e 74 72 79 2d 3e 65 54 79 70 65 3d 3d 50 54  Entry->eType==PT
21aa0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
21ab0 0a 20 20 20 20 20 20 50 67 6e 6f 20 64 75 6d 6d  .      Pgno dumm
21ac0 79 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  y;.      rc = al
21ad0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
21ae0 70 42 74 2c 20 26 70 46 72 65 65 2c 20 26 64 75  pBt, &pFree, &du
21af0 6d 6d 79 2c 20 69 50 67 2c 20 42 54 41 4c 4c 4f  mmy, iPg, BTALLO
21b00 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20  C_EXACT);.      
21b10 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
21b20 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
21b30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21b40 7c 7c 20 64 75 6d 6d 79 3d 3d 69 50 67 20 29 3b  || dummy==iPg );
21b50 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
21b60 6e 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20  nCurrent ){.    
21b70 20 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70    btreeGetPage(p
21b80 42 74 2c 20 69 50 67 2c 20 26 70 50 67 2c 20 30  Bt, iPg, &pPg, 0
21b90 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21ba0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
21bb0 72 69 74 65 61 62 6c 65 28 70 50 67 2d 3e 70 44  riteable(pPg->pD
21bc0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
21bd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
21be0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
21bf0 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3d 3d  (pPg->pDbPage)==
21c00 31 20 29 3b 0a 20 20 20 20 20 20 69 4e 65 77 20  1 );.      iNew 
21c10 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65 6e 74 29  = ++(*pnCurrent)
21c20 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4e 65 77  ;.      if( iNew
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 29 20 69 4e 65 77 20  AGE(pBt) ) iNew 
21c50 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65 6e 74 29  = ++(*pnCurrent)
21c60 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c  ;.      rc = rel
21c70 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
21c80 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65 54 79 70  Pg, pEntry->eTyp
21c90 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e  e, pEntry->paren
21ca0 74 2c 20 69 4e 65 77 2c 20 31 29 3b 0a 20 20 20  t, iNew, 1);.   
21cb0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f     releasePageNo
21cc0 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20  tNull(pPg);.    
21cd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
21ce0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
21cf0 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 2c  age(pBt, &pFree,
21d00 20 26 69 4e 65 77 2c 20 69 46 69 72 73 74 2d 31   &iNew, iFirst-1
21d10 2c 20 42 54 41 4c 4c 4f 43 5f 4c 45 29 3b 0a 20  , BTALLOC_LE);. 
21d20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
21d30 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 4e  =SQLITE_OK || iN
21d40 65 77 3c 69 46 69 72 73 74 20 29 3b 0a 20 20 20  ew<iFirst );.   
21d50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21d60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21d70 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
21d80 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
21d90 65 50 61 67 65 28 70 46 72 65 65 29 3b 0a 20 20  ePage(pFree);.  
21da0 20 20 20 20 20 20 62 74 72 65 65 47 65 74 50 61        btreeGetPa
21db0 67 65 28 70 42 74 2c 20 69 50 67 2c 20 26 70 50  ge(pBt, iPg, &pP
21dc0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  g, 0);.        r
21dd0 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
21de0 28 70 42 74 2c 20 70 50 67 2c 20 70 45 6e 74 72  (pBt, pPg, pEntr
21df0 79 2d 3e 65 54 79 70 65 2c 20 70 45 6e 74 72 79  y->eType, pEntry
21e00 2d 3e 70 61 72 65 6e 74 2c 69 4e 65 77 2c 31 29  ->parent,iNew,1)
21e10 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
21e20 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
21e30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
21e40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21e50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
21e60 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
21e70 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 2d 74 72  ).**.** The b-tr
21e80 65 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  ee handle passed
21e90 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
21ea0 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74  ument is about t
21eb0 6f 20 63 6f 6d 6d 69 74 20 61 6e 0a 2a 2a 20 43  o commit an.** C
21ec0 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61  ONCURRENT transa
21ed0 63 74 69 6f 6e 2e 20 41 74 20 74 68 69 73 20 70  ction. At this p
21ee0 6f 69 6e 74 20 69 74 20 69 73 20 67 75 61 72 61  oint it is guara
21ef0 6e 74 65 65 64 20 74 68 61 74 20 74 68 69 73 20  nteed that this 
21f00 69 73 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20  is .** possible 
21f10 2d 20 74 68 65 20 77 61 6c 20 57 52 49 54 45 52  - the wal WRITER
21f20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 61 6e   lock is held an
21f30 64 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 68  d it is known th
21f40 61 74 20 74 68 65 72 65 20 61 72 65 20 0a 2a 2a  at there are .**
21f50 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 73 20 77 69   no conflicts wi
21f60 74 68 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61  th committed tra
21f70 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  nsactions..*/.st
21f80 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 46 69  atic int btreeFi
21f90 78 55 6e 6c 6f 63 6b 65 64 28 42 74 72 65 65 20  xUnlocked(Btree 
21fa0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
21fb0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
21fc0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
21fd0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
21fe0 20 20 75 38 20 2a 70 31 20 3d 20 70 50 61 67 65    u8 *p1 = pPage
21ff0 31 2d 3e 61 44 61 74 61 3b 0a 20 20 50 61 67 65  1->aData;.  Page
22000 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
22010 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
22020 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
22030 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 6f    /* If page 1 o
22040 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
22050 73 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20  s not writable, 
22060 74 68 65 6e 20 6e 6f 20 70 61 67 65 73 20 77 65  then no pages we
22070 72 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a  re allocated.  *
22080 2a 20 6f 72 20 66 72 65 65 64 20 62 79 20 74 68  * or freed by th
22090 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
220a0 49 6e 20 74 68 69 73 20 63 61 73 65 20 6e 6f 20  In this case no 
220b0 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
220c0 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72   is .  ** requir
220d0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
220e0 66 20 70 61 67 65 20 31 20 69 73 20 64 69 72 74  f page 1 is dirt
220f0 79 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a  y, proceed.  */.
22100 20 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70    BtreePtrmap *p
22110 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b  Map = pBt->pMap;
22120 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
22130 20 67 65 74 34 62 79 74 65 28 26 70 31 5b 33 32   get4byte(&p1[32
22140 5d 29 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  ]);.  Pgno nPage
22150 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
22160 74 28 70 42 74 29 3b 0a 20 20 75 33 32 20 6e 46  t(pBt);.  u32 nF
22170 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
22180 70 31 5b 33 36 5d 29 3b 0a 0a 20 20 62 74 72 65  p1[36]);..  btre
22190 65 43 68 65 63 6b 50 74 72 6d 61 70 28 70 42 74  eCheckPtrmap(pBt
221a0 2c 20 6e 50 61 67 65 2c 20 22 62 74 72 65 65 46  , nPage, "btreeF
221b0 69 78 55 6e 6c 6f 63 6b 65 64 28 31 29 22 29 3b  ixUnlocked(1)");
221c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
221d0 3e 70 4d 61 70 20 29 3b 0a 20 20 72 63 20 3d 20  >pMap );.  rc = 
221e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 70 67 72  sqlite3PagerUpgr
221f0 61 64 65 53 6e 61 70 73 68 6f 74 28 70 50 61 67  adeSnapshot(pPag
22200 65 72 2c 20 70 50 61 67 65 31 2d 3e 70 44 62 50  er, pPage1->pDbP
22210 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  age);.  assert( 
22220 70 31 3d 3d 70 50 61 67 65 31 2d 3e 61 44 61 74  p1==pPage1->aDat
22230 61 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  a );..  if( rc==
22240 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22250 20 50 67 6e 6f 20 6e 48 50 61 67 65 20 3d 20 67   Pgno nHPage = g
22260 65 74 34 62 79 74 65 28 26 70 31 5b 32 38 5d 29  et4byte(&p1[28])
22270 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20  ;.    Pgno nFin 
22280 3d 20 6e 48 50 61 67 65 3b 20 20 20 20 20 20 20  = nHPage;       
22290 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20    /* Size of db 
222a0 61 66 74 65 72 20 74 72 61 6e 73 61 63 74 69 6f  after transactio
222b0 6e 20 6d 65 72 67 65 20 2a 2f 0a 0a 20 20 20 20  n merge */..    
222c0 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
222d0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
222e0 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 7b 0a  e1->pDbPage) ){.
222f0 20 20 20 20 20 20 50 67 6e 6f 20 69 48 54 72 75        Pgno iHTru
22300 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
22310 31 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 75 33  1[32]);.      u3
22320 32 20 6e 48 46 72 65 65 20 3d 20 67 65 74 34 62  2 nHFree = get4b
22330 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a 20  yte(&p1[36]);.. 
22340 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
22350 68 65 20 68 65 61 64 20 64 61 74 61 62 61 73 65  he head database
22360 20 66 72 65 65 20 6c 69 73 74 20 74 6f 20 74 68   free list to th
22370 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 75 72  e end of the cur
22380 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 72  rent.      ** tr
22390 61 6e 73 61 63 74 69 6f 6e 73 20 66 72 65 65 2d  ansactions free-
223a0 6c 69 73 74 20 28 69 66 20 61 6e 79 29 2e 20 20  list (if any).  
223b0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  */.      if( iTr
223c0 75 6e 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  unk!=0 ){.      
223d0 20 20 70 75 74 34 62 79 74 65 28 26 70 31 5b 33    put4byte(&p1[3
223e0 36 5d 2c 20 6e 48 46 72 65 65 20 2b 20 6e 46 72  6], nHFree + nFr
223f0 65 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ee);.        put
22400 34 62 79 74 65 28 26 70 31 5b 33 32 5d 2c 20 69  4byte(&p1[32], i
22410 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
22420 77 68 69 6c 65 28 20 69 54 72 75 6e 6b 20 29 7b  while( iTrunk ){
22430 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67  .          DbPag
22440 65 20 2a 70 54 72 75 6e 6b 20 3d 20 73 71 6c 69  e *pTrunk = sqli
22450 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
22460 50 61 67 65 72 2c 20 69 54 72 75 6e 6b 29 3b 0a  Pager, iTrunk);.
22470 20 20 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b            iTrunk
22480 20 3d 20 67 65 74 34 62 79 74 65 28 28 75 38 2a   = get4byte((u8*
22490 29 70 54 72 75 6e 6b 2d 3e 70 44 61 74 61 29 3b  )pTrunk->pData);
224a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
224b0 54 72 75 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  Trunk==0 ){.    
224c0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
224d0 28 28 75 38 2a 29 70 54 72 75 6e 6b 2d 3e 70 44  ((u8*)pTrunk->pD
224e0 61 74 61 2c 20 69 48 54 72 75 6e 6b 29 3b 0a 20  ata, iHTrunk);. 
224f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22500 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
22510 72 55 6e 72 65 66 28 70 54 72 75 6e 6b 29 3b 0a  rUnref(pTrunk);.
22520 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20          };.     
22530 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 48   }..      if( nH
22540 50 61 67 65 3c 28 70 4d 61 70 2d 3e 69 46 69 72  Page<(pMap->iFir
22550 73 74 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  st-1) ){.       
22560 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
22570 20 63 6f 6e 73 69 73 74 65 64 20 6f 66 20 28 70   consisted of (p
22580 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31 29 20 70  Map->iFirst-1) p
22590 61 67 65 73 20 77 68 65 6e 20 74 68 65 20 63 75  ages when the cu
225a0 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  rrent.        **
225b0 20 63 6f 6e 63 75 72 72 65 6e 74 20 74 72 61 6e   concurrent tran
225c0 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
225d0 65 64 2e 20 41 6e 64 20 61 6e 20 63 6f 6e 63 75  ed. And an concu
225e0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
225f0 6e 20 6d 61 79 0a 20 20 20 20 20 20 20 20 2a 2a  n may.        **
22600 20 6e 6f 74 20 62 65 20 65 78 65 63 75 74 65 64   not be executed
22610 20 6f 6e 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   on an auto-vacu
22620 75 6d 20 64 61 74 61 62 61 73 65 20 2d 20 73 6f  um database - so
22630 20 74 68 65 20 64 62 20 73 68 6f 75 6c 64 20 0a   the db should .
22640 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 68          ** not h
22650 61 76 65 20 73 68 72 75 6e 6b 20 73 69 6e 63 65  ave shrunk since
22660 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
22670 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 54 68 65   was opened. The
22680 72 65 66 6f 72 65 20 6e 48 50 61 67 65 0a 20 20  refore nHPage.  
22690 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20        ** should 
226a0 62 65 20 73 65 74 20 74 6f 20 28 70 4d 61 70 2d  be set to (pMap-
226b0 3e 69 46 69 72 73 74 2d 31 29 20 6f 72 20 67 72  >iFirst-1) or gr
226c0 65 61 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  eater. */.      
226d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
226e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
226f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22700 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
22710 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c 6c 6f  transaction allo
22720 63 61 74 65 64 20 70 61 67 65 73 20 70 4d 61 70  cated pages pMap
22730 2d 3e 69 46 69 72 73 74 20 74 68 72 6f 75 67 68  ->iFirst through
22740 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 50 61 67  .        ** nPag
22750 65 20 28 69 6e 63 6c 75 73 69 76 65 29 20 61 74  e (inclusive) at
22760 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
22770 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4d  database file. M
22780 65 61 6e 77 68 69 6c 65 2c 0a 20 20 20 20 20 20  eanwhile,.      
22790 20 20 2a 2a 20 6f 74 68 65 72 20 74 72 61 6e 73    ** other trans
227a0 61 63 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 6c  actions have all
227b0 6f 63 61 74 65 64 20 28 69 46 69 72 73 74 2e 2e  ocated (iFirst..
227c0 6e 48 50 61 67 65 29 2e 20 53 6f 20 6d 6f 76 65  nHPage). So move
227d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
227e0 73 20 28 69 46 69 72 73 74 2e 2e 4d 49 4e 28 6e  s (iFirst..MIN(n
227f0 50 61 67 65 2c 6e 48 50 61 67 65 29 29 20 74 6f  Page,nHPage)) to
22800 20 28 4d 41 58 28 6e 50 61 67 65 2c 6e 48 50 61   (MAX(nPage,nHPa
22810 67 65 29 2b 31 29 2e 20 20 2a 2f 0a 20 20 20 20  ge)+1).  */.    
22820 20 20 20 20 50 67 6e 6f 20 69 4c 61 73 74 20 3d      Pgno iLast =
22830 20 4d 49 4e 28 6e 50 61 67 65 2c 20 6e 48 50 61   MIN(nPage, nHPa
22840 67 65 29 3b 20 20 20 20 2f 2a 20 4c 61 73 74 20  ge);    /* Last 
22850 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
22860 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 43 75          Pgno nCu
22870 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  rrent;          
22880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
22890 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 64  urrent size of d
228a0 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 75  b */.        nCu
228b0 72 72 65 6e 74 20 3d 20 4d 41 58 28 6e 50 61 67  rrent = MAX(nPag
228c0 65 2c 20 6e 48 50 61 67 65 29 3b 0a 20 20 20 20  e, nHPage);.    
228d0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 52 65      rc = btreeRe
228e0 6c 6f 63 61 74 65 52 61 6e 67 65 28 70 42 74 2c  locateRange(pBt,
228f0 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 2c 20 69   pMap->iFirst, i
22900 4c 61 73 74 2c 20 26 6e 43 75 72 72 65 6e 74 29  Last, &nCurrent)
22910 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
22920 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20 63  ere are now no c
22930 6f 6c 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 74  ollisions with t
22940 68 65 20 73 6e 61 70 73 68 6f 74 20 61 74 20 74  he snapshot at t
22950 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 0a 20  he head of the. 
22960 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
22970 73 65 20 66 69 6c 65 2e 20 53 6f 20 61 74 20 74  se file. So at t
22980 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75  his point it wou
22990 6c 64 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ld be possible t
229a0 6f 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 20  o write.        
229b0 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
229c0 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20  on out to disk. 
229d0 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 73 6f 20  Before doing so 
229e0 74 68 6f 75 67 68 2c 20 61 74 74 65 6d 70 74 20  though, attempt 
229f0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  to.        ** re
22a00 6c 6f 63 61 74 65 20 73 6f 6d 65 20 6f 66 20 74  locate some of t
22a10 68 65 20 6e 65 77 20 70 61 67 65 73 20 74 6f 20  he new pages to 
22a20 66 72 65 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77  free locations w
22a30 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79 0a 20  ithin the body. 
22a40 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
22a50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
22a60 69 2e 65 2e 20 66 72 65 65 2d 6c 69 73 74 20 65  i.e. free-list e
22a70 6e 74 72 69 65 73 29 2e 20 2a 2f 0a 20 20 20 20  ntries). */.    
22a80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22a90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22aa0 20 20 20 61 73 73 65 72 74 28 20 6e 43 75 72 72     assert( nCurr
22ab0 65 6e 74 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ent!=PENDING_BYT
22ac0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
22ad0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22ae0 50 61 67 65 72 53 65 74 44 62 73 69 7a 65 28 70  PagerSetDbsize(p
22af0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 43 75 72  Bt->pPager, nCur
22b00 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  rent);.         
22b10 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
22b20 65 28 26 70 31 5b 33 36 5d 29 3b 0a 20 20 20 20  e(&p1[36]);.    
22b30 20 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e 43 75        nFin = nCu
22b40 72 72 65 6e 74 2d 6e 46 72 65 65 3b 0a 20 20 20  rrent-nFree;.   
22b50 20 20 20 20 20 20 20 69 66 28 20 6e 43 75 72 72         if( nCurr
22b60 65 6e 74 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  ent>PENDING_BYTE
22b70 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
22b80 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in<=PENDING_BYTE
22b90 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
22ba0 20 20 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d            nFin--
22bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
22bc0 20 20 20 20 20 20 20 20 6e 46 69 6e 20 3d 20 4d          nFin = M
22bd0 41 58 28 6e 46 69 6e 2c 20 6e 48 50 61 67 65 29  AX(nFin, nHPage)
22be0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
22bf0 20 62 74 72 65 65 52 65 6c 6f 63 61 74 65 52 61   btreeRelocateRa
22c00 6e 67 65 28 70 42 74 2c 20 6e 46 69 6e 2b 31 2c  nge(pBt, nFin+1,
22c10 20 6e 43 75 72 72 65 6e 74 2c 20 30 29 3b 0a 20   nCurrent, 0);. 
22c20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
22c30 20 20 70 75 74 34 62 79 74 65 28 26 70 31 5b 32    put4byte(&p1[2
22c40 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20  8], nFin);.     
22c50 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
22c60 69 74 65 33 50 61 67 65 72 53 65 74 44 62 73 69  ite3PagerSetDbsi
22c70 7a 65 28 70 50 61 67 65 72 2c 20 6e 46 69 6e 29  ze(pPager, nFin)
22c80 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
22c90 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  rc;.}.#else.# de
22ca0 66 69 6e 65 20 62 74 72 65 65 46 69 78 55 6e 6c  fine btreeFixUnl
22cb0 6f 63 6b 65 64 28 58 29 20 20 53 51 4c 49 54 45  ocked(X)  SQLITE
22cc0 5f 4f 4b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  _OK.#endif /* SQ
22cd0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
22ce0 52 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  RENT */../*.** T
22cf0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
22d00 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
22d10 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20   of a two-phase 
22d20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f  commit.  This ro
22d30 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20  utine.** causes 
22d40 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
22d50 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  al to be created
22d60 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74   (if it does not
22d70 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a   already exist).
22d80 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ** and populated
22d90 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66   with enough inf
22da0 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74  ormation so that
22db0 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73   if a power loss
22dc0 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64   occurs.** the d
22dd0 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72  atabase can be r
22de0 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
22df0 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79  riginal state by
22e00 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a   playing back.**
22e10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54   the journal.  T
22e20 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hen the contents
22e30 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
22e40 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20  are flushed out 
22e50 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20  to.** the disk. 
22e60 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
22e70 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20  al is safely on 
22e80 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67  oxide, the chang
22e90 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74  es to the.** dat
22ea0 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65  abase are writte
22eb0 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  n into the datab
22ec0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75  ase file and flu
22ed0 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a  shed to oxide..*
22ee0 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
22ef0 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72  this call, the r
22f00 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
22f10 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20  still exists on 
22f20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
22f30 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c  we are still hol
22f40 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20  ding all locks, 
22f50 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  so the transacti
22f60 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f  on has not.** co
22f70 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71  mmitted.  See sq
22f80 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
22f90 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74  PhaseTwo() for t
22fa0 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
22fb0 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74  of the.** commit
22fc0 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
22fd0 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  This call is a n
22fe0 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65  o-op if no write
22ff0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
23000 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
23010 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f   on pBt..**.** O
23020 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74  therwise, sync t
23030 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23040 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70   for the btree p
23050 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  Bt. zMaster poin
23060 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d  ts to.** the nam
23070 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
23080 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
23090 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
230a0 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e  n into the.** in
230b0 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
230c0 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c   file, or is NUL
230d0 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f  L, indicating no
230e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
230f0 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65  file .** (single
23100 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
23110 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68  ction)..**.** Wh
23120 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
23130 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  d, the master jo
23140 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72  urnal should alr
23150 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a  eady have been.*
23160 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c  * created, popul
23170 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a  ated with this j
23180 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
23190 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  nd synced to dis
231a0 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  k..**.** Once th
231b0 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61  is is routine ha
231c0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
231d0 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69  only thing requi
231e0 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a  red to commit.**
231f0 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
23200 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  action for this 
23210 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
23220 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
23230 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ournal..*/.int s
23240 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
23250 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20  tPhaseOne(Btree 
23260 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
23270 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
23280 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23290 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
232a0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
232b0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
232c0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
232d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
232e0 65 72 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20  er(p);..#ifndef 
232f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
23300 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
23310 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
23320 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23330 49 53 43 4f 4e 43 55 52 52 45 4e 54 3d 3d 30 20  ISCONCURRENT==0 
23340 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  );.      rc = au
23350 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
23360 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
23370 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
23390 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
233a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
233b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
233c0 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54     if( pBt->bDoT
233d0 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
233e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
233f0 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
23400 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61  pPager, pBt->nPa
23410 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ge);.    }.#endi
23420 66 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  f.    if( rc==SQ
23430 4c 49 54 45 5f 4f 4b 20 26 26 20 49 53 43 4f 4e  LITE_OK && ISCON
23440 43 55 52 52 45 4e 54 20 29 7b 0a 20 20 20 20 20  CURRENT ){.     
23450 20 72 63 20 3d 20 62 74 72 65 65 46 69 78 55 6e   rc = btreeFixUn
23460 6c 6f 63 6b 65 64 28 70 29 3b 0a 20 20 20 20 7d  locked(p);.    }
23470 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23480 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23490 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
234a0 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
234b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
234c0 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ster, 0);.    }.
234d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
234e0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
234f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23500 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23510 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
23520 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
23530 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
23540 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
23550 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
23560 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
23570 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
23580 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
23590 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
235a0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
235b0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
235c0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
235d0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
235e0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
235f0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69  sMutex(p) );..#i
23600 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23610 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70  T_AUTOVACUUM.  p
23620 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
23630 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 0;.#endif.  if
23640 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
23650 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e  NS_NONE && db->n
23660 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20  VdbeRead>1 ){.  
23670 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
23680 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
23690 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
236a0 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
236b0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
236c0 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
236d0 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
236e0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
236f0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
23700 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
23710 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
23720 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
23730 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
23740 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
23750 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
23760 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
23770 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
23780 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
23790 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
237a0 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
237b0 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
237c0 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
237d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
237e0 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
237f0 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
23800 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
23810 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
23820 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
23830 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
23840 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
23850 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
23860 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
23870 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
23880 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
23890 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
238a0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
238b0 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
238c0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
238d0 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
238e0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
238f0 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
23900 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
23910 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
23920 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
23930 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
23940 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
23950 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
23960 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
23970 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
23980 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
23990 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
239a0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
239b0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
239c0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
239d0 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
239e0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
239f0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
23a00 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
23a10 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
23a20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
23a30 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61  n CONCURRENT tra
23a40 6e 73 61 63 74 69 6f 6e 2c 20 64 65 6c 65 74 65  nsaction, delete
23a50 20 74 68 65 20 70 42 74 2d 3e 70 4d 61 70 20 6f   the pBt->pMap o
23a60 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 41 6c 73 6f  bject..  ** Also
23a70 20 63 61 6c 6c 20 50 61 67 65 72 45 6e 64 43 6f   call PagerEndCo
23a80 6e 63 75 72 72 65 6e 74 28 29 20 74 6f 20 65 6e  ncurrent() to en
23a90 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
23aa0 67 65 72 20 68 61 73 20 64 69 73 63 61 72 64 65  ger has discarde
23ab0 64 0a 20 20 2a 2a 20 74 68 65 20 72 65 63 6f 72  d.  ** the recor
23ac0 64 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 72  d of all pages r
23ad0 65 61 64 20 77 69 74 68 69 6e 20 74 68 65 20 74  ead within the t
23ae0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a  ransaction.  */.
23af0 20 20 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c    btreePtrmapDel
23b00 65 74 65 28 70 42 74 29 3b 0a 20 20 73 71 6c 69  ete(pBt);.  sqli
23b10 74 65 33 50 61 67 65 72 45 6e 64 43 6f 6e 63 75  te3PagerEndConcu
23b20 72 72 65 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  rrent(pBt->pPage
23b30 72 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  r);.  btreeInteg
23b40 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rity(p);.}../*.*
23b50 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
23b60 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
23b70 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
23b80 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
23b90 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ne implements th
23ba0 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
23bb0 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d  f a 2-phase comm
23bc0 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69  it.  The.** sqli
23bd0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
23be0 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65  aseOne() routine
23bf0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
23c00 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64  phase and should
23c10 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70  .** be invoked p
23c20 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
23c30 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54  this routine.  T
23c40 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
23c50 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a  ommitPhaseOne().
23c60 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61  ** routine did a
23c70 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
23c80 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
23c90 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
23ca0 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
23cb0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
23cc0 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
23cd0 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
23ce0 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
23cf0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
23d00 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
23d10 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
23d20 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61   or zero the hea
23d30 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68  der in the.** th
23d40 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
23d50 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73  al (which causes
23d60 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
23d70 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a   to commit) and.
23d80 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  ** drop locks..*
23d90 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
23da0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
23db0 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  s while the page
23dc0 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d  r layer is attem
23dd0 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e  pting to .** fin
23de0 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c  alize the underl
23df0 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ying journal fil
23e00 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
23e10 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
23e20 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70  r and.** the upp
23e30 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74  er layer will at
23e40 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b  tempt a rollback
23e50 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
23e60 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
23e70 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  t.** is non-zero
23e80 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65   then this b-tre
23e90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
23ea0 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
23eb0 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61  -file .** transa
23ec0 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63  ction. In this c
23ed0 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ase, the transac
23ee0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
23ef0 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
23f00 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67  .** (by deleting
23f10 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
23f20 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
23f30 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f  caller will igno
23f40 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
23f50 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64  tions return cod
23f60 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61  e. So, even if a
23f70 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
23f80 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  n the pager laye
23f90 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  r,.** reset the 
23fa0 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69  b-tree objects i
23fb0 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f  nternal state to
23fc0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
23fd0 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e  he write.** tran
23fe0 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
23ff0 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73   closed. This is
24000 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20   quite safe, as 
24010 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68  the pager will h
24020 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ave.** transitio
24030 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ned to the error
24040 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   state..**.** Th
24050 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
24060 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
24070 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
24080 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
24090 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
240a0 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
240b0 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
240c0 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
240d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
240e0 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
240f0 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75   *p, int bCleanu
24100 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p){..  if( p->in
24110 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
24120 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  E ) return SQLIT
24130 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42  E_OK;.  sqlite3B
24140 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
24150 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
24160 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
24170 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
24180 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
24190 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
241a0 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
241b0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
241c0 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
241d0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
241e0 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
241f0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
24200 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
24210 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
24220 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
24230 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
24240 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
24250 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
24260 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
24270 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
24280 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
24290 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
242a0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
242b0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
242c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
242d0 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29  && bCleanup==0 )
242e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
242f0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
24300 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24310 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74     }.    p->iDat
24320 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20  aVersion--;  /* 
24330 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70  Compensate for p
24340 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
24350 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42  ion++; */.    pB
24360 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
24370 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
24380 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73     btreeClearHas
24390 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
243a0 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
243b0 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
243c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
243d0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
243e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
243f0 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
24400 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
24410 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
24420 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
24430 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
24440 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
24450 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
24460 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
24470 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
24480 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24490 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
244a0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
244b0 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a  PhaseTwo(p, 0);.
244c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
244d0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
244e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
244f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
24500 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f  ets the state to
24510 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e   CURSOR_FAULT an
24520 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63  d the error.** c
24530 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66  ode to errCode f
24540 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  or every cursor 
24550 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64 20  on any BtShared 
24560 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72  that pBtree.** r
24570 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69  eferences.  Or i
24580 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20  f the writeOnly 
24590 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31  flag is set to 1
245a0 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74  , then only.** t
245b0 72 69 70 20 77 72 69 74 65 20 63 75 72 73 6f 72  rip write cursor
245c0 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64  s and leave read
245d0 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67   cursors unchang
245e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  ed..**.** Every 
245f0 63 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64  cursor is a cand
24600 69 64 61 74 65 20 74 6f 20 62 65 20 74 72 69 70  idate to be trip
24610 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63  ped, including c
24620 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62  ursors.** that b
24630 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64  elong to other d
24640 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
24650 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20  ons that happen 
24660 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67  to be.** sharing
24670 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20   the cache with 
24680 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pBtree..**.** Th
24690 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
246a0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f  called when a ro
246b0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49  llback occurs. I
246c0 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a  f the writeOnly.
246d0 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  ** flag is true,
246e0 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65   then only write
246f0 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65  -cursors need be
24700 20 74 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d   tripped - read-
24710 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20  only.** cursors 
24720 73 61 76 65 20 74 68 65 69 72 20 63 75 72 72 65  save their curre
24730 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20  nt positions so 
24740 74 68 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f  that they may co
24750 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  ntinue .** follo
24760 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  wing the rollbac
24770 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f  k. Or, if writeO
24780 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c  nly is false, al
24790 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a  l cursors are .*
247a0 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65  * tripped. In ge
247b0 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79  neral, writeOnly
247c0 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65   is false if the
247d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69   transaction bei
247e0 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ng.** rolled bac
247f0 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64  k modified the d
24800 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
24810 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d 74  In this case b-t
24820 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  ree root.** page
24830 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f  s may be moved o
24840 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74  r deleted from t
24850 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f  he database alto
24860 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a  gether, making.*
24870 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20  * it unsafe for 
24880 72 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20  read cursors to 
24890 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20  continue..**.** 
248a0 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  If the writeOnly
248b0 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e   flag is true an
248c0 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  d an error is en
248d0 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20  countered while 
248e0 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63  .** saving the c
248f0 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
24900 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  of a read-only c
24910 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f  ursor, all curso
24920 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  rs, .** includin
24930 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f  g all read-curso
24940 72 73 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a  rs are tripped..
24950 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
24960 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
24970 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66  uccessful, or if
24980 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
24990 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67   while.** saving
249a0 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69   a cursor positi
249b0 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  on, an SQLite er
249c0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ror code..*/.int
249d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
249e0 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65  pAllCursors(Btre
249f0 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65  e *pBtree, int e
24a00 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74  rrCode, int writ
24a10 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  eOnly){.  BtCurs
24a20 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20  or *p;.  int rc 
24a30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
24a40 61 73 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e  assert( (writeOn
24a50 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e  ly==0 || writeOn
24a60 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57  ly==1) && BTCF_W
24a70 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20  riteFlag==1 );. 
24a80 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
24a90 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
24aa0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
24ab0 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
24ac0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
24ad0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
24ae0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
24af0 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26   if( writeOnly &
24b00 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26  & (p->curFlags &
24b10 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
24b20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
24b30 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  f( p->eState==CU
24b40 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d  RSOR_VALID || p-
24b50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
24b60 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20  SKIPNEXT ){.    
24b70 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43        rc = saveC
24b80 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
24b90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
24ba0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
24bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  .            (vo
24bc0 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65 54  id)sqlite3BtreeT
24bd0 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  ripAllCursors(pB
24be0 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20  tree, rc, 0);.  
24bf0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
24c00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
24c20 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
24c30 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
24c40 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20  sor(p);.        
24c50 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
24c60 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20  OR_FAULT;.      
24c70 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20    p->skipNext = 
24c80 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d  errCode;.      }
24c90 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
24ca0 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  i<=p->iPage; i++
24cb0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
24cc0 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
24cd0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  [i]);.        p-
24ce0 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
24cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24d00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
24d10 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
24d20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24d30 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
24d40 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
24d50 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
24d60 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69  ** If tripCode i
24d70 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
24d80 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c  then cursors wil
24d90 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  l be invalidated
24da0 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f   (tripped)..** O
24db0 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  nly write cursor
24dc0 73 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66  s are tripped if
24dd0 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72   writeOnly is tr
24de0 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f  ue but all curso
24df0 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65  rs are.** trippe
24e00 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69  d if writeOnly i
24e10 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74  s false.  Any at
24e20 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20  tempt to use.** 
24e30 61 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72  a tripped cursor
24e40 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
24e50 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
24e60 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
24e70 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
24e80 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
24e90 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
24ea0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
24eb0 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
24ec0 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
24ed0 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
24ee0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
24ef0 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c  llback(Btree *p,
24f00 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69   int tripCode, i
24f10 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20  nt writeOnly){. 
24f20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
24f30 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
24f40 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
24f50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  age1;..  assert(
24f60 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c   writeOnly==1 ||
24f70 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b   writeOnly==0 );
24f80 0a 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43  .  assert( tripC
24f90 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52  ode==SQLITE_ABOR
24fa0 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72  T_ROLLBACK || tr
24fb0 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  ipCode==SQLITE_O
24fc0 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  K );.  sqlite3Bt
24fd0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
24fe0 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  f( tripCode==SQL
24ff0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
25000 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61   = tripCode = sa
25010 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
25020 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
25030 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20   rc ) writeOnly 
25040 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
25050 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
25060 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70  ;.  }.  if( trip
25070 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Code ){.    int 
25080 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
25090 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
250a0 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72  (p, tripCode, wr
250b0 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73  iteOnly);.    as
250c0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
250d0 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c  _OK || (writeOnl
250e0 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c  y==0 && rc2==SQL
250f0 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69  ITE_OK) );.    i
25100 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
25110 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
25120 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  }.  btreeIntegri
25130 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ty(p);..  if( p-
25140 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
25150 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
25160 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72   rc2;..    asser
25170 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d  t( TRANS_WRITE==
25180 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
25190 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  on );.    rc2 = 
251a0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
251b0 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  back(pBt->pPager
251c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d  );.    if( rc2!=
251d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
251e0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
251f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   }..    /* The r
25200 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
25210 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70   destroyed the p
25220 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c  Page1->aData val
25230 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63  ue.  So.    ** c
25240 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65  all btreeGetPage
25250 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61  () on page 1 aga
25260 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  in to make.    *
25270 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61  * sure pPage1->a
25280 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72  Data is set corr
25290 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ectly. */.    if
252a0 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  ( btreeGetPage(p
252b0 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
252c0 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
252d0 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
252e0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
252f0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
25300 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  a);.      testca
25310 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a  se( nPage==0 );.
25320 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
25330 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  =0 ) sqlite3Page
25340 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
25350 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
25360 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25370 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61   pBt->nPage!=nPa
25380 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge );.      pBt-
25390 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
253a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
253b0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  e(pPage1);.    }
253c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75  .    assert( cou
253d0 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
253e0 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20  Bt, 1)==0 );.   
253f0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
25400 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
25410 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72  ;.    btreeClear
25420 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
25430 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
25440 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
25450 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
25460 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
25470 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
25480 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
25490 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
254a0 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
254b0 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  on can be rolled
254c0 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  .** back indepen
254d0 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
254e0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  in transaction. 
254f0 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61  You must start a
25500 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
25510 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
25520 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f   a subtransactio
25530 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
25540 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
25550 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
25560 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
25570 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
25580 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a   or rolls back..
25590 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
255a0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
255b0 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
255c0 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
255d0 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
255e0 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
255f0 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
25600 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
25610 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
25620 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
25630 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
25640 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
25650 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
25660 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
25670 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
25680 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
25690 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
256a0 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
256b0 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e  **.** A statemen
256c0 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f  t sub-transactio
256d0 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
256e0 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73   as an anonymous
256f0 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a   savepoint. The.
25700 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  ** value passed 
25710 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
25720 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74  rameter is the t
25730 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
25740 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e  avepoints,.** in
25750 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20  cluding the new 
25760 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
25770 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65  int, open on the
25780 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66   B-Tree. i.e. if
25790 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
257a0 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
257b0 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
257c0 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
257d0 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20  ctions open,.** 
257e0 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e  iStatement is 1.
257f0 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20   This anonymous 
25800 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65  savepoint can be
25810 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c   released or rol
25820 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  led back.** usin
25830 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  g the sqlite3Btr
25840 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75  eeSavepoint() fu
25850 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
25860 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
25870 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69  Stmt(Btree *p, i
25880 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a  nt iStatement){.
25890 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
258a0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
258b0 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
258c0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
258d0 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
258e0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
258f0 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d  .  assert( (pBt-
25900 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
25910 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b  READ_ONLY)==0 );
25920 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
25930 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73  ement>0 );.  ass
25940 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
25950 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
25960 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
25970 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
25980 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
25990 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61  ;.  /* At the pa
259a0 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61  ger level, a sta
259b0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
259c0 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  on is a savepoin
259d0 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69  t with.  ** an i
259e0 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
259f0 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73  n all savepoints
25a00 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69   created explici
25a10 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53  tly using.  ** S
25a20 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49  QL statements. I
25a30 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
25a40 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72  open, release or
25a50 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20   rollback any.  
25a60 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e  ** such savepoin
25a70 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61  ts while the sta
25a80 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
25a90 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  on savepoint is 
25aa0 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72  active..  */.  r
25ab0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25ac0 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
25ad0 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74  t->pPager, iStat
25ae0 65 6d 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  ement);.  if( rc
25af0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25b00 20 20 20 72 63 20 3d 20 62 74 72 65 65 50 74 72     rc = btreePtr
25b10 6d 61 70 42 65 67 69 6e 28 70 42 74 2c 20 69 53  mapBegin(pBt, iS
25b20 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20  tatement);.  }. 
25b30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
25b40 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
25b50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
25b60 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
25b70 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
25b80 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73  n, op, is always
25b90 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
25ba0 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f  ACK.** or SAVEPO
25bb0 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69  INT_RELEASE. Thi
25bc0 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65  s function eithe
25bd0 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f  r releases or ro
25be0 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  lls back the.** 
25bf0 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69  savepoint identi
25c00 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
25c10 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65  r iSavepoint, de
25c20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
25c30 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a  alue .** of op..
25c40 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
25c50 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
25c60 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
25c70 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77  ual to zero. How
25c80 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a  ever, if op is.*
25c90 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  * SAVEPOINT_ROLL
25ca0 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65  BACK, then iSave
25cb0 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62  point may also b
25cc0 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61  e -1. In this ca
25cd0 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  se the .** conte
25ce0 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72  nts of the entir
25cf0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e transaction ar
25d00 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
25d10 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
25d20 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61  .** from a norma
25d30 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
25d40 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f  llback, as no lo
25d50 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  cks are released
25d60 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e   and the.** tran
25d70 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20  saction remains 
25d80 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
25d90 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
25da0 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
25db0 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
25dc0 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
25dd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
25de0 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ( p && p->inTran
25df0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
25e00 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
25e10 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
25e20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
25e30 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
25e40 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
25e50 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
25e60 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
25e70 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
25e80 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
25e90 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
25ea0 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
25eb0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
25ec0 3b 0a 20 20 20 20 62 74 72 65 65 50 74 72 6d 61  ;.    btreePtrma
25ed0 70 45 6e 64 28 70 42 74 2c 20 6f 70 2c 20 69 53  pEnd(pBt, op, iS
25ee0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
25ef0 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  f( op==SAVEPOINT
25f00 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
25f10 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
25f20 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
25f30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
25f40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25f50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
25f60 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
25f70 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
25f80 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
25f90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
25fa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25fb0 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
25fc0 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e  oint<0 && (pBt->
25fd0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49  btsFlags & BTS_I
25fe0 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21  NITIALLY_EMPTY)!
25ff0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =0 ){.        pB
26000 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
26010 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
26020 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
26030 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
26040 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
26050 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  8 + pBt->pPage1-
26060 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >aData);..      
26070 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
26080 73 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e  size was written
26090 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74   into the offset
260a0 20 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65   28 of the heade
260b0 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  r.      ** when 
260c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
260d0 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b  started, so we k
260e0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c  now that the val
260f0 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20  ue at offset.   
26100 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a     ** 28 is nonz
26110 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ero. */.      as
26120 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
26130 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
26140 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
26150 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
26160 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26170 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
26180 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
26190 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
261a0 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
261b0 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64  Table. If a read
261c0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20  -only cursor is 
261d0 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
261e0 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
261f0 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65   the caller alre
26200 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74  ady has at least
26210 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
26220 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a  nsaction open.**
26230 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
26240 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77   already. If a w
26250 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72  rite-cursor is r
26260 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a  equested, then.*
26270 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
26280 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20  assumed to have 
26290 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
262a0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
262b0 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52   If the BTREE_WR
262c0 43 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61  CSR bit of wrFla
262d0 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e  g is clear, then
262e0 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
262f0 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20  only.** be used 
26300 66 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66  for reading.  If
26310 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52   the BTREE_WRCSR
26320 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65   bit is set, the
26330 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  n the cursor.** 
26340 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
26350 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77  reading or for w
26360 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
26370 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
26380 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c  riting.** are al
26390 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61  so met.  These a
263a0 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
263b0 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
263c0 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66  et in order.** f
263d0 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65  or writing to be
263e0 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
263f0 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
26400 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
26410 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
26420 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45   containing BTRE
26430 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a  E_WRCSR.**.** 2:
26440 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
26450 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
26460 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
26470 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
26480 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
26490 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
264a0 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
264b0 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
264c0 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
264d0 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
264e0 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
264f0 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
26500 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
26510 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
26520 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
26530 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
26540 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
26550 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
26560 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
26570 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
26580 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
26590 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
265a0 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
265b0 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
265c0 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
265d0 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
265e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
265f0 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52  ** The BTREE_FOR
26600 44 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72  DELETE bit of wr
26610 46 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61  Flag may optiona
26620 6c 6c 79 20 62 65 20 73 65 74 20 69 66 20 42 54  lly be set if BT
26630 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20  REE_WRCSR.** is 
26640 73 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45  set.  If FORDELE
26650 54 45 20 69 73 20 73 65 74 2c 20 74 68 61 74 20  TE is set, that 
26660 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  is a hint to the
26670 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
26680 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72  that.** this cur
26690 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65  sor will only be
266a0 20 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f   used to seek to
266b0 20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72   and delete entr
266c0 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a  ies of an index.
266d0 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ** as part of a 
266e0 6c 61 72 67 65 72 20 44 45 4c 45 54 45 20 73 74  larger DELETE st
266f0 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f  atement.  The FO
26700 52 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20  RDELETE hint is 
26710 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  not used by.** t
26720 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
26730 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79  on.  But in a hy
26740 70 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72  pothetical alter
26750 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65  native storage e
26760 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69  ngine .** in whi
26770 63 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  ch index entries
26780 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
26790 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ly deleted when 
267a0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
267b0 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20  ble.** rows are 
267c0 64 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52  deleted, the FOR
267d0 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61  DELETE flag is a
267e0 20 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53   hint that all S
267f0 45 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a  EEK and DELETE.*
26800 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20  * operations on 
26810 74 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20  this cursor can 
26820 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c  be no-ops and al
26830 6c 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e  l READ operation
26840 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e  s can .** return
26850 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62   a null row (2-b
26860 79 74 65 73 3a 20 30 78 30 31 20 30 78 30 30 29  ytes: 0x01 0x00)
26870 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
26880 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
26890 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
268a0 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
268b0 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
268c0 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
268d0 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
268e0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
268f0 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
26900 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
26910 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
26920 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
26930 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
26940 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20  ursorZero() has 
26950 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f  been called.** o
26960 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61  n pCur to initia
26970 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
26980 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69  space prior to i
26990 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
269a0 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
269b0 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
269c0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
269d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
269f0 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
26a00 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
26a30 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
26a40 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
26a50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26a70 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
26a80 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
26a90 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
26aa0 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
26ab0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
26ac0 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
26ad0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
26ae0 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
26af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b00 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
26b10 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
26b20 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
26b30 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
26b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
26b50 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64  ared b-tree hand
26b60 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  le */.  BtCursor
26b70 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26b90 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f  * Looping over o
26ba0 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73  ther all cursors
26bb0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
26bc0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
26bd0 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
26be0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
26bf0 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61  .       || wrFla
26c00 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a  g==BTREE_WRCSR .
26c10 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67         || wrFlag
26c20 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42  ==(BTREE_WRCSR|B
26c30 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20  TREE_FORDELETE) 
26c40 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  .  );..  /* The 
26c50 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
26c60 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69   statements veri
26c70 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20  fy that if this 
26c80 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20  is a sharable . 
26c90 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62   ** b-tree datab
26ca0 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74  ase, the connect
26cb0 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ion is holding t
26cc0 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
26cd0 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61  e locks, .  ** a
26ce0 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  nd that no other
26cf0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
26d00 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20  any open cursor 
26d10 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77  that conflicts w
26d20 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c  ith .  ** this l
26d30 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
26d40 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68  t( hasSharedCach
26d50 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  eTableLock(p, iT
26d60 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d  able, pKeyInfo!=
26d70 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29  0, (wrFlag?2:1))
26d80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
26d90 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52  Flag==0 || !hasR
26da0 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
26db0 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a  iTable) );..  /*
26dc0 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
26dd0 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e   caller has open
26de0 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ed the required 
26df0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a  transaction. */.
26e00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
26e10 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
26e20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
26e30 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54  lag==0 || p->inT
26e40 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
26e50 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
26e60 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42  Bt->pPage1 && pB
26e70 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
26e80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
26e90 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d  Flag==0 || (pBt-
26ea0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
26eb0 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b  READ_ONLY)==0 );
26ec0 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29  ..  if( wrFlag )
26ed0 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65  {.    allocateTe
26ee0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
26ef0 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
26f00 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
26f10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
26f20 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  PT;.  }.  if( iT
26f30 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65  able==1 && btree
26f40 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d  Pagecount(pBt)==
26f50 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
26f60 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20   wrFlag==0 );.  
26f70 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20    iTable = 0;.  
26f80 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
26f90 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
26fa0 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
26fb0 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
26fc0 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
26fd0 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69  variables and li
26fe0 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
26ff0 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
27000 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72  list.  */.  pCur
27010 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
27020 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75  no)iTable;.  pCu
27030 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
27040 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
27050 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
27060 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
27070 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
27080 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  t;.  pCur->curFl
27090 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42  ags = wrFlag ? B
270a0 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20  TCF_WriteFlag : 
270b0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61  0;.  pCur->curPa
270c0 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  gerFlags = wrFla
270d0 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45  g ? 0 : PAGER_GE
270e0 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a  T_READONLY;.  /*
270f0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77   If there are tw
27100 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72  o or more cursor
27110 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74  s on the same bt
27120 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75  ree, then all su
27130 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20  ch.  ** cursors 
27140 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20  *must* have the 
27150 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
27160 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72  ag set. */.  for
27170 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  (pX=pBt->pCursor
27180 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
27190 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  xt){.    if( pX-
271a0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f  >pgnoRoot==(Pgno
271b0 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  )iTable ){.     
271c0 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d   pX->curFlags |=
271d0 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a   BTCF_Multiple;.
271e0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
271f0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c  lags |= BTCF_Mul
27200 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  tiple;.    }.  }
27210 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
27220 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
27230 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
27240 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
27250 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
27260 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20  VALID;.  return 
27270 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
27280 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
27290 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
272a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272c0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
272d0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
272e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27300 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
27310 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
27320 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
27330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27350 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
27360 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
27370 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
27380 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
27390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
273a0 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
273b0 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
273c0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
273d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273e0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
273f0 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
27400 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
27410 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20  .  if( iTable<1 
27420 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
27430 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
27440 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
27450 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
27460 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  p);.    rc = btr
27470 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
27480 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
27490 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20  Info, pCur);.   
274a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
274b0 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
274c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
274d0 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
274e0 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f   of a BtCursor o
274f0 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a  bject in bytes..
27500 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72  **.** This inter
27510 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20  faces is needed 
27520 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66  so that users of
27530 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65   cursors can pre
27540 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66  allocate.** suff
27550 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74  icient storage t
27560 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e  o hold a cursor.
27570 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f    The BtCursor o
27580 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a  bject is opaque.
27590 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74  ** to users so t
275a0 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68  hey cannot do th
275b0 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73  e sizeof() thems
275c0 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73  elves - they mus
275d0 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72  t call.** this r
275e0 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  outine..*/.int s
275f0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
27600 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72  rSize(void){.  r
27610 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a  eturn ROUND8(siz
27620 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a  eof(BtCursor));.
27630 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
27640 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  ize memory that 
27650 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
27660 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f  d into a BtCurso
27670 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  r object..**.** 
27680 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f  The simple appro
27690 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62  ach here would b
276a0 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68  e to memset() th
276b0 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a  e entire object.
276c0 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74  ** to zero.  But
276d0 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68   it turns out th
276e0 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20  at the apPage[] 
276f0 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61  and aiIdx[] arra
27700 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65  ys.** do not nee
27710 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61  d to be zeroed a
27720 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67  nd they are larg
27730 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76  e, so we can sav
27740 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75  e a lot.** of ru
27750 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69  n-time by skippi
27760 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ng the initializ
27770 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65  ation of those e
27780 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64  lements..*/.void
27790 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
277a0 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72  sorZero(BtCursor
277b0 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70   *p){.  memset(p
277c0 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74  , 0, offsetof(Bt
277d0 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b  Cursor, iPage));
277e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
277f0 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72  a cursor.  The r
27800 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
27810 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
27820 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65   released.** whe
27830 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f  n the last curso
27840 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  r is closed..*/.
27850 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
27860 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75  CloseCursor(BtCu
27870 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42  rsor *pCur){.  B
27880 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70  tree *pBtree = p
27890 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69  Cur->pBtree;.  i
278a0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
278b0 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68   int i;.    BtSh
278c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
278d0 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
278e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
278f0 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ree);.    sqlite
27900 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
27910 72 28 70 43 75 72 29 3b 0a 20 20 20 20 61 73 73  r(pCur);.    ass
27920 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f  ert( pBt->pCurso
27930 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  r!=0 );.    if( 
27940 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43  pBt->pCursor==pC
27950 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ur ){.      pBt-
27960 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
27970 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
27980 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f  e{.      BtCurso
27990 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e  r *pPrev = pBt->
279a0 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64  pCursor;.      d
279b0 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  o{.        if( p
279c0 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75  Prev->pNext==pCu
279d0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
279e0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
279f0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ur->pNext;.     
27a00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27a10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
27a20 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65  rev = pPrev->pNe
27a30 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  xt;.      }while
27a40 28 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20  ( ALWAYS(pPrev) 
27a50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
27a60 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
27a70 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
27a80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
27a90 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
27aa0 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b      }.    unlock
27ab0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
27ac0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
27ad0 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72  free(pCur->aOver
27ae0 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71  flow);.    /* sq
27af0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
27b00 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
27b10 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
27b20 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
27b30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
27b40 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
27b50 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
27b60 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
27b70 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
27b80 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
27b90 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
27ba0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
27bb0 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
27bc0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
27bd0 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
27be0 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
27bf0 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
27c00 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
27c10 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
27c20 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
27c30 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
27c40 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
27c50 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50   calls to btreeP
27c60 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23  arseCell()..*/.#
27c70 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
27c80 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
27c90 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
27ca0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
27cb0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
27cc0 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
27cd0 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
27ce0 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
27cf0 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
27d00 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
27d10 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
27d20 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 69 78  iPage], pCur->ix
27d30 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
27d40 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
27d50 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f   || memcmp(&info
27d60 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
27d70 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
27d80 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23  );.  }.#else.  #
27d90 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c  define assertCel
27da0 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a  lInfo(x).#endif.
27db0 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
27dc0 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74 43  INLINE void getC
27dd0 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
27de0 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70   *pCur){.  if( p
27df0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
27e00 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 50  =0 ){.    int iP
27e10 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
27e20 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72  e;.    pCur->cur
27e30 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
27e40 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72  lidNKey;.    btr
27e50 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
27e60 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
27e70 70 43 75 72 2d 3e 69 78 2c 26 70 43 75 72 2d 3e  pCur->ix,&pCur->
27e80 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  info);.  }else{.
27e90 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
27ea0 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  fo(pCur);.  }.}.
27eb0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
27ec0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75   /* The next rou
27ed0 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77  tine used only w
27ee0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
27ef0 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a  tatements */./*.
27f00 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
27f10 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75  f the given BtCu
27f20 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
27f30 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69  A valid cursor i
27f40 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73  s one.** that is
27f50 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
27f60 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20  ing to a row in 
27f70 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61  a (non-empty) ta
27f80 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ble..** This is 
27f90 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72  a verification r
27fa0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
27fb0 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
27fc0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
27fd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
27fe0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
27ff0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
28000 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20  {.  return pCur 
28010 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
28020 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
28030 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55  .#endif /* NDEBU
28040 47 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  G */.int sqlite3
28050 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
28060 69 64 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a 70  idNN(BtCursor *p
28070 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
28080 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 72 65 74  pCur!=0 );.  ret
28090 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
280a0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
280b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
280c0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
280d0 20 69 6e 74 65 67 65 72 20 6b 65 79 20 6f 72 20   integer key or 
280e0 22 72 6f 77 69 64 22 20 66 6f 72 20 61 20 74 61  "rowid" for a ta
280f0 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68  ble btree..** Th
28100 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
28110 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 61 20 63  ly valid for a c
28120 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f  ursor that is po
28130 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a  inting into a.**
28140 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
28150 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20 63  btree.  If the c
28160 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  ursor points to 
28170 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 20 6f  an index btree o
28180 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c  r.** is invalid,
28190 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
281a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
281b0 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34  ndefined..*/.i64
281c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
281d0 65 67 65 72 4b 65 79 28 42 74 43 75 72 73 6f 72  egerKey(BtCursor
281e0 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
281f0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
28200 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
28210 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
28220 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
28230 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
28240 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
28250 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
28260 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
28270 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
28280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
28290 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
282a0 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20  ytes of payload 
282b0 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
282c0 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63 75  at pCur is.** cu
282d0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
282e0 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65 20   to.  For table 
282f0 62 74 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c  btrees, this wil
28300 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a  l be the amount.
28310 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f 72  ** of data.  For
28320 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20 74   index btrees, t
28330 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
28340 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 2e  size of the key.
28350 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
28360 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  r must guarantee
28370 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
28380 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
28390 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61  a non-NULL.** va
283a0 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f  lid entry.  In o
283b0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
283c0 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
283d0 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  e must guarantee
283e0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72  .** that the cur
283f0 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65  sor has Cursor.e
28400 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28410 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  LID..*/.u32 sqli
28420 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53  te3BtreePayloadS
28430 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
28440 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
28450 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
28460 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
28470 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
28480 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
28490 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
284a0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Cur);.  return p
284b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
284c0 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ad;.}../*.** Giv
284d0 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
284e0 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
284f0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
28500 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
28510 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
28520 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
28530 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
28540 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
28550 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
28560 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
28570 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
28580 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
28590 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
285a0 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
285b0 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
285c0 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
285d0 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
285e0 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
285f0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
28600 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
28610 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
28620 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
28630 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
28640 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
28650 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
28660 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
28670 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ist is .** writt
28680 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
28690 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69  . If page ovfl i
286a0 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
286b0 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a  in its linked .*
286c0 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65  * list, *pPgnoNe
286d0 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  xt is set to zer
286e0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50  o. .**.** If ppP
286f0 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  age is not NULL,
28700 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65   and a reference
28710 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
28720 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
28730 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20  ding.** to page 
28740 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73  number pOvfl was
28750 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20   obtained, then 
28760 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
28770 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a  o point to that.
28780 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74  ** reference. It
28790 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
287a0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
287b0 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c  ller to call rel
287c0 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e  easePage().** on
287d0 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65   *ppPage to free
287e0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20   the reference. 
287f0 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  In no reference 
28800 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65  was obtained (be
28810 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69  cause.** the poi
28820 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65  nter-map was use
28830 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
28840 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f  value for *pPgno
28850 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a  Next), then.** *
28860 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
28870 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
28880 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
28890 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
288a0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
288b0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
288c0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
288d0 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20  gno ovfl,       
288e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
288f0 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  urrent overflow 
28900 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
28910 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
28920 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
28930 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
28940 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c  ndle (may be NUL
28950 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  L) */.  Pgno *pP
28960 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
28970 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
28980 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
28990 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
289a0 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
289b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
289c0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
289d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
289e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
289f0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
28a00 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
28a10 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66  pPgnoNext);..#if
28a20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28a30 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
28a40 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
28a50 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
28a60 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
28a70 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
28a80 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
28a90 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
28aa0 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
28ab0 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
28ac0 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
28ad0 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
28ae0 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
28af0 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
28b00 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
28b10 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
28b20 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
28b30 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
28b40 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
28b50 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
28b60 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
28b70 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
28b80 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
28b90 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
28ba0 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
28bb0 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
28bc0 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
28bd0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
28be0 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
28bf0 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
28c00 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
28c10 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
28c20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
28c30 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67  iGuess<=btreePag
28c40 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
28c50 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
28c60 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
28c70 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
28c80 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
28c90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70  QLITE_OK && eTyp
28ca0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
28cb0 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
28cc0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
28cd0 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
28ce0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28cf0 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
28d00 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
28d10 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d    assert( next==
28d20 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
28d30 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
28d40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28d50 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
28d60 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
28d70 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d  &pPage, (ppPage=
28d80 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  =0) ? PAGER_GET_
28d90 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20  READONLY : 0);. 
28da0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
28db0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
28dc0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e==0 );.    if( 
28dd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28de0 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
28df0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
28e00 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
28e10 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
28e20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61  next;.  if( ppPa
28e30 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  ge ){.    *ppPag
28e40 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c  e = pPage;.  }el
28e50 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
28e60 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
28e70 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
28e80 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
28e90 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
28ea0 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  /*.** Copy data 
28eb0 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f  from a buffer to
28ec0 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d   a page, or from
28ed0 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66   a page to a buf
28ee0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c  fer..**.** pPayl
28ef0 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72  oad is a pointer
28f00 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20   to data stored 
28f10 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  on database page
28f20 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20   pDbPage..** If 
28f30 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20  argument eOp is 
28f40 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74  false, then nByt
28f50 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
28f60 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  are copied.** fr
28f70 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74  om pPayload to t
28f80 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
28f90 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66  d at by pBuf. If
28fa0 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a   eOp is true,.**
28fb0 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   then sqlite3Pag
28fc0 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
28fd0 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61  led on pDbPage a
28fe0 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a  nd nByte bytes.*
28ff0 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  * of data are co
29000 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  pied from the bu
29010 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61  ffer pBuf to pPa
29020 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  yload..**.** SQL
29030 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
29040 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f  ed on success, o
29050 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
29060 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
29070 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61  c int copyPayloa
29080 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c  d(.  void *pPayl
29090 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  oad,           /
290a0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
290b0 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  e data */.  void
290c0 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
290d0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
290e0 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20   to buffer */.  
290f0 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
29100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
29110 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
29120 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  copy */.  int eO
29130 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
29140 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79      /* 0 -> copy
29150 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e   from page, 1 ->
29160 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f   copy to page */
29170 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
29180 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
29190 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
291a0 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  pPayload */.){. 
291b0 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
291c0 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
291d0 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65  m buffer to page
291e0 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74   (a write operat
291f0 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion) */.    int 
29200 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29210 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
29220 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
29230 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29240 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
29250 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
29260 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74  load, pBuf, nByt
29270 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
29280 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
29290 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65  om page to buffe
292a0 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74  r (a read operat
292b0 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  ion) */.    memc
292c0 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61  py(pBuf, pPayloa
292d0 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  d, nByte);.  }. 
292e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
292f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
29300 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
29310 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
29320 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
29330 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
29340 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
29350 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
29360 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
29370 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75   The eOp.** argu
29380 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65  ment is interpre
29390 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
293a0 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f  **.**   0: The o
293b0 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65  peration is a re
293c0 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ad. Populate the
293d0 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
293e0 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65  .**   1: The ope
293f0 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74  ration is a writ
29400 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  e. Populate the 
29410 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
29420 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
29430 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
29440 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
29450 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
29460 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
29470 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
29480 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
29490 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  uf..**.** The co
294a0 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64  ntent being read
294b0 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68   or written migh
294c0 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  t appear on the 
294d0 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20  main page.** or 
294e0 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
294f0 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
29500 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a  rflow pages..**.
29510 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
29520 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  t cursor entry u
29530 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
29540 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 2a  overflow pages.*
29550 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
29560 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  may allocate spa
29570 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
29580 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68  y populate.** th
29590 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
295a0 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79  list cache array
295b0 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
295c0 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65  flow). .** Subse
295d0 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
295e0 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61  this cache to ma
295f0 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
29600 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
29610 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63  t .** more effic
29620 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
29630 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
29640 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
29650 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
29660 20 69 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69   it must be.** i
29670 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f  nvalidated if so
29680 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20  me other cursor 
29690 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61  writes to the sa
296a0 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a  me table, or if.
296b0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
296c0 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66   moved to a diff
296d0 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74  erent row. Addit
296e0 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f  ionally, in auto
296f0 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c  -vacuum.** mode,
29700 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
29710 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69  vents may invali
29720 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  date an overflow
29730 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
29740 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69  ..**.**   * An i
29750 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
29760 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d  m,.**   * A comm
29770 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75  it in auto_vacuu
29780 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a  m="full" mode,.*
29790 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61  *   * Creating a
297a0 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75   table (may requ
297b0 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76  ire moving an ov
297c0 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f  erflow page)..*/
297d0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65  .static int acce
297e0 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  ssPayload(.  BtC
297f0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
29800 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
29810 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
29820 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
29830 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20  u32 offset,     
29840 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
29850 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69  ading this far i
29860 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  nto payload */. 
29870 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20   u32 amt,       
29880 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
29890 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f  is many bytes */
298a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
298b0 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65   *pBuf, /* Write
298c0 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20   the bytes into 
298d0 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a  this buffer */ .
298e0 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20    int eOp       
298f0 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74         /* zero t
29900 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f  o read. non-zero
29910 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b   to write. */.){
29920 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
29930 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e   *aPayload;.  in
29940 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29950 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
29960 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
29970 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
29980 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20  e[pCur->iPage]; 
29990 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
299a0 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a   current entry *
299b0 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
299c0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20  t = pCur->pBt;  
299d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299e0 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75  /* Btree this cu
299f0 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rsor belongs to 
29a00 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
29a10 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
29a20 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64  _READ.  unsigned
29a30 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42   char * const pB
29a40 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b 20  ufStart = pBuf; 
29a50 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
29a60 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20 62 75 66  original out buf
29a70 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  fer */.#endif.. 
29a80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
29a90 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d  ;.  assert( eOp=
29aa0 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a  =0 || eOp==1 );.
29ab0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29ac0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
29ad0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
29ae0 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65  ( pCur->ix<pPage
29af0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
29b00 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
29b10 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
29b20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
29b30 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
29b40 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  = pCur->info.pPa
29b50 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65 72 74 28  yload;.  assert(
29b60 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
29b70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
29b80 61 64 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ad );..  assert(
29b90 20 61 50 61 79 6c 6f 61 64 20 3e 20 70 50 61 67   aPayload > pPag
29ba0 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 69 66  e->aData );.  if
29bb0 28 20 28 75 70 74 72 29 28 61 50 61 79 6c 6f 61  ( (uptr)(aPayloa
29bc0 64 20 2d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  d - pPage->aData
29bd0 29 20 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  ) > (pBt->usable
29be0 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66  Size - pCur->inf
29bf0 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20  o.nLocal) ){.   
29c00 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
29c10 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
29c20 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
29c30 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
29c40 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f  .  The.    ** co
29c50 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20  nditional above 
29c60 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a  is really:.    *
29c70 2a 20 20 20 20 26 61 50 61 79 6c 6f 61 64 5b 70  *    &aPayload[p
29c80 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
29c90 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
29ca0 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
29cb0 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20 69 73  e].    ** but is
29cc0 20 72 65 63 61 73 74 20 69 6e 74 6f 20 69 74 73   recast into its
29cd0 20 63 75 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f   current form to
29ce0 20 61 76 6f 69 64 20 69 6e 74 65 67 65 72 20 6f   avoid integer o
29cf0 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73  verflow problems
29d00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  .    */.    retu
29d10 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
29d20 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
29d30 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20  * Check if data 
29d40 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69  must be read/wri
29d50 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65  tten to/from the
29d60 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65   btree page itse
29d70 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  lf. */.  if( off
29d80 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
29d90 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
29da0 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
29db0 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
29dc0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
29dd0 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
29de0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
29df0 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
29e00 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
29e10 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
29e20 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  t], pBuf, a, eOp
29e30 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  , pPage->pDbPage
29e40 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  );.    offset = 
29e50 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61  0;.    pBuf += a
29e60 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a  ;.    amt -= a;.
29e70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66    }else{.    off
29e80 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66  set -= pCur->inf
29e90 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a  o.nLocal;.  }...
29ea0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29eb0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
29ec0 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76      const u32 ov
29ed0 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  flSize = pBt->us
29ee0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f  ableSize - 4;  /
29ef0 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20  * Bytes content 
29f00 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f  per ovfl page */
29f10 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61  .    Pgno nextPa
29f20 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67  ge;..    nextPag
29f30 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50  e = get4byte(&aP
29f40 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
29f50 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20  o.nLocal]);..   
29f60 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75 72   /* If the BtCur
29f70 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  sor.aOverflow[] 
29f80 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
29f90 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
29fa0 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a   it now..    **.
29fb0 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72      ** The aOver
29fc0 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20  flow[] array is 
29fd0 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74  sized at one ent
29fe0 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72  ry for each over
29ff0 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a  flow page.    **
2a000 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
2a010 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
2a020 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
2a030 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
2a040 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f  ge is.    ** sto
2a050 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
2a060 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75  [0], etc. A valu
2a070 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f  e of 0 in the aO
2a080 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a  verflow[] array.
2a090 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f      ** means "no
2a0a0 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68  t yet known" (th
2a0b0 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c  e cache is lazil
2a0c0 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20  y populated)..  
2a0d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43    */.    if( (pC
2a0e0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2a0f0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d  TCF_ValidOvfl)==
2a100 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  0 ){.      int n
2a110 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e  Ovfl = (pCur->in
2a120 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72  fo.nPayload-pCur
2a130 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76  ->info.nLocal+ov
2a140 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69  flSize-1)/ovflSi
2a150 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  ze;.      if( nO
2a160 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41  vfl>pCur->nOvflA
2a170 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
2a180 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67  Pgno *aNew = (Pg
2a190 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c  no*)sqlite3Reall
2a1a0 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  oc(.            
2a1b0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c  pCur->aOverflow,
2a1c0 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28   nOvfl*2*sizeof(
2a1d0 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b  Pgno).        );
2a1e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65  .        if( aNe
2a1f0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
2a200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a210 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2a220 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a230 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c       pCur->nOvfl
2a240 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b  Alloc = nOvfl*2;
2a250 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2a260 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65  >aOverflow = aNe
2a270 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
2a280 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
2a290 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  t(pCur->aOverflo
2a2a0 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65  w, 0, nOvfl*size
2a2b0 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20  of(Pgno));.     
2a2c0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2a2d0 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  |= BTCF_ValidOvf
2a2e0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
2a2f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
2a300 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
2a310 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
2a320 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
2a330 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 79  e.      ** entry
2a340 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
2a350 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77  equired overflow
2a360 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20   page is valid, 
2a370 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20 64 69  skip.      ** di
2a380 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
2a390 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2a3a0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
2a3b0 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
2a3c0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 64  ] ){.        iId
2a3d0 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
2a3e0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  Size);.        n
2a3f0 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
2a400 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
2a410 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
2a420 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
2a430 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
2a440 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
2a450 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2a460 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20 77 68   amt>0 );.    wh
2a470 69 6c 65 28 20 6e 65 78 74 50 61 67 65 20 29 7b  ile( nextPage ){
2a480 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
2a490 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
2a4a0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
2a4b0 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
2a4c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a4d0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
2a4e0 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20  Idx]==0.        
2a4f0 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61        || pCur->a
2a500 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
2a510 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20 20 20  nextPage.       
2a520 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
2a530 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 70 43  T_DB );.      pC
2a540 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
2a550 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
2a560 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
2a570 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
2a580 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
2a590 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
2a5a0 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
2a5b0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
2a5c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
2a5d0 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
2a5e0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
2a5f0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
2a600 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
2a610 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
2a620 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
2a630 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
2a640 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
2a650 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
2a660 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
2a670 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
2a680 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
2a690 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
2a6a0 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
2a6b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
2a6c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
2a6d0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2a6e0 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20  idOvfl );.      
2a6f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a700 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d  pBtree->db==pBt-
2a710 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >db );.        i
2a720 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
2a730 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
2a740 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
2a750 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
2a760 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
2a770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a780 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
2a790 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
2a7a0 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
2a7b0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
2a7c0 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  }.        offset
2a7d0 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
2a7e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a7f0 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
2a800 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
2a810 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
2a820 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
2a830 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
2a840 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
2a850 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
2a860 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
2a870 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
2a880 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2a890 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
2a8a0 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73  W_READ.        s
2a8b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
2a8c0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 72        /* File fr
2a8d0 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 6f 20 64  om which to do d
2a8e0 69 72 65 63 74 20 6f 76 65 72 66 6c 6f 77 20 72  irect overflow r
2a8f0 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
2a900 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
2a910 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  t;.        if( a
2a920 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
2a930 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2a940 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
2a950 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
2a960 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
2a970 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
2a980 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f  W_READ.        /
2a990 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c  * If all the fol
2a9a0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
2a9b0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2a9c0 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73      **   1) this
2a9d0 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
2a9e0 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20  tion, and .     
2a9f0 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20     **   2) data 
2aa00 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d  is required from
2aa10 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2aa20 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  is overflow page
2aa30 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
2aa40 20 20 20 33 29 20 74 68 65 72 65 20 69 73 20 6e     3) there is n
2aa50 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61  o open write-tra
2aa60 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20  nsaction, and.  
2aa70 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68        **   4) th
2aa80 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69  e database is fi
2aa90 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20  le-backed, and. 
2aaa0 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74         **   5) t
2aab0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
2aac0 6e 20 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 20  n the WAL file. 
2aad0 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61         **   6) a
2aae0 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20  t least 4 bytes 
2aaf0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
2ab00 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20  n read into the 
2ab10 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20  output buffer . 
2ab20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2ab30 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63    ** then data c
2ab40 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63  an be read direc
2ab50 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74  tly from the dat
2ab60 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20  abase file into 
2ab70 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
2ab80 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79  utput buffer, by
2ab90 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65  passing the page
2aba0 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65  -cache altogethe
2abb0 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20  r. This speeds. 
2abc0 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61         ** up loa
2abd0 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72  ding large recor
2abe0 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e  ds that span man
2abf0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
2ac00 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2ac10 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20       if( eOp==0 
2ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
2ac50 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  1) */.         &
2ac60 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20  & offset==0     
2ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac90 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20       /* (2) */. 
2aca0 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
2acb0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
2acc0 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20  RANS_READ       
2acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ace0 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (3) */.        
2acf0 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65   && (fd = sqlite
2ad00 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
2ad10 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f  pPager))->pMetho
2ad20 64 73 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f  ds     /* (4) */
2ad30 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d  .         && 0==
2ad40 73 71 6c 69 74 65 33 50 61 67 65 72 55 73 65 57  sqlite3PagerUseW
2ad50 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
2ad60 6e 65 78 74 50 61 67 65 29 20 20 20 20 20 20 20  nextPage)       
2ad70 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20  /* (5) */.      
2ad80 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e     && &pBuf[-4]>
2ad90 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20  =pBufStart      
2ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2adb0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20           /* (6) 
2adc0 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
2add0 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65          u8 aSave
2ade0 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75  [4];.          u
2adf0 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75  8 *aWrite = &pBu
2ae00 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  f[-4];.         
2ae10 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e   assert( aWrite>
2ae20 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20  =pBufStart );   
2ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae40 20 20 20 20 20 20 2f 2a 20 64 75 65 20 74 6f 20        /* due to 
2ae50 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (6) */.         
2ae60 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61   memcpy(aSave, a
2ae70 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20  Write, 4);.     
2ae80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ae90 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69  3OsRead(fd, aWri
2aea0 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42  te, a+4, (i64)pB
2aeb0 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78  t->pageSize*(nex
2aec0 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20  tPage-1));.     
2aed0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
2aee0 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29  get4byte(aWrite)
2aef0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
2af00 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65  py(aWrite, aSave
2af10 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
2af20 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  lse.#endif..    
2af30 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
2af40 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
2af50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2af60 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2af70 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
2af80 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c  tPage, &pDbPage,
2af90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
2afa0 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  eOp==0 ? PAGER_G
2afb0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
2afc0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
2afd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2afe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2aff0 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
2b000 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
2b010 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
2b020 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ;.            ne
2b030 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
2b040 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
2b050 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
2b060 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
2b070 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
2b080 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62  Buf, a, eOp, pDb
2b090 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2b0a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2b0b0 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
2b0c0 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65             offse
2b0d0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2b0e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2b0f0 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
2b100 20 20 20 20 20 20 20 69 66 28 20 61 6d 74 3d 3d         if( amt==
2b110 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
2b120 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
2b130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b140 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2b150 20 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a 20 20        iIdx++;.  
2b160 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
2b170 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2b180 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  amt>0 ){.    ret
2b190 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2b1a0 50 54 5f 42 4b 50 54 3b 20 2f 2a 20 4f 76 65 72  PT_BKPT; /* Over
2b1b0 66 6c 6f 77 20 63 68 61 69 6e 20 65 6e 64 73 20  flow chain ends 
2b1c0 70 72 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20  prematurely */. 
2b1d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2b1e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
2b1f0 72 74 20 6f 66 20 74 68 65 20 70 61 79 6c 6f 61  rt of the payloa
2b200 64 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74  d for the row at
2b210 20 77 68 69 63 68 20 74 68 61 74 20 63 75 72 73   which that curs
2b220 6f 72 20 70 43 75 72 20 69 73 20 63 75 72 72 65  or pCur is curre
2b230 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  ntly.** pointing
2b240 2e 20 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  .  "amt" bytes w
2b250 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72  ill be transferr
2b260 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
2b270 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
2b280 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
2b290 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20  et"..**.** pCur 
2b2a0 63 61 6e 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  can be pointing 
2b2b0 74 6f 20 65 69 74 68 65 72 20 61 20 74 61 62 6c  to either a tabl
2b2c0 65 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 2d  e or an index b-
2b2d0 74 72 65 65 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e  tree..** If poin
2b2e0 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  ting to a table 
2b2f0 62 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20  btree, then the 
2b300 63 6f 6e 74 65 6e 74 20 73 65 63 74 69 6f 6e 20  content section 
2b310 69 73 20 72 65 61 64 2e 20 20 49 66 0a 2a 2a 20  is read.  If.** 
2b320 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
2b330 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   to an index b-t
2b340 72 65 65 20 74 68 65 6e 20 74 68 65 20 6b 65 79  ree then the key
2b350 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64   section is read
2b360 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c 69  ..**.** For sqli
2b370 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28  te3BtreePayload(
2b380 29 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75  ), the caller mu
2b390 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70  st ensure that p
2b3a0 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 0a  Cur is pointing.
2b3b0 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f  ** to a valid ro
2b3c0 77 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  w in the table. 
2b3d0 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65   For sqlite3Btre
2b3e0 65 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28  ePayloadChecked(
2b3f0 29 2c 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ), the.** cursor
2b400 20 6d 69 67 68 74 20 62 65 20 69 6e 76 61 6c 69   might be invali
2b410 64 20 6f 72 20 6d 69 67 68 74 20 6e 65 65 64 20  d or might need 
2b420 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 20 62  to be restored b
2b430 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 61 64  efore being read
2b440 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
2b450 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
2b460 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
2b470 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
2b480 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
2b490 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
2b4a0 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
2b4b0 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
2b4c0 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
2b4d0 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
2b4e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2b4f0 65 65 50 61 79 6c 6f 61 64 28 42 74 43 75 72 73  eePayload(BtCurs
2b500 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
2b510 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
2b520 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73  oid *pBuf){.  as
2b530 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2b540 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2b550 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b560 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2b570 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2b580 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
2b590 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
2b5a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
2b5b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b5c0 3e 69 78 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  >ix<pCur->apPage
2b5d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2b5e0 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e  Cell );.  return
2b5f0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
2b600 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
2b610 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
2b620 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f  *)pBuf, 0);.}../
2b630 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61 6e  *.** This varian
2b640 74 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  t of sqlite3Btre
2b650 65 50 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b 73  ePayload() works
2b660 20 65 76 65 6e 20 69 66 20 74 68 65 20 63 75 72   even if the cur
2b670 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 69  sor has not.** i
2b680 6e 20 74 68 65 20 43 55 52 53 4f 52 5f 56 41 4c  n the CURSOR_VAL
2b690 49 44 20 73 74 61 74 65 2e 20 20 49 74 20 69 73  ID state.  It is
2b6a0 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68   only used by th
2b6b0 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  e sqlite3_blob_r
2b6c0 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  ead().** interfa
2b6d0 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ce..*/.#ifndef S
2b6e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
2b6f0 4c 4f 42 0a 73 74 61 74 69 63 20 53 51 4c 49 54  LOB.static SQLIT
2b700 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 61  E_NOINLINE int a
2b710 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63  ccessPayloadChec
2b720 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
2b730 2a 70 43 75 72 2c 0a 20 20 75 33 32 20 6f 66 66  *pCur,.  u32 off
2b740 73 65 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c 0a  set,.  u32 amt,.
2b750 20 20 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b 0a    void *pBuf.){.
2b760 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 20 28    int rc;.  if (
2b770 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2b780 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
2b790 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2b7a0 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20 20  TE_ABORT;.  }.  
2b7b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2b7c0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2b7d0 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65   );.  rc = btree
2b7e0 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
2b7f0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 72  ition(pCur);.  r
2b800 65 74 75 72 6e 20 72 63 20 3f 20 72 63 20 3a 20  eturn rc ? rc : 
2b810 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
2b820 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
2b830 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74   pBuf, 0);.}.int
2b840 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
2b850 6c 6f 61 64 43 68 65 63 6b 65 64 28 42 74 43 75  loadChecked(BtCu
2b860 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
2b870 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
2b880 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
2b890 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2b8a0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2b8b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 75  {.    assert( cu
2b8c0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2b8d0 28 70 43 75 72 29 20 29 3b 0a 20 20 20 20 72 65  (pCur) );.    re
2b8e0 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
2b8f0 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
2b900 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a   amt, pBuf, 0);.
2b910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2b920 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
2b930 64 43 68 65 63 6b 65 64 28 70 43 75 72 2c 20 6f  dChecked(pCur, o
2b940 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
2b950 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
2b960 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
2b970 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a  NCRBLOB */../*.*
2b980 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
2b990 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
2b9a0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
2b9b0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
2b9c0 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
2b9d0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
2b9e0 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
2b9f0 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
2ba00 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
2ba10 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65 73   if index btrees
2ba20 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d   (pPage->intKey=
2ba30 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20 64  =0) and is the d
2ba40 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65  ata for.** table
2ba50 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
2ba60 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20  intKey==1). The 
2ba70 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2ba80 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  of available.** 
2ba90 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
2baa0 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  ten into *pAmt. 
2bab0 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
2bac0 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  en the value.** 
2bad0 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
2bae0 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69  t be a valid poi
2baf0 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
2bb00 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
2bb10 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
2bb20 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
2bb30 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
2bb40 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
2bb50 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
2bb60 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
2bb70 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
2bb80 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
2bb90 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
2bba0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
2bbb0 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
2bbc0 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
2bbd0 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
2bbe0 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
2bbf0 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
2bc00 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
2bc10 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
2bc20 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50  es, then accessP
2bc30 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65  ayload() must be
2bc40 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d   used to reassem
2bc50 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64  ble.** the key/d
2bc60 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20  ata and copy it 
2bc70 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
2bc80 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  ted buffer..**.*
2bc90 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
2bca0 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72  turned by this r
2bcb0 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72  outine looks dir
2bcc0 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63  ectly into the c
2bcd0 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66  ached.** page of
2bce0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2bcf0 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63  The data might c
2bd00 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68  hange or move th
2bd10 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61  e next time.** a
2bd20 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65  ny btree routine
2bd30 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
2bd40 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64  tatic const void
2bd50 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
2bd60 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
2bd70 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
2bd80 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
2bd90 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
2bda0 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20  */.  u32 *pAmt  
2bdb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2bdc0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
2bdd0 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
2bde0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33   here */.){.  u3
2bdf0 32 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28  2 amt;.  assert(
2be00 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
2be10 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
2be20 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2be30 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65  >iPage]);.  asse
2be40 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2be50 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2be60 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2be70 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2be80 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2be90 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2bea0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2beb0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2bec0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2bed0 3e 69 78 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  >ix<pCur->apPage
2bee0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2bef0 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
2bf00 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
2bf10 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ze>0 );.  assert
2bf20 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  ( pCur->info.pPa
2bf30 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61 70 50 61  yload>pCur->apPa
2bf40 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2bf50 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50  >aData || CORRUP
2bf60 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
2bf70 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  ( pCur->info.pPa
2bf80 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61 70 50 61  yload<pCur->apPa
2bf90 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2bfa0 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52  >aDataEnd ||CORR
2bfb0 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d  UPT_DB);.  amt =
2bfc0 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 61 70 50   (int)(pCur->apP
2bfd0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2bfe0 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75  ->aDataEnd - pCu
2bff0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
2c000 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
2c010 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29  nfo.nLocal<amt )
2c020 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66   amt = pCur->inf
2c030 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d  o.nLocal;.  *pAm
2c040 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65 74 75 72  t = amt;.  retur
2c050 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69  n (void*)pCur->i
2c060 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a  nfo.pPayload;.}.
2c070 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
2c080 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
2c090 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20  r pCur is point 
2c0a0 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a  to, return as.**
2c0b0 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74   many bytes of t
2c0c0 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61  he key or data a
2c0d0 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
2c0e0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20  on the local.** 
2c0f0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72  b-tree page.  Wr
2c100 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
2c110 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
2c120 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a  s into *pAmt..**
2c130 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
2c140 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65  returned is ephe
2c150 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f  meral.  The key/
2c160 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a  data may move.**
2c170 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64   or be destroyed
2c180 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c   on the next cal
2c190 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72  l to any Btree r
2c1a0 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75  outine,.** inclu
2c1b0 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20  ding calls from 
2c1c0 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67  other threads ag
2c1d0 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63  ainst the same c
2c1e0 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  ache..** Hence, 
2c1f0 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
2c200 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62  tShared should b
2c210 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20  e held prior to 
2c220 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20  calling.** this 
2c230 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
2c240 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73  hese routines is
2c250 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69   used to get qui
2c260 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79  ck access to key
2c270 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20   and data.** in 
2c280 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
2c290 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  where no overflo
2c2a0 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64  w pages are used
2c2b0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
2c2c0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79  *sqlite3BtreePay
2c2d0 6c 6f 61 64 46 65 74 63 68 28 42 74 43 75 72 73  loadFetch(BtCurs
2c2e0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
2c2f0 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
2c300 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
2c310 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , pAmt);.}.../*.
2c320 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2c330 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
2c340 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
2c350 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
2c360 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
2c370 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2c380 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
2c390 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ve to..**.** Thi
2c3a0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2c3b0 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
2c3c0 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65  T if the page-he
2c3d0 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64  ader flags field
2c3e0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63   of.** the new c
2c3f0 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e  hild page does n
2c400 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61  ot match the fla
2c410 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  gs field of the 
2c420 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20  parent (i.e..** 
2c430 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67  if an intkey pag
2c440 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
2c450 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20  the parent of a 
2c460 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c  non-intkey page,
2c470 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73   or.** vice-vers
2c480 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  a)..*/.static in
2c490 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
2c4a0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
2c4b0 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74  2 newPgno){.  Bt
2c4c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
2c4d0 75 72 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72  ur->pBt;.  int r
2c4e0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
2c4f0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2c500 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2c510 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2c520 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2c530 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2c540 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52  ->iPage<BTCURSOR
2c550 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20  _MAX_DEPTH );.  
2c560 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
2c570 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  age>=0 );.  if( 
2c580 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54  pCur->iPage>=(BT
2c590 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
2c5a0 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
2c5b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2c5c0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75  _BKPT;.  }.  pCu
2c5d0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2c5e0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2c5f0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
2c600 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2c610 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d  idOvfl);.  pCur-
2c620 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2c630 67 65 2b 2b 5d 20 3d 20 70 43 75 72 2d 3e 69 78  ge++] = pCur->ix
2c640 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30  ;.  pCur->ix = 0
2c650 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  ;.  rc = getAndI
2c660 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77  nitPage(pBt, new
2c670 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 61 70 50  Pgno, &pCur->apP
2c680 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2c690 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c6a0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2c 20            pCur, 
2c6b0 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
2c6c0 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ags);.  if( rc==
2c6d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c6e0 20 73 65 74 4d 65 6d 70 61 67 65 52 6f 6f 74 28   setMempageRoot(
2c6f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2c700 72 2d 3e 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  r->iPage], pCur-
2c710 3e 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 7d 0a  >pgnoRoot);.  }.
2c720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c730 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2c740 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70  BUG./*.** Page p
2c750 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74  Parent is an int
2c760 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29  ernal (non-leaf)
2c770 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73   tree page. This
2c780 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73   function .** as
2c790 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20  serts that page 
2c7a0 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
2c7b0 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20   the left-child 
2c7c0 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a  if the iIdx'th.*
2c7d0 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70  * cell in page p
2c7e0 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69  Parent. Or, if i
2c7f0 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Idx is equal to 
2c800 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
2c810 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20   of.** cells in 
2c820 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61  pParent, that pa
2c830 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
2c840 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
2c850 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61  ild of.** the pa
2c860 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
2c870 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  id assertParentI
2c880 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50  ndex(MemPage *pP
2c890 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c  arent, int iIdx,
2c8a0 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20   Pgno iChild){. 
2c8b0 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20   if( CORRUPT_DB 
2c8c0 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
2c8d0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73  e conditions tes
2c8e0 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20  ted below might 
2c8f0 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20 20 20  not be true.    
2c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c910 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20          ** in a 
2c920 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
2c930 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49   */.  assert( iI
2c940 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx<=pParent->nCe
2c950 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78  ll );.  if( iIdx
2c960 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
2c970 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2c980 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
2c990 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
2c9a0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
2c9b0 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c  =iChild );.  }el
2c9c0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2c9d0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2c9e0 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29  l(pParent, iIdx)
2c9f0 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
2ca00 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  .}.#else.#  defi
2ca10 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  ne assertParentI
2ca20 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e  ndex(x,y,z) .#en
2ca30 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
2ca40 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
2ca50 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2ca60 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
2ca70 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
2ca80 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
2ca90 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
2caa0 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
2cab0 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
2cac0 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
2cad0 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
2cae0 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
2caf0 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
2cb00 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
2cb10 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
2cb20 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
2cb30 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
2cb40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76  .static void mov
2cb50 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73  eToParent(BtCurs
2cb60 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
2cb70 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2cb80 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2cb90 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2cba0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2cbb0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2cbc0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
2cbd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2cbe0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2cbf0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
2cc00 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
2cc10 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
2cc20 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
2cc30 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
2cc40 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
2cc50 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  , .    pCur->apP
2cc60 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2cc70 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65  ->pgno.  );.  te
2cc80 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69  stcase( pCur->ai
2cc90 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
2cca0 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67  1] > pCur->apPag
2ccb0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
2ccc0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75  ->nCell );.  pCu
2ccd0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2cce0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2ccf0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
2cd00 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2cd10 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d  idOvfl);.  pCur-
2cd20 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  >ix = pCur->aiId
2cd30 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
2cd40 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e  ;.  releasePageN
2cd50 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50  otNull(pCur->apP
2cd60 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
2cd70 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  -]);.}../*.** Mo
2cd80 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2cd90 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
2cda0 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
2cdb0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2cdc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
2cdd0 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
2cde0 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
2cdf0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2ce00 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
2ce10 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
2ce20 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
2ce30 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
2ce40 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
2ce50 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
2ce60 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
2ce70 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
2ce80 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
2ce90 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
2cea0 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
2ceb0 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
2cec0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
2ced0 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
2cee0 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
2cef0 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
2cf00 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
2cf10 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
2cf20 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
2cf30 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
2cf40 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  LID. Otherwise, 
2cf50 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65  the cursor is se
2cf60 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
2cf70 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20  e first.** cell 
2cf80 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72  located on the r
2cf90 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20  oot (or virtual 
2cfa0 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74  root) page and t
2cfb0 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a  he cursor state.
2cfc0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  ** is set to CUR
2cfd0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
2cfe0 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
2cff0 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  n returns succes
2d000 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62  sfully, it may b
2d010 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
2d020 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65  he.** page-heade
2d030 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65  r flags indicate
2d040 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75   that the [virtu
2d050 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  al] root-page is
2d060 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
2d070 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65  * kind of b-tree
2d080 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77   page (i.e. if w
2d090 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
2d0a0 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65  cursor the calle
2d0b0 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65  r did not.** spe
2d0c0 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73  cify a KeyInfo s
2d0d0 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
2d0e0 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
2d0f0 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a  o 0x05 or 0x0D,.
2d100 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20  ** indicating a 
2d110 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72  table b-tree, or
2d120 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64   if the caller d
2d130 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  id specify a Key
2d140 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75  Info .** structu
2d150 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
2d160 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32  e is set to 0x02
2d170 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61   or 0x0A, indica
2d180 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  ting an index.**
2d190 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61   b-tree)..*/.sta
2d1a0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
2d1b0 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
2d1c0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
2d1d0 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
2d1e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2d1f0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2d200 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2d210 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
2d220 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
2d230 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2d240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
2d250 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
2d260 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2d270 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
2d280 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
2d290 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2d2a0 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
2d2b0 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
2d2c0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
2d2d0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
2d2e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2d2f0 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  LT ){.      asse
2d300 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2d310 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
2d320 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
2d330 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
2d340 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
2d350 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
2d360 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
2d370 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
2d380 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
2d390 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
2d3a0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 61 73 73   do{.        ass
2d3b0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
2d3c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21 3d  e[pCur->iPage]!=
2d3d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 );.        rel
2d3e0 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
2d3f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2d400 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20  r->iPage--]);.  
2d410 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72      }while( pCur
2d420 2d 3e 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->iPage);.      
2d430 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b 0a  goto skip_init;.
2d440 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2d450 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2d460 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
2d470 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2d480 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
2d490 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d4a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
2d4b0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
2d4c0 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 72 63  ==(-1) );.    rc
2d4d0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
2d4e0 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
2d4f0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
2d500 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
2d510 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  ge[0],.         
2d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2d530 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  , pCur->curPager
2d540 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
2d550 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d560 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2d570 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2d580 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 72 65 74  ALID;.       ret
2d590 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2d5a0 20 20 73 65 74 4d 65 6d 70 61 67 65 52 6f 6f 74    setMempageRoot
2d5b0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  (pCur->apPage[0]
2d5c0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2d5d0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61  );.    pCur->iPa
2d5e0 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ge = 0;.    pCur
2d5f0 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43  ->curIntKey = pC
2d600 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
2d610 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f  ntKey;.  }.  pRo
2d620 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ot = pCur->apPag
2d630 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e[0];.  assert( 
2d640 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75  pRoot->pgno==pCu
2d650 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a  r->pgnoRoot );..
2d660 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b    /* If pCur->pK
2d670 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55  eyInfo is not NU
2d680 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  LL, then the cal
2d690 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20  ler that opened 
2d6a0 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a  this cursor.  **
2d6b0 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65   expected to ope
2d6c0 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78  n it on an index
2d6d0 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
2d6e0 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20  se, if pKeyInfo 
2d6f0 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68  is.  ** NULL, th
2d700 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73  e caller expects
2d710 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e   a table b-tree.
2d720 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
2d730 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72  the case,.  ** r
2d740 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
2d750 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a  CORRUPT error. .
2d760 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65    **.  ** Earlie
2d770 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
2d780 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61  Lite assumed tha
2d790 74 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c  t this test coul
2d7a0 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20  d not fail.  ** 
2d7b0 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  if the root page
2d7c0 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61   was already loa
2d7d0 64 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  ded when this fu
2d7e0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
2d7f0 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20  d (i.e..  ** if 
2d800 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e  pCur->iPage>=0).
2d810 20 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74   But this is not
2d820 20 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62   so if the datab
2d830 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ase is corrupted
2d840 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61   .  ** in such a
2d850 20 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70   way that page p
2d860 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69  Root is linked i
2d870 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74  nto a second b-t
2d880 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20  ree table .  ** 
2d890 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74  (or the freelist
2d8a0 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
2d8b0 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
2d8c0 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  1 || pRoot->intK
2d8d0 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ey==0 );.  if( p
2d8e0 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  Root->isInit==0 
2d8f0 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  || (pCur->pKeyIn
2d900 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69  fo==0)!=pRoot->i
2d910 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
2d920 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2d930 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 73 6b  PT_BKPT;.  }..sk
2d940 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20 70 43 75  ip_init:  .  pCu
2d950 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43 75  r->ix = 0;.  pCu
2d960 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2d970 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2d980 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
2d990 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Last|BTCF_ValidN
2d9a0 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2d9b0 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d 20  fl);..  pRoot = 
2d9c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
2d9d0 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
2d9e0 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  ell>0 ){.    pCu
2d9f0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2da00 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
2da10 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65  e if( !pRoot->le
2da20 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
2da30 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20  ubpage;.    if( 
2da40 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  pRoot->pgno!=1 )
2da50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2da60 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2da70 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
2da80 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
2da90 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
2daa0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
2dab0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2dac0 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
2dad0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2dae0 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
2daf0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
2db00 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2db10 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20  _INVALID;.  }.  
2db20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2db30 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2db40 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
2db50 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
2db60 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2db70 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
2db80 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
2db90 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
2dba0 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
2dbb0 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
2dbc0 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
2dbd0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
2dbe0 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
2dbf0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
2dc00 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
2dc10 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
2dc20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
2dc30 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
2dc40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
2dc50 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2dc60 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2dc70 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2dc80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2dc90 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2dca0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
2dcb0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2dcc0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
2dcd0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2dce0 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
2dcf0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2dd00 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e  pCur->ix<pPage->
2dd10 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
2dd20 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
2dd30 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
2dd40 72 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20  r->ix));.    rc 
2dd50 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2dd60 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
2dd70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2dd80 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
2dd90 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
2dda0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
2ddb0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2ddc0 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
2ddd0 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
2dde0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
2ddf0 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
2de00 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
2de10 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
2de20 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
2de30 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
2de40 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
2de50 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
2de60 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2de70 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
2de80 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
2de90 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
2dea0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2deb0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
2dec0 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
2ded0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
2dee0 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
2def0 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
2df00 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
2df10 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
2df20 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2df30 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
2df40 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
2df50 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
2df60 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
2df70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
2df80 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
2df90 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2dfa0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2dfb0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2dfc0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2dfd0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2dfe0 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
2dff0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2e000 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
2e010 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
2e020 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2e030 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2e040 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2e050 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61    pCur->ix = pPa
2e060 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
2e070 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2e080 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
2e090 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2e0a0 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
2e0b0 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  >ix = pPage->nCe
2e0c0 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ll-1;.  assert( 
2e0d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2e0e0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2e0f0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2e100 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
2e110 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  y)==0 );.  retur
2e120 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2e130 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2e140 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
2e150 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2e160 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
2e170 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
2e180 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
2e190 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
2e1a0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
2e1b0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
2e1c0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
2e1d0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
2e1e0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2e1f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
2e200 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
2e210 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2e220 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
2e230 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2e240 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2e250 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2e260 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2e270 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2e280 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
2e290 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2e2a0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2e2b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2e2c0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2e2d0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
2e2e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2e2f0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2e300 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2e310 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2e320 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2e330 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2e340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2e350 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2e360 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2e370 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2e380 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2e390 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
2e3a0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2e3b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2e3c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
2e3d0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2e3e0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2e3f0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2e400 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
2e410 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
2e420 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
2e430 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
2e440 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
2e450 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
2e460 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
2e470 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2e480 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2e490 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
2e4a0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2e4b0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2e4c0 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
2e4d0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2e4e0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2e4f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2e500 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2e510 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2e520 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2e530 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
2e540 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
2e550 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
2e560 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
2e570 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
2e580 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
2e590 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2e5a0 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2e5b0 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
2e5c0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
2e5d0 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
2e5e0 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
2e5f0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
2e600 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
2e610 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
2e620 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2e630 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
2e640 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
2e650 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
2e660 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
2e670 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2e680 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
2e690 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
2e6a0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
2e6b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2e6c0 69 78 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  ix==pCur->apPage
2e6d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2e6e0 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73  Cell-1 );.    as
2e6f0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2e700 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2e710 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a  >leaf );.#endif.
2e720 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e730 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
2e740 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2e750 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2e760 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2e770 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
2e780 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2e790 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2e7a0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2e7b0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2e7c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2e7d0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2e7e0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2e7f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2e800 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2e810 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2e820 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
2e830 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
2e840 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2e850 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66  (pCur);.      if
2e860 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e870 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2e880 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2e890 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
2e8a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2e8b0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2e8c0 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20   ~BTCF_AtLast;. 
2e8d0 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d       }.   .    }
2e8e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2e8f0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
2e900 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
2e910 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
2e920 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
2e930 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
2e940 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
2e950 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
2e960 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
2e970 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
2e980 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
2e990 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
2e9a0 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
2e9b0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
2e9c0 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
2e9d0 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
2e9e0 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
2e9f0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
2ea00 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
2ea10 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
2ea20 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
2ea30 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
2ea40 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
2ea50 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
2ea60 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
2ea70 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
2ea80 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
2ea90 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
2eaa0 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
2eab0 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
2eac0 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
2ead0 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
2eae0 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
2eaf0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
2eb00 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
2eb10 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
2eb20 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
2eb30 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
2eb40 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
2eb50 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
2eb60 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
2eb70 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
2eb80 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
2eb90 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
2eba0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
2ebb0 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
2ebc0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
2ebd0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2ebe0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
2ebf0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
2ec00 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
2ec10 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
2ec20 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2ec30 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
2ec40 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
2ec50 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
2ec60 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
2ec70 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
2ec80 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
2ec90 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2eca0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2ecb0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2ecc0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2ecd0 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
2ece0 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
2ecf0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
2ed00 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
2ed10 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2ed20 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2ed30 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2ed40 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
2ed50 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
2ed60 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
2ed70 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
2ed80 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d 3e 65  , the pIdxKey->e
2ed90 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73 20 73  qSeen field is s
2eda0 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 72 65  et to 1 if there
2edb0 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20 65 6e  .** exists an en
2edc0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2edd0 20 74 68 61 74 20 65 78 61 63 74 6c 79 20 6d 61   that exactly ma
2ede0 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e 20 20  tches pIdxKey.  
2edf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2ee00 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
2ee10 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
2ee20 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
2ee30 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
2ee40 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
2ee50 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
2ee60 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
2ee70 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
2ee80 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
2ee90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2eea0 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
2eeb0 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
2eec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2eed0 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
2eee0 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
2eef0 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
2ef00 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
2ef10 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
2ef20 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
2ef30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2ef40 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  .  RecordCompare
2ef50 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b   xRecordCompare;
2ef60 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2ef70 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2ef80 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2ef90 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2efa0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2efb0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2efc0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20  .  assert( pRes 
2efd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  );.  assert( (pI
2efe0 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
2eff0 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29  ->pKeyInfo==0) )
2f000 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2f010 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2f020 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64 78 4b  _VALID || (pIdxK
2f030 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 63  ey==0)==(pCur->c
2f040 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29 3b 0a  urIntKey!=0) );.
2f050 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
2f060 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
2f070 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65  ositioned at the
2f080 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72   point we are tr
2f090 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76  ying.  ** to mov
2f0a0 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20  e to, then just 
2f0b0 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
2f0c0 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f  oing any work */
2f0d0 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d  .  if( pIdxKey==
2f0e0 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53  0.   && pCur->eS
2f0f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2f100 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  ID && (pCur->cur
2f110 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2f120 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29 7b 0a  idNKey)!=0.  ){.
2f130 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2f140 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
2f150 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2f160 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2f170 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2f180 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
2f190 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
2f1a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
2f1b0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2f1c0 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
2f1d0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
2f1e0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 72   = -1;.        r
2f1f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
2f210 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
2f220 65 64 20 6b 65 79 20 69 73 20 6f 6e 65 20 6d 6f  ed key is one mo
2f230 72 65 20 74 68 61 6e 20 74 68 65 20 70 72 65 76  re than the prev
2f240 69 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e 0a 20  ious key, then. 
2f250 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f 20 67       ** try to g
2f260 65 74 20 74 68 65 72 65 20 75 73 69 6e 67 20 73  et there using s
2f270 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2f280 29 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  ) rather than a 
2f290 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 62 69  full.      ** bi
2f2a0 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20 54 68  nary search.  Th
2f2b0 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
2f2c0 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54 68 65  ation only.  The
2f2d0 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 0a   correct answer.
2f2e0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
2f2f0 6c 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68 6f  l obtained witho
2f300 75 74 20 74 68 69 73 20 61 73 65 2c 20 6f 6e 6c  ut this ase, onl
2f310 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72 65 20  y a little more 
2f320 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20 20 20 20  slowely */.     
2f330 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2f340 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65 79 20 26  nKey+1==intKey &
2f350 26 20 21 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  & !pCur->skipNex
2f360 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  t ){.        *pR
2f370 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
2f380 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2f390 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2f3a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2f3b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2f3c0 20 20 20 20 20 20 20 69 66 28 20 2a 70 52 65 73         if( *pRes
2f3d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2f3e0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
2f3f0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
2f400 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
2f410 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
2f420 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2f430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2f440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2f450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2f460 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65   }..  if( pIdxKe
2f470 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  y ){.    xRecord
2f480 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65  Compare = sqlite
2f490 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65  3VdbeFindCompare
2f4a0 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70  (pIdxKey);.    p
2f4b0 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20  IdxKey->errCode 
2f4c0 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
2f4d0 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2f4e0 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20  t_rc==1 .       
2f4f0 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
2f500 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20  fault_rc==0 .   
2f510 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
2f520 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31  ->default_rc==-1
2f530 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
2f540 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
2f550 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20  are = 0; /* All 
2f560 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72  keys are integer
2f570 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  s */.  }..  rc =
2f580 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2f590 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2f5a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f5b0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
2f5c0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2f5d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2f5e0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
2f5f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2f600 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2f610 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2f620 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29  iPage]->isInit )
2f630 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2f640 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2f650 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
2f660 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2f670 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
2f680 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2f690 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
2f6a0 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65  ALID ){.    *pRe
2f6b0 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  s = -1;.    asse
2f6c0 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2f6d0 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
2f6e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2f6f0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
2f700 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f710 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
2f720 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
2f730 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75  [0]->intKey==pCu
2f740 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a  r->curIntKey );.
2f750 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2f760 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64  curIntKey || pId
2f770 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b  xKey );.  for(;;
2f780 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
2f790 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20  upr, idx, c;.   
2f7a0 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
2f7b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2f7c0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2f7d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2f7e0 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20    u8 *pCell;    
2f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f800 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2f810 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   to current cell
2f820 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20   in pPage */..  
2f830 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c    /* pPage->nCel
2f840 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65  l must be greate
2f850 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20  r than zero. If 
2f860 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74  this is the root
2f870 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65  -page.    ** the
2f880 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61   cursor would ha
2f890 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20  ve been INVALID 
2f8a0 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66  above and this f
2f8b0 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20  or(;;) loop.    
2f8c0 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74  ** not run. If t
2f8d0 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72  his is not the r
2f8e0 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74  oot-page, then t
2f8f0 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29  he moveToChild()
2f900 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
2f910 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  would have alrea
2f920 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63  dy detected db c
2f930 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c  orruption. Simil
2f940 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74  arly, pPage must
2f950 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72  .    ** be the r
2f960 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78  ight kind (index
2f970 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d   or table) of b-
2f980 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72  tree page. Other
2f990 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f  wise.    ** a mo
2f9a0 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d  veToChild() or m
2f9b0 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c  oveToRoot() call
2f9c0 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65   would have dete
2f9d0 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e  cted corruption.
2f9e0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
2f9f0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
2fa00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2fa10 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70  Page->intKey==(p
2fa20 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20  IdxKey==0) );.  
2fa30 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75    lwr = 0;.    u
2fa40 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  pr = pPage->nCel
2fa50 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l-1;.    assert(
2fa60 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c   biasRight==0 ||
2fa70 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b   biasRight==1 );
2fa80 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e  .    idx = upr>>
2fa90 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f  (1-biasRight); /
2faa0 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69 67 68  * idx = biasRigh
2fab0 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75  t ? upr : (lwr+u
2fac0 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43  pr)/2; */.    pC
2fad0 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
2fae0 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f  x;.    if( xReco
2faf0 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a  rdCompare==0 ){.
2fb00 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
2fb10 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c         i64 nCell
2fb20 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65  Key;.        pCe
2fb30 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73  ll = findCellPas
2fb40 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29  tPtr(pPage, idx)
2fb50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
2fb60 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
2fb70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
2fb80 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43  le( 0x80 <= *(pC
2fb90 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20  ell++) ){.      
2fba0 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e        if( pCell>
2fbb0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
2fbc0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2fbd0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2fbe0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fbf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
2fc00 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
2fc10 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
2fc20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2fc30 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
2fc40 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2fc50 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx+1;.          
2fc60 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2fc70 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = -1; break; }.
2fc80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2fc90 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
2fca0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  y ){.          u
2fcb0 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
2fcc0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
2fcd0 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65  r ){ c = +1; bre
2fce0 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
2fcf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2fd00 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d  ssert( nCellKey=
2fd10 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  =intKey );.     
2fd20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20       pCur->ix = 
2fd30 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2fd40 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2fd50 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2fd60 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
2fd70 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2fd80 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2fd90 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  r;.          }el
2fda0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2fdb0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2fdc0 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
2fdd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
2fde0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
2fdf0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
2fe00 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
2fe10 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
2fe20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2fe30 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2fe40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2fe50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2fe60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2fe70 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
2fe80 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
2fe90 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
2fea0 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
2feb0 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20  upr)/2; */.     
2fec0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2fed0 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
2fee0 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20       int nCell; 
2fef0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
2ff00 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79  pCell cell in by
2ff10 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  tes */.        p
2ff20 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2ff30 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2ff40 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  x);..        /* 
2ff50 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
2ff60 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
2ff70 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
2ff80 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
2ff90 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
2ffa0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
2ffb0 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
2ffc0 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
2ffd0 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
2ffe0 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
2fff0 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
30000 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
30010 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
30020 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
30030 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
30040 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
30050 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
30060 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
30070 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
30080 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
30090 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
300a0 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
300b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
300c0 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
300d0 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
300e0 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
300f0 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
30100 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
30110 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
30120 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30130 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
30140 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
30150 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31  ell<=pPage->max1
30160 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20  bytePayload ){. 
30170 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
30180 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
30190 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
301a0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
301b0 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
301c0 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
301d0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
301e0 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
301f0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
30200 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
30210 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
30220 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
30230 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
30240 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
30250 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
30260 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
30270 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
30280 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
30290 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
302a0 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
302b0 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
302c0 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
302d0 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
302e0 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
302f0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
30300 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
30310 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
30320 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
30330 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
30340 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
30350 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
30360 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
30370 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
30380 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
30390 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
303a0 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65  l+nCell+2==pPage
303b0 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
303c0 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
303d0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
303e0 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
303f0 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  2], pIdxKey);.  
30400 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30410 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
30420 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20  cord flows over 
30430 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  onto one or more
30440 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
30450 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   In.          **
30460 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77   this case the w
30470 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20  hole cell needs 
30480 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20  to be parsed, a 
30490 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
304a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
304b0 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  d accessPayload(
304c0 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65  ) used to retrie
304d0 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  ve the record in
304e0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  to the.         
304f0 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72   ** buffer befor
30500 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
30510 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c  are() can be cal
30520 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20  led. .          
30530 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
30540 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
30550 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52   corrupt, the xR
30560 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75  ecordCompare rou
30570 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20  tine may read.  
30580 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f          ** up to
30590 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73   two varints pas
305a0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
305b0 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72   buffer. An extr
305c0 61 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20  a 18 .          
305d0 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  ** bytes of padd
305e0 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ing is allocated
305f0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
30600 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20  he buffer in.   
30610 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
30620 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f  his happens.  */
30630 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
30640 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
30650 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
30660 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
30670 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
30680 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
30690 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
306a0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
306b0 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e  lBody, &pCur->in
306c0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  fo);.          n
306d0 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72  Cell = (int)pCur
306e0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
306f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
30700 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a   nCell<0 );   /*
30710 20 54 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a   True if key siz
30720 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72  e is 2^32 or mor
30730 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  e */.          t
30740 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
30750 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64  0 );  /* Invalid
30760 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30   key size:  0x80
30770 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20   0x80 0x00 */.  
30780 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
30790 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f  ( nCell==1 );  /
307a0 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69  * Invalid key si
307b0 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30  ze:  0x80 0x80 0
307c0 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x01 */.         
307d0 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
307e0 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  ==2 );  /* Minim
307f0 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b  um legal index k
30800 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ey size */.     
30810 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32       if( nCell<2
30820 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30830 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
30840 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
30850 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
30860 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
30870 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30880 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
30890 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b  e3Malloc( nCell+
308a0 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  18 );.          
308b0 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
308c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
308d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
308e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
308f0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
30900 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
30910 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75   }.          pCu
30920 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
30930 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
30940 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
30950 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28  Cur, 0, nCell, (
30960 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
30970 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20  CellKey, 0);.   
30980 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
30990 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56  Flags &= ~BTCF_V
309a0 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20  alidOvfl;.      
309b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
309c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
309d0 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
309e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
309f0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
30a00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30a10 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
30a20 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
30a30 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
30a40 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
30a50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
30a60 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
30a70 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
30a80 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ( .            (
30a90 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
30aa0 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  !=SQLITE_CORRUPT
30ab0 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20   || c==0).      
30ac0 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e     && (pIdxKey->
30ad0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
30ae0 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70  NOMEM || pCur->p
30af0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Btree->db->mallo
30b00 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20  cFailed).       
30b10 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
30b20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c<0 ){.         
30b30 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
30b40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
30b50 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>0 ){.         
30b60 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
30b70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30b80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
30b90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
30ba0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
30bb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
30bc0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
30bd0 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
30be0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
30bf0 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43  f( pIdxKey->errC
30c00 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ode ) rc = SQLIT
30c10 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  E_CORRUPT;.     
30c20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
30c30 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
30c40 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
30c50 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a  wr>upr ) break;.
30c60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30c70 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
30c80 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
30c90 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
30ca0 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20  x = (lwr+upr)/2 
30cb0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
30cc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
30cd0 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67  ==upr+1 || (pPag
30ce0 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
30cf0 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20  age->leaf) );.  
30d00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
30d10 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
30d20 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
30d30 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
30d40 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 61  pCur->ix<pCur->a
30d50 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
30d60 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
30d70 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
30d80 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70  16)idx;.      *p
30d90 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
30da0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
30db0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
30dc0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d  _finish;.    }.m
30dd0 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
30de0 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70  :.    if( lwr>=p
30df0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
30e00 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
30e10 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
30e20 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
30e30 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
30e40 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
30e50 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
30e60 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
30e70 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r));.    }.    p
30e80 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 6c  Cur->ix = (u16)l
30e90 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  wr;.    rc = mov
30ea0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
30eb0 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
30ec0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  rc ) break;.  }.
30ed0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
30ee0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
30ef0 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  e = 0;.  assert(
30f00 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
30f10 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
30f20 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  l)==0 );.  retur
30f30 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
30f40 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
30f50 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
30f60 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
30f70 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
30f80 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77  le..**.** TRUE w
30f90 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
30fa0 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
30fb0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
30fc0 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74  () moves.** past
30fd0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
30fe0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  in the table or 
30ff0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
31000 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a  () moves past.**
31010 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
31020 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20  .  TRUE is also 
31030 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
31040 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
31050 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
31060 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20  reeEof(BtCursor 
31070 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
31080 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63  O: What if the c
31090 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53  ursor is in CURS
310a0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62  OR_REQUIRESEEK b
310b0 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74  ut all table ent
310c0 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62  ries.  ** have b
310d0 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69  een deleted? Thi
310e0 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20  s API will need 
310f0 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74  to change to ret
31100 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
31110 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61  e.  ** as well a
31120 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  s the boolean re
31130 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f  sult value..  */
31140 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f  .  return (CURSO
31150 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65  R_VALID!=pCur->e
31160 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
31170 20 52 65 74 75 72 6e 20 61 6e 20 65 73 74 69 6d   Return an estim
31180 61 74 65 20 66 6f 72 20 74 68 65 20 6e 75 6d 62  ate for the numb
31190 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
311a0 65 20 74 61 62 6c 65 20 74 68 61 74 20 70 43 75  e table that pCu
311b0 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  r is.** pointing
311c0 20 74 6f 2e 20 20 52 65 74 75 72 6e 20 61 20 6e   to.  Return a n
311d0 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
311e0 66 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 69 73  f no estimate is
311f0 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 61   currently .** a
31200 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34  vailable..*/.i64
31210 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 77   sqlite3BtreeRow
31220 43 6f 75 6e 74 45 73 74 28 42 74 43 75 72 73 6f  CountEst(BtCurso
31230 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 36 34 20  r *pCur){.  i64 
31240 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61 73  n;.  u8 i;..  as
31250 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
31260 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
31270 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
31280 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
31290 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
312a0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
312b0 20 43 75 72 72 65 6e 74 6c 79 20 74 68 69 73 20   Currently this 
312c0 69 6e 74 65 72 66 61 63 65 20 69 73 20 6f 6e 6c  interface is onl
312d0 79 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  y called by the 
312e0 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20 2a  OP_IfSmaller.  *
312f0 2a 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69 74  * opcode, and it
31300 20 74 68 61 74 20 63 61 73 65 20 74 68 65 20 63   that case the c
31310 75 72 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61 79  ursor will alway
31320 73 20 62 65 20 76 61 6c 69 64 20 61 6e 64 0a 20  s be valid and. 
31330 20 2a 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73 20   ** will always 
31340 70 6f 69 6e 74 20 74 6f 20 61 20 6c 65 61 66 20  point to a leaf 
31350 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  node. */.  if( N
31360 45 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74  EVER(pCur->eStat
31370 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e!=CURSOR_VALID)
31380 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
31390 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e  if( NEVER(pCur->
313a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
313b0 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 29 20 29 20  ge]->leaf==0) ) 
313c0 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 66 6f  return -1;..  fo
313d0 72 28 6e 3d 31 2c 20 69 3d 30 3b 20 69 3c 3d 70  r(n=1, i=0; i<=p
313e0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
313f0 7b 0a 20 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d  {.    n *= pCur-
31400 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c  >apPage[i]->nCel
31410 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  l;.  }.  return 
31420 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  n;.}../*.** Adva
31430 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
31440 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
31450 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
31460 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
31470 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
31480 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
31490 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
314a0 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
314b0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
314c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
314d0 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
314e0 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
314f0 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
31500 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  =1..**.** The ma
31510 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69  in entry point i
31520 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  s sqlite3BtreeNe
31530 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  xt().  That rout
31540 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
31550 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
31560 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
31570 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74  y incrementing t
31580 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
31590 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
315a0 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65  * to the next ce
315b0 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
315c0 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
315d0 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78 74 28  ower) btreeNext(
315e0 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74  ) helper.** rout
315f0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
31600 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
31610 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
31620 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f  different page o
31630 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20  r.** to restore 
31640 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
31650 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
31660 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20  nction will set 
31670 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e  *pRes to 0 or 1.
31680 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70    The initial *p
31690 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c  Res value.** wil
316a0 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75  l be 1 if the cu
316b0 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70  rsor being stepp
316c0 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ed corresponds t
316d0 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
316e0 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f  nd.** if this ro
316f0 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
31700 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
31710 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20   that SQL index 
31720 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e  had been.** a un
31730 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68  ique index.  Oth
31740 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65  erwise the calle
31750 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20  r will have set 
31760 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pRes to zero..*
31770 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f  * Zero is the co
31780 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62  mmon case. The b
31790 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
317a0 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75  ion is free to u
317b0 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61  se the.** initia
317c0 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73  l *pRes value as
317d0 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f   a hint to impro
317e0 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20  ve performance, 
317f0 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  but the current.
31800 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ** SQLite btree 
31810 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
31820 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74  oes not. (Note t
31830 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62  hat the comdb2 b
31840 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tree.** implemen
31850 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20  tation does use 
31860 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76  this hint, howev
31870 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53  er.).*/.static S
31880 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
31890 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43  nt btreeNext(BtC
318a0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
318b0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
318c0 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
318d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
318e0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
318f0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
31900 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
31910 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
31920 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
31930 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
31940 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
31950 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Res==0 );.  if( 
31960 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
31970 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
31980 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
31990 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
319a0 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
319b0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f  ;.    rc = resto
319c0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
319d0 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
319e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
319f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
31a00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31a10 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
31a20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
31a30 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
31a40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
31a50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
31a60 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
31a70 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61  pNext ){.      a
31a80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
31a90 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
31aa0 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
31ab0 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
31ac0 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  XT );.      pCur
31ad0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
31ae0 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69  R_VALID;.      i
31af0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
31b00 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  t>0 ){.        p
31b10 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
31b20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
31b30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
31b40 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
31b50 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
31b60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
31b70 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
31b80 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
31b90 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 69   idx = ++pCur->i
31ba0 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  x;.  assert( pPa
31bb0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20  ge->isInit );.. 
31bc0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
31bd0 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  ase file is corr
31be0 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69  upt, it is possi
31bf0 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ble for the valu
31c00 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74  e of idx .  ** t
31c10 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72  o be invalid her
31c20 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
31c30 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f   occur if a seco
31c40 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69  nd cursor modifi
31c50 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  es.  ** the page
31c60 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43   while cursor pC
31c70 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  ur is holding a 
31c80 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e  reference to it.
31c90 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20   Which can.  ** 
31ca0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74  only happen if t
31cb0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
31cc0 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61  orrupt in such a
31cd0 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20   way as to link 
31ce0 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  the.  ** page in
31cf0 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  to more than one
31d00 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
31d10 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  e. */.  testcase
31d20 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65  ( idx>pPage->nCe
31d30 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78  ll );..  if( idx
31d40 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
31d50 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
31d60 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
31d70 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
31d80 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
31d90 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
31da0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
31db0 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
31dc0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
31dd0 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65       return move
31de0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
31df0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
31e00 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
31e10 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
31e20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
31e30 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
31e40 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
31e50 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
31e60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31e70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
31e80 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
31e90 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
31ea0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
31eb0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d  r->iPage];.    }
31ec0 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3e  while( pCur->ix>
31ed0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
31ee0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
31ef0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
31f00 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74  return sqlite3Bt
31f10 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
31f20 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
31f30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
31f40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
31f50 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
31f60 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
31f70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
31f80 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
31f90 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
31fa0 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74  pCur);.  }.}.int
31fb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
31fc0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
31fd0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
31fe0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
31ff0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
32000 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
32010 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
32020 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRes!=0 );.  ass
32030 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c  ert( *pRes==0 ||
32040 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61   *pRes==1 );.  a
32050 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
32060 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
32070 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
32080 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72  _VALID );.  pCur
32090 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
320a0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
320b0 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
320c0 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
320d0 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20  dOvfl);.  *pRes 
320e0 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
320f0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
32100 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62  VALID ) return b
32110 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
32120 52 65 73 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  Res);.  pPage = 
32130 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
32140 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28  r->iPage];.  if(
32150 20 28 2b 2b 70 43 75 72 2d 3e 69 78 29 3e 3d 70   (++pCur->ix)>=p
32160 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
32170 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20     pCur->ix--;. 
32180 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e     return btreeN
32190 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
321a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
321b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
321c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
321d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
321e0 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
321f0 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
32200 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
32210 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
32220 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
32230 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
32240 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
32250 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
32260 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
32270 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
32280 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
32290 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
322a0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
322b0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
322c0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
322d0 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
322e0 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a  set *pRes=1..**.
322f0 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
32300 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
32310 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
32320 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65  ).  That routine
32330 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a   is optimized.**
32340 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
32350 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64  case of merely d
32360 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ecrementing the 
32370 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43  cell counter BtC
32380 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74  ursor.aiIdx.** t
32390 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  o the previous c
323a0 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65  ell on the curre
323b0 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73  nt page.  The (s
323c0 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76  lower) btreePrev
323d0 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72  ious().** helper
323e0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
323f0 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65  ed when it is ne
32400 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20  cessary to move 
32410 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
32420 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73  age.** or to res
32430 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e  tore the cursor.
32440 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  .**.** The calli
32450 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  ng function will
32460 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   set *pRes to 0 
32470 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69  or 1.  The initi
32480 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a  al *pRes value.*
32490 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74  * will be 1 if t
324a0 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20  he cursor being 
324b0 73 74 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f  stepped correspo
324c0 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e  nds to an SQL in
324d0 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68  dex and.** if th
324e0 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64  is routine could
324f0 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70   have been skipp
32500 65 64 20 69 66 20 74 68 61 74 20 53 51 4c 20 69  ed if that SQL i
32510 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a  ndex had been.**
32520 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e   a unique index.
32530 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20    Otherwise the 
32540 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65  caller will have
32550 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65   set *pRes to ze
32560 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74  ro..** Zero is t
32570 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20  he common case. 
32580 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  The btree implem
32590 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65  entation is free
325a0 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69   to use the.** i
325b0 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
325c0 75 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20  ue as a hint to 
325d0 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61  improve performa
325e0 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63 75 72  nce, but the cur
325f0 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62  rent.** SQLite b
32600 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
32610 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e  ion does not. (N
32620 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ote that the com
32630 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70  db2 btree.** imp
32640 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
32650 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20   use this hint, 
32660 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61  however.).*/.sta
32670 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
32680 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72 65  INE int btreePre
32690 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
326a0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
326b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
326c0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
326d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
326e0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
326f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
32700 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
32710 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a  rt( *pRes==0 );.
32720 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
32730 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
32740 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
32750 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
32760 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
32770 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41  rFlags & (BTCF_A
32780 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
32790 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Ovfl|BTCF_ValidN
327a0 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  Key))==0 );.  as
327b0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
327c0 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69  .nSize==0 );.  i
327d0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
327e0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
327f0 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
32800 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
32810 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
32820 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32830 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
32840 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
32850 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
32860 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
32870 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
32880 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
32890 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
328a0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
328b0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
328c0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
328d0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
328e0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
328f0 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
32900 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
32910 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
32920 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
32930 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
32940 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  <0 ){.        pC
32950 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
32960 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
32970 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
32980 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
32990 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
329a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
329b0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
329c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
329d0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
329e0 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21  sInit );.  if( !
329f0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
32a00 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
32a10 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d 20  r->ix;.    rc = 
32a20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
32a30 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  , get4byte(findC
32a40 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29  ell(pPage, idx))
32a50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
32a60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
32a70 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
32a80 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
32a90 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
32aa0 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20  Cur->ix==0 ){.  
32ab0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
32ac0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
32ad0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
32ae0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
32af0 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
32b00 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
32b10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
32b20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
32b30 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
32b40 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
32b50 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
32b60 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ze==0 );.    ass
32b70 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
32b80 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c  lags & (BTCF_Val
32b90 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a  idOvfl))==0 );..
32ba0 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a      pCur->ix--;.
32bb0 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
32bc0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
32bd0 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70  Page];.    if( p
32be0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
32bf0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
32c00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32c10 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
32c20 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
32c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
32c40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
32c50 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
32c60 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
32c70 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
32c80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
32c90 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 61 73  int *pRes){.  as
32ca0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
32cb0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
32cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
32cd0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
32ce0 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52   *pRes==0 || *pR
32cf0 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  es==1 );.  asser
32d00 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
32d10 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
32d20 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
32d30 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20  ID );.  *pRes = 
32d40 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
32d50 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
32d60 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
32d70 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
32d80 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ey);.  pCur->inf
32d90 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69  o.nSize = 0;.  i
32da0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
32db0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20  =CURSOR_VALID.  
32dc0 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d 3d 30 0a   || pCur->ix==0.
32dd0 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61     || pCur->apPa
32de0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
32df0 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20  >leaf==0.  ){.  
32e00 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72    return btreePr
32e10 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
32e20 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  s);.  }.  pCur->
32e30 69 78 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53  ix--;.  return S
32e40 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
32e50 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
32e60 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
32e70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
32e80 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
32e90 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
32ea0 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
32eb0 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
32ec0 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
32ed0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
32ee0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
32ef0 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
32f00 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
32f10 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
32f20 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
32f30 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
32f40 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
32f50 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
32f60 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
32f70 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
32f80 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
32f90 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
32fa0 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
32fb0 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
32fc0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
32fd0 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
32fe0 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73  ror.  *ppPage is
32ff0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20   set to NULL in 
33000 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
33010 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
33020 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
33030 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
33040 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20   then an effort 
33050 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
33060 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
33070 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
33080 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
33090 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
330a0 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
330b0 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
330c0 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
330d0 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
330e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
330f0 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
33100 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
33110 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
33120 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
33130 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  e eMode paramete
33140 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41  r is BTALLOC_EXA
33150 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62  CT and the nearb
33160 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a  y page exists.**
33170 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
33180 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
33190 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
331a0 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
331b0 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69  .  If.** eMode i
331c0 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65  s BTALLOC_LT the
331d0 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72  n the page retur
331e0 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73  ned will be less
331f0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
33200 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61  * to nearby if a
33210 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69  ny such page exi
33220 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69  sts.  If eMode i
33230 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68  s BTALLOC_ANY th
33240 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  en there.** are 
33250 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  no restrictions 
33260 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73  on which page is
33270 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
33280 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
33290 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
332a0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
332b0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
332c0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
332d0 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a  *ppPage,      /*
332e0 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74   Store pointer t
332f0 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
33300 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50  page here */.  P
33310 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20  gno *pPgno,     
33320 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
33330 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68  he page number h
33340 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  ere */.  Pgno ne
33350 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20  arby,           
33360 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  /* Search for a 
33370 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f  page near this o
33380 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65  ne */.  u8 eMode
33390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
333a0 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c  * BTALLOC_EXACT,
333b0 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20   BTALLOC_LT, or 
333c0 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29  BTALLOC_ANY */.)
333d0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
333e0 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
333f0 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
33400 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
33410 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
33420 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
33430 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
33440 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
33450 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
33460 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
33470 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
33480 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
33490 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
334a0 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
334b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
334c0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
334d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
334e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
334f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
33500 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  ert( eMode==BTAL
33510 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72  LOC_ANY || (near
33520 62 79 3e 30 20 26 26 20 52 45 51 55 49 52 45 5f  by>0 && REQUIRE_
33530 50 54 52 4d 41 50 20 29 20 29 3b 0a 20 20 70 50  PTRMAP ) );.  pP
33540 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
33550 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62  e1;.  mxPage = b
33560 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
33570 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  t);.  /* EVIDENC
33580 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32  E-OF: R-05119-02
33590 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62  637 The 4-byte b
335a0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
335b0 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20  r at offset 36. 
335c0 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65   ** stores store
335d0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
335e0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
335f0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a  he freelist. */.
33600 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
33610 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
33620 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  ]);.  testcase( 
33630 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20  n==mxPage-1 );. 
33640 20 69 66 28 20 49 53 43 4f 4e 43 55 52 52 45 4e   if( ISCONCURREN
33650 54 3d 3d 30 20 26 26 20 6e 3e 3d 6d 78 50 61 67  T==0 && n>=mxPag
33660 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
33670 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
33680 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  KPT;.  }..  /* E
33690 6e 73 75 72 65 20 70 61 67 65 20 31 20 69 73 20  nsure page 1 is 
336a0 77 72 69 74 61 62 6c 65 2e 20 54 68 69 73 20 66  writable. This f
336b0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 65 69 74  unction will eit
336c0 68 65 72 20 63 68 61 6e 67 65 20 74 68 65 20 6e  her change the n
336d0 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 70 61  umber.  ** of pa
336e0 67 65 73 20 69 6e 20 74 68 65 20 66 72 65 65 2d  ges in the free-
336f0 6c 69 73 74 20 6f 72 20 74 68 65 20 73 69 7a 65  list or the size
33700 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
33710 20 66 69 6c 65 2e 20 53 69 6e 63 65 20 62 6f 74   file. Since bot
33720 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 73 65 20  h.  ** of these 
33730 6f 70 65 72 61 74 69 6f 6e 73 20 69 6e 76 6f 6c  operations invol
33740 76 65 20 6d 6f 64 69 66 79 69 6e 67 20 70 61 67  ve modifying pag
33750 65 20 31 20 68 65 61 64 65 72 20 66 69 65 6c 64  e 1 header field
33760 73 2c 20 70 61 67 65 20 31 0a 20 20 2a 2a 20 77  s, page 1.  ** w
33770 69 6c 6c 20 64 65 66 69 6e 69 74 65 6c 79 20 62  ill definitely b
33780 65 20 77 72 69 74 74 65 6e 20 62 79 20 74 68 69  e written by thi
33790 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  s transaction. I
337a0 66 20 74 68 69 73 20 69 73 20 61 6e 20 43 4f 4e  f this is an CON
337b0 43 55 52 52 45 4e 54 0a 20 20 2a 2a 20 74 72 61  CURRENT.  ** tra
337c0 6e 73 61 63 74 69 6f 6e 2c 20 65 6e 73 75 72 65  nsaction, ensure
337d0 20 74 68 65 20 42 74 72 65 65 50 74 72 6d 61 70   the BtreePtrmap
337e0 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20 62   structure has b
337f0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20  een allocated.  
33800 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
33810 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
33820 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
33830 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
33840 72 63 3b 0a 0a 20 20 69 66 28 20 6e 3e 30 20 29  rc;..  if( n>0 )
33850 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
33860 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  re pages on the 
33870 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65  freelist.  Reuse
33880 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
33890 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ges. */.    Pgno
338a0 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20   iTrunk;.    u8 
338b0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20  searchList = 0; 
338c0 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  /* If the free-l
338d0 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  ist must be sear
338e0 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79  ched for 'nearby
338f0 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65  ' */.    u32 nSe
33900 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43  arch = 0;   /* C
33910 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
33920 65 72 20 6f 66 20 73 65 61 72 63 68 20 61 74 74  er of search att
33930 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20  empts */.    .  
33940 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42    /* If eMode==B
33950 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
33960 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
33970 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
33980 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
33990 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
339a0 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
339b0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
339c0 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
339d0 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
339e0 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
339f0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
33a00 2f 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d  /.    if( eMode=
33a10 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29  =BTALLOC_EXACT )
33a20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
33a30 49 53 41 55 54 4f 56 41 43 55 55 4d 21 3d 49 53  ISAUTOVACUUM!=IS
33a40 43 4f 4e 43 55 52 52 45 4e 54 20 29 3b 0a 20 20  CONCURRENT );.  
33a50 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
33a60 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  CUUM ){.        
33a70 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61  if( nearby<=mxPa
33a80 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
33a90 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
33aa0 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
33ab0 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  by>0 );.        
33ac0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
33ad0 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
33ae0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
33af0 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
33b00 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
33b10 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
33b20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
33b30 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
33b40 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
33b50 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
33b60 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
33b70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
33b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
33b90 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72  se{.        sear
33ba0 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
33bb0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
33bc0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
33bd0 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61  _LE ){.      sea
33be0 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
33bf0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   }..    /* Decre
33c00 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
33c10 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
33c20 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
33c30 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
33c40 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
33c50 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
33c60 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
33c70 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
33c80 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  */.    put4byte(
33c90 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
33ca0 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
33cb0 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
33cc0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
33cd0 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
33ce0 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
33cf0 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
33d00 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
33d10 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
33d20 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
33d30 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
33d40 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
33d50 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
33d60 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
33d70 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
33d80 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20  LLOC_EXACT).    
33d90 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61  ** or until a pa
33da0 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65  ge less than 'ne
33db0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
33dc0 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
33dd0 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20  _LT).    */.    
33de0 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
33df0 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
33e00 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
33e10 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
33e20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
33e30 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68  R-01506-11053 Th
33e40 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
33e50 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
33e60 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20  unk page.       
33e70 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20   ** is the page 
33e80 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
33e90 78 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  xt freelist trun
33ea0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  k page in the li
33eb0 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  st or.        **
33ec0 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73   zero if this is
33ed0 20 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69   the last freeli
33ee0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a  st trunk page. *
33ef0 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  /.        iTrunk
33f00 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
33f10 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
33f20 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
33f30 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
33f40 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31  ENCE-OF: R-59841
33f50 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74  -13798 The 4-byt
33f60 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
33f70 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
33f80 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  2.        ** sto
33f90 72 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  res the page num
33fa0 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
33fb0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65   page of the fre
33fc0 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69  elist, or zero i
33fd0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
33fe0 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70   freelist is emp
33ff0 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ty. */.        i
34000 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
34010 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
34020 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
34030 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
34040 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
34050 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b        if( iTrunk
34060 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72  >mxPage || nSear
34070 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20  ch++ > n ){.    
34080 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
34090 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
340a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
340b0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
340c0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
340d0 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
340e0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
340f0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
34100 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
34110 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
34120 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
34130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
34140 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30  ssert( pTrunk!=0
34150 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
34160 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21  ( pTrunk->aData!
34170 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45  =0 );.      /* E
34180 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33  VIDENCE-OF: R-13
34190 35 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65  523-04394 The se
341a0 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20  cond integer on 
341b0 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  a freelist trunk
341c0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
341d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
341e0 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65  leaf page pointe
341f0 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f  rs to follow. */
34200 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
34210 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
34220 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
34230 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
34240 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
34250 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
34260 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
34270 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
34280 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
34290 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
342a0 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
342b0 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
342c0 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
342d0 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
342e0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
342f0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
34300 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
34310 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
34320 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
34330 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
34340 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
34350 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
34360 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
34370 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
34380 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
34390 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
343a0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
343b0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
343c0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
343d0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
343e0 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
343f0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
34400 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
34410 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
34420 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
34430 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
34440 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
34450 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
34460 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62  >(u32)(pBt->usab
34470 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b  leSize/4 - 2) ){
34480 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
34490 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
344a0 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
344b0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
344c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
344d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
344e0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
344f0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
34500 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
34510 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
34520 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
34530 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20   searchList .   
34540 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 65 61           && (nea
34550 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28  rby==iTrunk || (
34560 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26  iTrunk<nearby &&
34570 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
34580 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  LE)) .      ){. 
34590 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
345a0 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
345b0 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
345c0 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
345d0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
345e0 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
345f0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
34600 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
34610 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
34620 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
34630 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70  runk;.        *p
34640 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
34650 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
34660 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
34670 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
34680 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
34690 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
346a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
346b0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
346c0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
346d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
346e0 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( k==0 ){.     
346f0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
34700 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
34710 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
34720 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
34730 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
34740 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
34750 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
34760 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
34770 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
34780 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
34790 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
347a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
347b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
347c0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
347d0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
347e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
347f0 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72   memcpy(&pPrevTr
34800 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
34810 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
34820 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
34830 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
34840 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
34850 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
34860 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
34870 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f  caller but it co
34880 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20  ntains .        
34890 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f    ** pointers to
348a0 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65   free-list leave
348b0 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61  s. The first lea
348c0 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e  f becomes a trun
348d0 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  k.          ** p
348e0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
348f0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
34900 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65           MemPage
34910 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20   *pNewTrunk;.   
34920 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77         Pgno iNew
34930 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
34940 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
34950 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8]);.          i
34960 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50  f( iNewTrunk>mxP
34970 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20  age ){ .        
34980 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
34990 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
349a0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
349b0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
349c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
349d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
349e0 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50  ( iNewTrunk==mxP
349f0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  age );.         
34a00 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
34a10 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e  usedPage(pBt, iN
34a20 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
34a30 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
34a40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34a50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
34a60 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
34a70 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
34a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34a90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
34aa0 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
34ab0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
34ac0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
34ad0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34ae0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
34af0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
34b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
34b10 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
34b20 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
34b30 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
34b40 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
34b50 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
34b60 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
34b70 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
34b80 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
34b90 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
34ba0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
34bb0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
34bc0 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
34bd0 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
34be0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
34bf0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
34c00 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
34c10 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
34c20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
34c30 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
34c40 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
34c50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29  age1->pDbPage) )
34c60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ;.            pu
34c70 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
34c80 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
34c90 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
34ca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
34cb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34cc0 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
34cd0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
34ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
34cf0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
34d00 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
34d10 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
34d20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
34d30 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
34d40 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
34d50 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
34d60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
34d70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34d80 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
34d90 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
34da0 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
34db0 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
34dc0 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
34dd0 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
34de0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
34df0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  >0 ){.        /*
34e00 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
34e10 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
34e20 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c  /.        u32 cl
34e30 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
34e40 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
34e50 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
34e60 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
34e70 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
34e80 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b   if( nearby>0 ){
34e90 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69  .          u32 i
34ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
34eb0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
34ec0 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54     if( eMode==BT
34ed0 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20  ALLOC_LE ){.    
34ee0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
34ef0 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
34f00 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20            iPage 
34f10 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
34f20 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20  a[8+i*4]);.     
34f30 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61           if( iPa
34f40 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20  ge<=nearby ){.  
34f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
34f60 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
34f70 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
34f80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
34f90 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
34fa0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
34fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
34fc0 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dist;.         
34fd0 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65     dist = sqlite
34fe0 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79  3AbsInt32(get4by
34ff0 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20  te(&aData[8]) - 
35000 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
35010 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
35020 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
35030 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20         int d2 = 
35040 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
35050 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
35060 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79  8+i*4]) - nearby
35070 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
35080 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a   if( d2<dist ){.
35090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350a0 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
350b0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
350c0 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20  t = d2;.        
350d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
350e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
350f0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
35100 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
35110 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
35120 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65  }..        iPage
35130 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
35140 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29  ta[8+closest*4])
35150 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
35160 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
35170 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
35180 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b   iPage>mxPage ){
35190 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
351a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
351b0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
351c0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
351d0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
351e0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
351f0 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
35200 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
35210 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20  !searchList .   
35220 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d        || (iPage=
35230 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67  =nearby || (iPag
35240 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64  e<nearby && eMod
35250 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20  e==BTALLOC_LE)) 
35260 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
35270 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74        int noCont
35280 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  ent;.          *
35290 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20  pPgno = iPage;. 
352a0 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
352b0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
352c0 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
352d0 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
352e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
352f0 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
35300 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
35310 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
35320 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
35330 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
35340 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ));.          rc
35350 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
35360 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
35370 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
35380 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
35390 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
353a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
353b0 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
353c0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
353d0 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
353e0 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
353f0 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
35400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
35410 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
35420 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
35430 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20      noContent = 
35440 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74  !btreeGetHasCont
35450 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  ent(pBt, *pPgno)
35460 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ? PAGER_GET_NOCO
35470 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20  NTENT : 0;.     
35480 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
35490 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
354a0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
354b0 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
354c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
354d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
354e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
354f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
35500 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
35510 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
35520 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
35530 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
35540 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35550 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
35560 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
35570 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
35580 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
35590 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
355a0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
355b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
355c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
355d0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
355e0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
355f0 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
35600 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
35610 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
35620 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
35630 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
35640 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61   append a new pa
35650 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ge to the.    **
35660 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e   database image.
35670 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
35680 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67  ormally, new pag
35690 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  es allocated by 
356a0 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62  this block can b
356b0 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  e requested from
356c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
356d0 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
356e0 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
356f0 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65  ag set. This pre
35700 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a  vents the pager.
35710 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69      ** from tryi
35720 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70  ng to read the p
35730 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ages content fro
35740 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c  m disk. However,
35750 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   if the.    ** c
35760 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
35770 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72  on has already r
35780 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69  un one or more i
35790 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
357a0 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20  m.    ** steps, 
357b0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65  then the page we
357c0 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c   are about to al
357d0 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61  locate may conta
357e0 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  in content.    *
357f0 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  * that is requir
35800 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
35810 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  of a rollback. I
35820 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a  n this case, do.
35830 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74      ** not set t
35840 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c  he no-content fl
35850 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  ag. This causes 
35860 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61  the pager to loa
35870 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20  d and journal.  
35880 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
35890 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65   page content be
358a0 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67  fore overwriting
358b0 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   it..    **.    
358c0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
358d0 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20   pager will not 
358e0 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74  actually attempt
358f0 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72   to load or jour
35900 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  nal .    ** cont
35910 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65  ent for any page
35920 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65   that really doe
35930 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65  s lie past the e
35940 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
35950 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f  se.    ** file o
35960 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65  n disk. So the e
35970 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c  ffects of disabl
35980 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65  ing the no-conte
35990 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  nt optimization.
359a0 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20      ** here are 
359b0 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73  confined to thos
359c0 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65  e pages that lie
359d0 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64   between the end
359e0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   of the.    ** d
359f0 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e  atabase image an
35a00 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  d the end of the
35a10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
35a20 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62      */.    int b
35a30 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d  NoContent = (0==
35a40 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
35a50 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20  >bDoTruncate))? 
35a60 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
35a70 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d  ENT:0;..    rc =
35a80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
35a90 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
35aa0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
35ab0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
35ac0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
35ad0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ++;.    if( pBt-
35ae0 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
35af0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
35b00 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a   pBt->nPage++;..
35b10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35b20 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
35b30 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
35b40 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
35b50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
35b60 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20  ->nPage) ){.    
35b70 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
35b80 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
35b90 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
35ba0 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
35bb0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
35bc0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
35bd0 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
35be0 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
35bf0 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
35c00 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
35c10 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
35c20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
35c30 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
35c40 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
35c50 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
35c60 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  pPg = 0;.      T
35c70 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
35c80 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
35c90 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
35ca0 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d  p page)\n", pBt-
35cb0 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20  >nPage));.      
35cc0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
35cd0 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge!=PENDING_BYTE
35ce0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
35cf0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
35d00 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
35d10 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50   pBt->nPage, &pP
35d20 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  g, bNoContent);.
35d30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
35d40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35d50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
35d60 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70  agerWrite(pPg->p
35d70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
35d80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
35d90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
35da0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
35db0 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e   rc;.      pBt->
35dc0 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nPage++;.      i
35dd0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
35de0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
35df0 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50  (pBt) ){ pBt->nP
35e00 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23  age++; }.    }.#
35e10 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79  endif.    put4by
35e20 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74  te(28 + (u8*)pBt
35e30 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  ->pPage1->aData,
35e40 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
35e50 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e    *pPgno = pBt->
35e60 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65  nPage;..    asse
35e70 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
35e80 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
35e90 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  t) );.    rc = b
35ea0 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
35eb0 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
35ec0 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e  pPage, bNoConten
35ed0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
35ee0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
35ef0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
35f00 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
35f10 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
35f20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
35f30 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
35f40 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
35f50 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
35f60 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52   0;.    }.    TR
35f70 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
35f80 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
35f90 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
35fa0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
35fb0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
35fc0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
35fd0 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
35fe0 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
35ff0 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
36000 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
36010 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72  vTrunk);.  asser
36020 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
36030 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
36040 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70  PageRefcount((*p
36050 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
36060 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  <=1 );.  assert(
36070 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
36080 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  | (*ppPage)->isI
36090 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  nit==0 );.  retu
360a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
360b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
360c0 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67   used to add pag
360d0 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64  e iPage to the d
360e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65  atabase file fre
360f0 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69  e-list. .** It i
36100 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
36110 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
36120 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66  lready a part of
36130 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
36140 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
36150 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
36160 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
36170 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
36180 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49  s optional..** I
36190 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70  f the caller hap
361a0 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70  pens to have a p
361b0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65  ointer to the Me
361c0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  mPage object .**
361d0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
361e0 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e  o page iPage han
361f0 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  dy, it may pass 
36200 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  it as the second
36210 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65   value. .** Othe
36220 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61  rwise, it may pa
36230 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  ss NULL..**.** I
36240 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  f a pointer to a
36250 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
36260 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
36270 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
36280 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e  ,.** its referen
36290 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20  ce count is not 
362a0 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20  altered by this 
362b0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
362c0 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65  tic int freePage
362d0 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  2(BtShared *pBt,
362e0 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61   MemPage *pMemPa
362f0 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b  ge, Pgno iPage){
36300 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
36310 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
36320 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c         /* Free-l
36330 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
36340 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20  /.  Pgno iTrunk 
36350 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
36360 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
36370 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c  number of free-l
36380 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
36390 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  / .  MemPage *pP
363a0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
363b0 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  e1;      /* Loca
363c0 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  l reference to p
363d0 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61  age 1 */.  MemPa
363e0 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  ge *pPage;      
363f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36400 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65  * Page being fre
36410 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e  ed. May be NULL.
36420 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
36430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
36450 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
36460 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
36470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36480 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
36490 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
364a0 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
364b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
364c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
364d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
364e0 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
364f0 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61  | iPage>1 );.  a
36500 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65  ssert( !pMemPage
36510 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67   || pMemPage->pg
36520 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20  no==iPage );..  
36530 69 66 28 20 69 50 61 67 65 3c 32 20 29 20 72 65  if( iPage<2 ) re
36540 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
36550 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20  UPT_BKPT;.  if( 
36560 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20  pMemPage ){.    
36570 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65  pPage = pMemPage
36580 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
36590 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62  erRef(pPage->pDb
365a0 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Page);.  }else{.
365b0 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65      pPage = btre
365c0 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
365d0 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20   iPage);.  }..  
365e0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
365f0 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74   free page count
36600 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20   on pPage1 */.  
36610 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
36620 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
36630 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
36640 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
36650 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d  e_out;.  nFree =
36660 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
36670 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
36680 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
36690 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46  1->aData[36], nF
366a0 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70  ree+1);..  if( p
366b0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
366c0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
366d0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
366e0 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20  e secure_delete 
366f0 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
36700 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  d, then.    ** a
36710 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72  lways fully over
36720 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
36730 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
36740 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eros..    */.   
36750 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20   if( (!pPage && 
36760 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  ((rc = btreeGetP
36770 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
36780 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20  &pPage, 0))!=0) 
36790 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20  ).     ||       
367a0 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69       ((rc = sqli
367b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
367c0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d  age->pDbPage))!=
367d0 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
367e0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
367f0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  t;.    }.    mem
36800 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
36810 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  , 0, pPage->pBt-
36820 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
36830 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
36840 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
36850 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
36860 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
36870 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
36880 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
36890 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
368a0 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
368b0 20 52 45 51 55 49 52 45 5f 50 54 52 4d 41 50 20   REQUIRE_PTRMAP 
368c0 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ){.    ptrmapPut
368d0 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52  (pBt, iPage, PTR
368e0 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
368f0 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
36900 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
36910 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
36920 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20   Now manipulate 
36930 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62  the actual datab
36940 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74  ase free-list st
36950 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61  ructure. There a
36960 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73  re two.  ** poss
36970 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68  ibilities. If th
36980 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63  e free-list is c
36990 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20  urrently empty, 
369a0 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  or if the first.
369b0 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
369c0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
369d0 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74   is full, then t
369e0 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
369f0 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20  come a.  ** new 
36a00 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
36a10 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
36a20 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   it will become 
36a30 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20  a leaf of the.  
36a40 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ** first trunk p
36a50 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  age in the curre
36a60 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  nt free-list. Th
36a70 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69  is block tests i
36a80 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  f it.  ** is pos
36a90 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
36aa0 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66   page as a new f
36ab0 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20  ree-list leaf.. 
36ac0 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21   */.  if( nFree!
36ad0 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c  =0 ){.    u32 nL
36ae0 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
36af0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
36b00 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65  umber of leaf ce
36b10 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  lls on trunk pag
36b20 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b  e */..    iTrunk
36b30 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
36b40 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
36b50 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
36b60 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
36b70 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
36b80 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
36b90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36ba0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
36bb0 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c  t;.    }..    nL
36bc0 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26  eaf = get4byte(&
36bd0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
36be0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
36bf0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33  Bt->usableSize>3
36c00 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65  2 );.    if( nLe
36c10 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75  af > (u32)pBt->u
36c20 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
36c30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
36c40 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
36c50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  T;.      goto fr
36c60 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
36c70 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  }.    if( nLeaf 
36c80 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  < (u32)pBt->usab
36c90 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
36ca0 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
36cb0 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72   case there is r
36cc0 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  oom on the trunk
36cd0 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20   page to insert 
36ce0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
36cf0 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  * being freed as
36d00 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20   a new leaf..   
36d10 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
36d20 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75  ote that the tru
36d30 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72  nk page is not r
36d40 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c  eally full until
36d50 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20   it contains.   
36d60 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
36d70 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20  /4 - 2 entries, 
36d80 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34  not usableSize/4
36d90 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20   - 8 entries as 
36da0 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  we have.      **
36db0 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65   coded.  But due
36dc0 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
36dd0 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f  or in versions o
36de0 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
36df0 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30  o.      ** 3.6.0
36e00 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  , databases with
36e10 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
36e20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f  pages holding mo
36e30 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  re than.      **
36e40 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
36e50 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62  8 entries will b
36e60 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f  e reported as co
36e70 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72  rrupt.  In order
36e80 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69  .      ** to mai
36e90 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20  ntain backwards 
36ea0 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
36eb0 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  th older version
36ec0 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20  s of SQLite,.   
36ed0 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f     ** we will co
36ee0 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69  ntinue to restri
36ef0 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
36f00 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
36f10 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
36f20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
36f30 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
36f40 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
36f50 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
36f60 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
36f70 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
36f80 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
36f90 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
36fa0 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
36fb0 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
36fc0 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
36fd0 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
36fe0 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
36ff0 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  "..      **.    
37000 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
37010 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20  : R-19920-11576 
37020 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76  However, newer v
37030 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
37040 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a  e still.      **
37050 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65   avoid using the
37060 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69 65   last six entrie
37070 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s in the freelis
37080 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72  t trunk page arr
37090 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ay in.      ** o
370a0 72 64 65 72 20 74 68 61 74 20 64 61 74 61 62 61  rder that databa
370b0 73 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64  se files created
370c0 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f   by newer versio
370d0 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e  ns of SQLite can
370e0 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   be.      ** rea
370f0 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
37100 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20  ons of SQLite.. 
37110 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
37120 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
37130 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
37140 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
37150 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37160 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
37170 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
37180 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a  a[4], nLeaf+1);.
37190 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
371a0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
371b0 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67  8+nLeaf*4], iPag
371c0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
371d0 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62  pPage && (pBt->b
371e0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
371f0 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20  CURE_DELETE)==0 
37200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
37210 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
37220 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
37230 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
37240 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
37250 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  SetHasContent(pB
37260 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  t, iPage);.     
37270 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28   }.      TRACE((
37280 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c  "FREE-PAGE: %d l
37290 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  eaf on trunk pag
372a0 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70  e %d\n",pPage->p
372b0 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  gno,pTrunk->pgno
372c0 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  ));.      goto f
372d0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
372e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
372f0 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f  control flows to
37300 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
37310 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73  n it was not pos
37320 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
37330 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62  .  ** the page b
37340 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
37350 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65  leaf page of the
37360 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
37370 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
37380 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63   ** Possibly bec
37390 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69  ause the free-li
373a0 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20  st is empty, or 
373b0 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  possibly because
373c0 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74   the .  ** first
373d0 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
373e0 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e  ee-list is full.
373f0 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65   Either way, the
37400 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
37410 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f  d.  ** will beco
37420 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74  me the new first
37430 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
37440 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
37450 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d  */.  if( pPage==
37460 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  0 && SQLITE_OK!=
37470 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
37480 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
37490 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20  pPage, 0)) ){.  
374a0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
374b0 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  out;.  }.  rc = 
374c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
374d0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
374e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
374f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
37500 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
37510 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28  .  }.  put4byte(
37520 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
37530 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74  runk);.  put4byt
37540 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
37550 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79  4], 0);.  put4by
37560 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
37570 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20  a[32], iPage);. 
37580 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
37590 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b  GE: %d new trunk
375a0 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20   page replacing 
375b0 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
375c0 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66  no, iTrunk));..f
375d0 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  reepage_out:.  i
375e0 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
375f0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
37600 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  0;.  }.  release
37610 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
37620 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
37630 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  k);.  return rc;
37640 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
37650 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  reePage(MemPage 
37660 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43  *pPage, int *pRC
37670 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d  ){.  if( (*pRC)=
37680 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37690 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67    *pRC = freePag
376a0 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  e2(pPage->pBt, p
376b0 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Page, pPage->pgn
376c0 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
376d0 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
376e0 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
376f0 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
37700 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74 65 20  en Cell.  Write 
37710 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c  the.** local Cel
37720 6c 20 73 69 7a 65 20 28 74 68 65 20 6e 75 6d 62  l size (the numb
37730 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e 20 74  er of bytes on t
37740 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
37750 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76  , omitting.** ov
37760 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e  erflow) into *pn
37770 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
37780 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20  int clearCell(. 
37790 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
377a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
377b0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
377c0 69 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a  ins the Cell */.
377d0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
377e0 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69  *pCell,    /* Fi
377f0 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
37800 43 65 6c 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  Cell */.  CellIn
37810 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
37820 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e 66 6f 72     /* Size infor
37830 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
37840 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74   cell */.){.  Bt
37850 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
37860 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f  age->pBt;.  Pgno
37870 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74   ovflPgno;.  int
37880 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c   rc;.  int nOvfl
37890 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65  ;.  u32 ovflPage
378a0 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
378b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
378c0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
378d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
378e0 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
378f0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
37900 6f 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d  o);.  if( pInfo-
37910 3e 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e  >nLocal==pInfo->
37920 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  nPayload ){.    
37930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
37940 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f  ;  /* No overflo
37950 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  w pages. Return 
37960 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
37970 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
37980 69 66 28 20 70 43 65 6c 6c 2b 70 49 6e 66 6f 2d  if( pCell+pInfo-
37990 3e 6e 53 69 7a 65 2d 31 20 3e 20 70 50 61 67 65  >nSize-1 > pPage
379a0 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d  ->aData+pPage->m
379b0 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72  askPage ){.    r
379c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
379d0 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43  RUPT_BKPT;  /* C
379e0 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74  ell extends past
379f0 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a   end of page */.
37a00 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
37a10 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 20   get4byte(pCell 
37a20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d  + pInfo->nSize -
37a30 20 34 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   4);.  assert( p
37a40 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e  Bt->usableSize >
37a50 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65   4 );.  ovflPage
37a60 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
37a70 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f  leSize - 4;.  nO
37a80 76 66 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50  vfl = (pInfo->nP
37a90 61 79 6c 6f 61 64 20 2d 20 70 49 6e 66 6f 2d 3e  ayload - pInfo->
37aa0 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67  nLocal + ovflPag
37ab0 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50  eSize - 1)/ovflP
37ac0 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
37ad0 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20  t( nOvfl>0 || . 
37ae0 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26     (CORRUPT_DB &
37af0 26 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  & (pInfo->nPaylo
37b00 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  ad + ovflPageSiz
37b10 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29  e)<ovflPageSize)
37b20 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  .  );.  while( n
37b30 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67  Ovfl-- ){.    Pg
37b40 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20  no iNext = 0;.  
37b50 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
37b60 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76   = 0;.    if( ov
37b70 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c  flPgno<2 || ovfl
37b80 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  Pgno>btreePageco
37b90 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
37ba0 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20    /* 0 is not a 
37bb0 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
37bc0 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e  r and page 1 can
37bd0 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20  not be an .     
37be0 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
37bf0 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20  e. Therefore if 
37c00 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61  ovflPgno<2 or pa
37c10 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
37c20 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
37c30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
37c40 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a  st be corrupt. *
37c50 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
37c60 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
37c70 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
37c80 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( nOvfl ){.     
37c90 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
37ca0 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50  wPage(pBt, ovflP
37cb0 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e  gno, &pOvfl, &iN
37cc0 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
37cd0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
37ce0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
37cf0 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66   pOvfl || ((pOvf
37d00 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  l = btreePageLoo
37d10 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  kup(pBt, ovflPgn
37d20 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26  o))!=0) ).     &
37d30 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  & sqlite3PagerPa
37d40 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c  geRefcount(pOvfl
37d50 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20  ->pDbPage)!=1.  
37d60 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68    ){.      /* Th
37d70 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e  ere is no reason
37d80 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75   any cursor shou
37d90 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74  ld have an outst
37da0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
37db0 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e   .      ** to an
37dc0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62   overflow page b
37dd0 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65  elonging to a ce
37de0 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ll that is being
37df0 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64   deleted/updated
37e00 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66  ..      ** So if
37e10 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f   there exists mo
37e20 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65  re than one refe
37e30 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61  rence to this pa
37e40 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20  ge, then it .   
37e50 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72     ** must not r
37e60 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72  eally be an over
37e70 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68  flow page and th
37e80 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
37e90 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20  be corrupt. .   
37ea0 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70     ** It is help
37eb0 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68  ful to detect th
37ec0 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  is before callin
37ed0 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61  g freePage2(), a
37ee0 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65  s .      ** free
37ef0 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f  Page2() may zero
37f00 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
37f10 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c  ts if secure-del
37f20 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20  ete mode is.    
37f30 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66    ** enabled. If
37f40 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27   this 'overflow'
37f50 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f   page happens to
37f60 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20   be a page that 
37f70 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  the.      ** cal
37f80 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67  ler is iterating
37f90 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e   through or usin
37fa0 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  g in some other 
37fb0 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20  way, this.      
37fc0 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65  ** can be proble
37fd0 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  matic..      */.
37fe0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
37ff0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
38000 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
38010 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28   rc = freePage2(
38020 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c  pBt, pOvfl, ovfl
38030 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Pgno);.    }..  
38040 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20    if( pOvfl ){. 
38050 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
38060 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
38070 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
38080 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
38090 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67  n rc;.    ovflPg
380a0 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a  no = iNext;.  }.
380b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
380c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
380d0 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
380e0 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
380f0 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
38100 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
38110 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
38120 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
38130 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
38140 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
38150 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
38160 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
38170 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
38180 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
38190 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
381a0 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
381b0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
381c0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
381d0 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
381e0 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
381f0 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
38200 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
38210 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
38220 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
38230 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
38240 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
38250 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
38260 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
38270 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
38280 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
38290 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
382a0 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
382b0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
382c0 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
382d0 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
382e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
382f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
38300 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
38310 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
38320 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
38330 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
38340 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
38350 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
38360 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
38370 20 42 74 72 65 65 50 61 79 6c 6f 61 64 20 2a 70   BtreePayload *p
38380 58 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 79  X,        /* Pay
38390 6c 6f 61 64 20 77 69 74 68 20 77 68 69 63 68 20  load with which 
383a0 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
383b0 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a   cell */.  int *
383c0 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
383d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
383e0 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
383f0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
38400 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
38410 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
38420 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
38430 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
38440 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
38450 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
38460 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
38470 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
38480 70